Publish Vulpes Preview 15 sources for desktop, Android and Tundra

Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
This commit is contained in:
OverSu 2026-09-30 23:13:03 +02:00
commit b38dea0597
25901 changed files with 9982925 additions and 369 deletions

View file

@ -0,0 +1,248 @@
/* exports WebrtcClient */
/* global MozActivity */
/* global Promise */
/*
* This class is in charge of adding, in a 'plug&play' way, the buttons
* related with the new feature for calling through WebRTC other phone or
* email, taking into account the Contact info.
*
* We will check with MozActivity if the app is installed or not, and if it
* is installed we will show the buttons in the Detail of the contact.
*/
(function(exports) {
'use strict';
var WEBRTC_CLIENTNAME = 'Firefox Hello';
var _webrtcClientIntegrationDOM, _detailListDOM;
var _cachedContact = null;
var _isInDetail = false;
var _isWebrtcClientInstalled;
var voiceCallButton, videoCallButton;
function _launchActivity(videoEnabled) {
var activity = new MozActivity({
name: 'webrtc-call',
data: {
video: videoEnabled,
type: 'webcontacts/contact',
contact: _cachedContact
}
});
activity.onerror = function() {
// TODO Add string if needed
};
}
function _checkIfInstalled(forceCheck) {
return new Promise(function(resolve, reject) {
// If the value was previously checked we dont need to recheck again.
if (_isWebrtcClientInstalled !== undefined && !forceCheck) {
_isWebrtcClientInstalled ? resolve() : reject();
return;
}
var activity =
new MozActivity(
{
name: 'webrtc-call',
data: {
type: 'webcontacts/contact',
video: false,
contact: null
},
// With this param we retrieve a list of apps
// which could handle this activity.
getFilterResults: true
}
);
activity.onsuccess = function(e) {
if (activity.result.length > 0) {
_isWebrtcClientInstalled = true;
resolve();
} else {
_isWebrtcClientInstalled = false;
reject();
}
};
activity.onerror = function(e) {
_isWebrtcClientInstalled = false;
reject();
};
});
}
function _createDOM() {
// Let's build the structure we are going to use
// First of all the element is going to be added to a list
// so we create the 'li' element
_webrtcClientIntegrationDOM = document.createElement('li');
_webrtcClientIntegrationDOM.id = 'webrtc-client-actions';
var title = document.createElement('h2');
// This has been hardcoded to prevent uplifting issues to v2.0
title.textContent = WEBRTC_CLIENTNAME;
var colsWrapper = document.createElement('div');
colsWrapper.className = 'fillflow-twocols';
voiceCallButton = document.createElement('button');
voiceCallButton.className = 'activity icon icon-webrtc-voice';
voiceCallButton.setAttribute('data-l10n-id', 'audio');
voiceCallButton.addEventListener(
'click',
function onVoiceCallRequest() {
_launchActivity(false);
}
);
videoCallButton = document.createElement('button');
videoCallButton.className = 'activity icon icon-webrtc-video';
videoCallButton.setAttribute('data-l10n-id', 'video');
videoCallButton.addEventListener(
'click',
function onVideoCallRequest() {
_launchActivity(true);
}
);
colsWrapper.appendChild(voiceCallButton);
colsWrapper.appendChild(videoCallButton);
// Append elements to the new section
_webrtcClientIntegrationDOM.appendChild(title);
_webrtcClientIntegrationDOM.appendChild(colsWrapper);
}
function _init() {
// Cache the parent element
_detailListDOM = document.getElementById('details-list');
// Create the DOM for the new element in the 'details-list'
_createDOM();
}
function _insert() {
// Get the section which is going to be shown after, we will use it
// as a reference
var reference;
// Is there any phone element?
var phoneNumbers = _detailListDOM.querySelectorAll('[data-phone]');
var phonesLength = phoneNumbers && phoneNumbers.length;
if (phonesLength) {
reference = phoneNumbers[phonesLength - 1].nextSibling;
}
else {
var emails = _detailListDOM.querySelectorAll('[data-mail]');
var emailsLength = emails && emails.length;
if (emailsLength) {
reference = emails[emailsLength - 1];
}
}
_detailListDOM.insertBefore(
_webrtcClientIntegrationDOM,
reference
);
}
function _remove() {
if (!!document.getElementById('webrtc-client-actions')) {
_detailListDOM.removeChild(_webrtcClientIntegrationDOM);
}
}
function _render() {
if (!_webrtcClientIntegrationDOM) {
_init();
}
_insert();
}
function _onVisibilityChange() {
if (!document.hidden) {
_checkIfInstalled(true).then(
_onWebrtcClientInstalled,
_onWebrtcClientUninstalled
);
}
}
function _startListeningAppChanges() {
document.addEventListener('visibilitychange', _onVisibilityChange);
}
function _stopListeningAppChanges() {
document.removeEventListener('visibilitychange', _onVisibilityChange);
}
function _webRtcClientAvailable(contact) {
var mailPresent = false;
var telPresent = false;
if (Array.isArray(contact.email)) {
if (contact.email.length > 0 && contact.email[0] &&
contact.email[0].value && contact.email[0].value.trim()) {
mailPresent = true;
}
}
if (Array.isArray(contact.tel)) {
if (contact.tel.length > 0 && contact.tel[0] &&
contact.tel[0].value && contact.tel[0].value.trim()) {
telPresent = true;
}
}
return telPresent || mailPresent;
}
function _onWebrtcClientInstalled() {
// If we are not in the detail of a contact, we
// dont need to render any button
if (!_webRtcClientAvailable(_cachedContact) || !_isInDetail) {
return;
}
// If is not appended yet, we added it
if (!document.getElementById('webrtc-client-actions')) {
_render();
}
}
function _onWebrtcClientUninstalled() {
_remove();
}
var WebrtcClient = {
start: function start(contact, forceCheck) {
if (!_isInDetail) {
// Specify that we are in the detail of a contact
_isInDetail = true;
// Listening for app changes
_startListeningAppChanges();
}
// Cache the contact for future events
_cachedContact = contact;
// If installed we need to render
_checkIfInstalled(forceCheck).then(
_onWebrtcClientInstalled,
_onWebrtcClientUninstalled
);
},
stop: function stop() {
// Clean the previous params
_cachedContact = null;
_isInDetail = false;
// Stop listening for app changes
_stopListeningAppChanges();
}
};
exports.WebrtcClient = WebrtcClient;
}(this));