Release Preview 20 shared desktop, Android and Sargo updates
Restore Gaia settings and media workflows, extend native network adapters, and align the APK payload. Generate French/English changelogs and website entries from the simplified JSON source. Validation: shared JS and Tundra unit tests; desktop workflows and persistence; signed APK payload parity; Sargo RAM and installed startup with boot readback. Android runtime qualification is recorded separately.
This commit is contained in:
parent
be2cdce823
commit
1311bed5e9
170 changed files with 19698 additions and 2495 deletions
|
|
@ -103,9 +103,10 @@ define(function(require) {
|
|||
* @access public
|
||||
*/
|
||||
_onAppChoose: function pl__onAppChoose(evt) {
|
||||
if (evt.target.dataset && evt.target.dataset.appIndex) {
|
||||
var target = evt.target.closest('[data-app-index]');
|
||||
if (target && this._listRoot.contains(target)) {
|
||||
SettingsService.navigate('appPermissions-details', {
|
||||
app: this._apps[evt.target.dataset.appIndex],
|
||||
app: this._apps[target.dataset.appIndex],
|
||||
permissionsTable: this._permissionTable
|
||||
});
|
||||
}
|
||||
|
|
@ -262,7 +263,7 @@ define(function(require) {
|
|||
* @return {Bool}
|
||||
*/
|
||||
_isExplicitPerm: function pl_isExplicitPerm(perm) {
|
||||
return mozPerms.isExplicit(perm, this._currentApp.manifestURL,
|
||||
return mozPerms && mozPerms.isExplicit(perm, this._currentApp.manifestURL,
|
||||
this._currentApp.origin, false);
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ define(function(require) {
|
|||
* refer to the JSON File Data.
|
||||
*/
|
||||
this._callSupportInfo = null;
|
||||
var url = 'http://support.mozilla.org/products/firefox-os';
|
||||
var url = 'https://vulpes-os.org/';
|
||||
this._elements.userGuide.addEventListener('click', () => {
|
||||
this._elements.userGuide.blur();
|
||||
var activity = new window.MozActivity({
|
||||
|
|
@ -55,7 +55,10 @@ define(function(require) {
|
|||
.then(function loadSupportInfo(data) {
|
||||
this._supportInfo = data;
|
||||
callback(this._supportInfo);
|
||||
}.bind(this));
|
||||
}.bind(this)).catch(function(error) {
|
||||
console.warn('Support information:', error);
|
||||
callback({onlinesupport: {title: 'Vulpes OS', href: 'https://vulpes-os.org/'}, callsupport: []});
|
||||
});
|
||||
},
|
||||
/**
|
||||
* create support url items
|
||||
|
|
@ -103,7 +106,7 @@ define(function(require) {
|
|||
_renderSupportInfo: function support_renderSupportInfo(result) {
|
||||
var onlineSupportInfo = null;
|
||||
var onlineSupportTitle = result['support.onlinesupport.title'];
|
||||
if (onlineSupportTitle !== '') {
|
||||
if (typeof onlineSupportTitle === 'string' && onlineSupportTitle !== '') {
|
||||
onlineSupportInfo = { title: onlineSupportTitle };
|
||||
onlineSupportInfo.href = result['support.onlinesupport.href'];
|
||||
this._setOnlineSupportInfo(onlineSupportInfo);
|
||||
|
|
@ -114,7 +117,7 @@ define(function(require) {
|
|||
// Check to see if we have a title for the first support number.
|
||||
var callSupport1Title = result['support.callsupport1.title'];
|
||||
// If we have a title we'll go ahead and load the href for it too.
|
||||
if (callSupport1Title !== '') {
|
||||
if (typeof callSupport1Title === 'string' && callSupport1Title !== '') {
|
||||
this._callSupportInfo = [
|
||||
{
|
||||
'title': callSupport1Title,
|
||||
|
|
@ -125,7 +128,7 @@ define(function(require) {
|
|||
// Now check to see if we have a title for the second
|
||||
// support number. If we do, we'll load it's href as well.
|
||||
var callSupport2Title = result['support.callsupport2.title'];
|
||||
if (callSupport2Title !== '') {
|
||||
if (typeof callSupport2Title === 'string' && callSupport2Title !== '') {
|
||||
this._callSupportInfo.push({
|
||||
'title': callSupport2Title,
|
||||
'href': result['support.callsupport2.href']
|
||||
|
|
|
|||
|
|
@ -66,8 +66,11 @@ define(function(require) {
|
|||
},
|
||||
|
||||
_bindEvents: function() {
|
||||
this._elements.passcodeInput.onkeypress =
|
||||
this._onPasscodeInputKeypress.bind(this);
|
||||
this._elements.passcodeInput.type = 'password';
|
||||
this._elements.passcodeInput.inputMode = 'numeric';
|
||||
this._elements.passcodeInput.maxLength = 8;
|
||||
this._elements.passcodeInput.oninput =
|
||||
this._onPasscodeInput.bind(this);
|
||||
this._elements.passcodeContainer.onclick =
|
||||
this._onPasscodeContainerClick.bind(this);
|
||||
},
|
||||
|
|
@ -77,37 +80,14 @@ define(function(require) {
|
|||
this._elements.passcodeInput.focus();
|
||||
},
|
||||
|
||||
_onPasscodeInputKeypress: function(evt) {
|
||||
// key code for key strokes from the keypad are 0 (numbers) and 8
|
||||
// (backspace). Filter out the events that are not from the keypad.
|
||||
var keyCode = evt.keyCode;
|
||||
if (keyCode !== 0 && keyCode !== 8) {
|
||||
return;
|
||||
_onPasscodeInput: function() {
|
||||
// Android IMEs commit text without legacy keypress/charCode events.
|
||||
var value = this._elements.passcodeInput.value.replace(/[^0-9]/g, '').slice(0, 8);
|
||||
this._hideErrorMessage();
|
||||
if (this._elements.panel.dataset.passcodeStatus === 'success') {
|
||||
this._resetPasscodeStatus();
|
||||
}
|
||||
|
||||
evt.preventDefault();
|
||||
|
||||
if (this._passcodeBuffer === '') {
|
||||
this._hideErrorMessage();
|
||||
}
|
||||
|
||||
var code = evt.charCode;
|
||||
if (code !== 0 && (code < 0x30 || code > 0x39)) {
|
||||
return;
|
||||
}
|
||||
|
||||
var key = String.fromCharCode(code);
|
||||
if (evt.charCode === 0) {
|
||||
if (this._passcodeBuffer.length > 0) {
|
||||
this._passcodeBuffer = this._getPasscodeBuffer('all');
|
||||
if (this._elements.panel.dataset.passcodeStatus === 'success') {
|
||||
this._resetPasscodeStatus();
|
||||
}
|
||||
}
|
||||
} else if (this._passcodeBuffer.length < 8) {
|
||||
this._passcodeBuffer += key;
|
||||
}
|
||||
|
||||
this._passcodeBuffer = value;
|
||||
this._updatePassCodeUI();
|
||||
this._processPasscode();
|
||||
},
|
||||
|
|
@ -134,6 +114,7 @@ define(function(require) {
|
|||
},
|
||||
|
||||
_updatePassCodeUI: function() {
|
||||
this._elements.passcodeInput.value = this._passcodeBuffer;
|
||||
for (var i = 0; i < 8; i++) {
|
||||
if (i < this._passcodeBuffer.length) {
|
||||
this._elements.passcodeDigits[i].dataset.dot = true;
|
||||
|
|
|
|||
|
|
@ -304,7 +304,7 @@ define(function(require) {
|
|||
*/
|
||||
_updateSimSettingsUI: function scm__updateSimSettingsUI() {
|
||||
var firstCardInfo = this._simcards[0].getInfo();
|
||||
var secondCardInfo = this._simcards[1].getInfo();
|
||||
var secondCardInfo = (this._simcards[1] ? this._simcards[1].getInfo() : {absent: true});
|
||||
var hidden = firstCardInfo.absent && secondCardInfo.absent ||
|
||||
this._isAirplaneMode;
|
||||
|
||||
|
|
@ -322,7 +322,7 @@ define(function(require) {
|
|||
*/
|
||||
_updateSelectOptionsUI: function scm__updateSelectOptionsUI() {
|
||||
var firstCardInfo = this._simcards[0].getInfo();
|
||||
var secondCardInfo = this._simcards[1].getInfo();
|
||||
var secondCardInfo = (this._simcards[1] ? this._simcards[1].getInfo() : {absent: true});
|
||||
|
||||
// two cards all are not absent, we have to update separately
|
||||
if (!firstCardInfo.absent && !secondCardInfo.absent) {
|
||||
|
|
|
|||
|
|
@ -41,7 +41,8 @@ define(function(require) {
|
|||
var info = wifiManager.connectionInformation || {};
|
||||
elements.ip.textContent = info.ipAddress || '';
|
||||
document.l10n.setAttributes(elements.speed,
|
||||
'linkSpeedMbs', { linkSpeed: info.linkSpeed });
|
||||
Number.isFinite(info.linkSpeed) ? 'linkSpeedMbs' : 'unavailable',
|
||||
Number.isFinite(info.linkSpeed) ? { linkSpeed: info.linkSpeed } : {});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue