VulpesOS/gaia/apps/communications/dialer/js/call_info.js
OverSu b38dea0597 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.
2026-09-30 23:13:03 +02:00

295 lines
9.2 KiB
JavaScript
Executable file

'use strict';
/* global CallLog, CallLogDBManager, Contacts, ContactsButtons, LazyLoader,
MozActivity, SimplePhoneMatcher, Utils */
(function(exports) {
var currentGroup;
var detailsButton;
var addToContactButton;
var createContactButton;
var callInfoView;
var phoneDetailsElt;
var emailDetailsElt;
var listDetailsElt;
function updateViewIfNeeded(evt) {
if (evt.detail.group.id !== currentGroup.id) {
return;
}
updateView(evt.detail.group);
}
function updateView(group) {
currentGroup = group;
updateGroupInformation(group);
updateCallDurations(group);
updateActionButtons(group);
callInfoView.hidden = false;
CallLog.hideEditModeButton();
}
function isMissedCall(group) {
return group.type === 'incoming' && group.status !== 'connected';
}
function updateGroupInformation(group) {
var titleElt = document.getElementById('call-info-title');
if (group.contact) {
titleElt.textContent = group.contact.primaryInfo;
} else if (group.voicemail) {
titleElt.setAttribute('data-l10n-id', 'voiceMail');
} else if (group.emergency) {
titleElt.setAttribute('data-l10n-id', 'emergencyNumber');
} else {
titleElt.textContent = group.number;
}
Utils.setHeaderDate(
document.getElementById('call-info-day'), parseInt(group.date));
var classList = document.getElementById('call-info-direction').classList;
classList.remove('icon-outgoing', 'icon-incoming', 'icon-missed');
if (isMissedCall(group)) {
classList.add('icon-missed');
} else if (group.type === 'dialing' || group.type === 'alerting') {
classList.add('icon-outgoing');
} else if (group.type === 'incoming'){
classList.add('icon-incoming');
}
}
function updateCallDurations(group) {
var callDurationsElt = document.getElementById('call-durations');
callDurationsElt.innerHTML = '';
/* Old groups did not record call durations */
if (!group.calls) {
return;
}
group.calls.forEach(function(call) {
var startTime = document.createElement('p');
startTime.classList.add('ci__grow');
startTime.classList.add('js-ci-start-times');
startTime.dataset.date = call.date;
startTime.textContent = Utils.prettyDate(call.date);
var durationElt = document.createElement('p');
durationElt.classList.add('cd__duration');
navigator.mozL10n.once(function() {
if (call.duration === 0) {
if (group.type === 'incoming') {
durationElt.setAttribute('data-l10n-id', 'info-missed');
} else {
durationElt.setAttribute('data-l10n-id', 'canceled');
}
} else {
Utils.prettyDuration(durationElt, call.duration,
'callDurationTextFormat');
}
});
var row = document.createElement('div');
row.classList.add('call-duration');
row.appendChild(startTime);
row.appendChild(durationElt);
callDurationsElt.appendChild(row);
});
}
function updateStartTimes() {
var startTimeElts = document.querySelectorAll('.js-ci-start-times');
for (var i=0, il=startTimeElts.length; i<il; i++) {
var startTimeElt = startTimeElts[i];
var date = parseInt(startTimeElt.dataset.date, 10);
startTimeElt.textContent = Utils.prettyDate(date);
}
}
function renderPhones(group, contact) {
var contactTels = contact.tel.map(function(tel) {
return tel.value;
});
if (!contactTels.some((tel) => tel != null)) {
return;
}
LazyLoader.load(['/shared/js/simple_phone_matcher.js'], function() {
ContactsButtons.renderPhones(contact);
// Highlight the contact number that the call info page was opened for,
// with a color depending on whether the call was missed or not.
var remark = isMissedCall(group) ? 'remark-missed' : 'remark';
var groupTel = SimplePhoneMatcher.sanitizedNumber(
group.number || group.contact.matchingTel.number);
var groupTelVariants = SimplePhoneMatcher.generateVariants(groupTel);
// SimplePhoneMatch expects a series of contacts, so we pass it an array
// containing only the relevant contact.
contactTels = [contactTels];
var matchingTels = SimplePhoneMatcher.bestMatch(groupTelVariants,
contactTels);
var matchingTel = {value: ''};
if (matchingTels.totalMatchNum) {
matchingTel = contact.tel[matchingTels.allMatches[0][0]];
}
ContactsButtons.reMark('tel', matchingTel.value, remark);
});
}
function updateActionButtons(group) {
listDetailsElt.innerHTML = '';
detailsButton.hidden = true;
addToContactButton.hidden = true;
createContactButton.hidden = true;
if (group.contact) {
detailsButton.hidden = false;
Contacts.findByNumber(group.contact.matchingTel.number,
function(contact, matchingTel) {
ContactsButtons.renderEmails(contact);
renderPhones(group, contact);
});
} else {
addToContactButton.hidden = false;
createContactButton.hidden = false;
var contact = {
tel: [
{
value: group.number,
type: 'mobile'
}
]
};
renderPhones(group, contact);
}
}
function close(evt) {
if (evt.detail.type !== 'back') {
return;
}
window.removeEventListener('CallLogDbNewCall', updateViewIfNeeded);
callInfoView.hidden = true;
CallLog.showEditModeButton();
}
function viewContact() {
/*jshint nonew: false */
new MozActivity({
name: 'open',
data: {
type: 'webcontacts/contact',
params: {id: currentGroup.contact.id}
}
});
}
function createNewContact() {
launchActivity('new', currentGroup.number);
}
function addToExistingContact() {
launchActivity('update', currentGroup.number);
}
function launchActivity(name, phoneNumber) {
try {
/* jshint nonew: false */
new MozActivity({
name: name,
data: {
type: 'webcontacts/contact',
params: {
'tel': phoneNumber
}
}
});
} catch (e) {
console.error('Error while creating activity');
}
}
function initListeners() {
detailsButton = document.getElementById('call-info-details');
detailsButton.addEventListener('click', viewContact);
addToContactButton = document.getElementById('call-info-add');
addToContactButton.addEventListener('click', addToExistingContact);
createContactButton = document.getElementById('call-info-create');
createContactButton.addEventListener('click', createNewContact);
var header = document.getElementById('call-info-gaia-header');
header.addEventListener('action', close);
window.addEventListener('timeformatchange', updateStartTimes);
}
// FIXME/bug 1060290: The build system doesn't allow nested fragments, so we
// can work around this for now by loading all elements at the root level and
// then resolving them to the correct location, e.g. fragment-name-stub, on
// runtime.
function replaceFragmentStub(stub, fragment) {
var parent = stub.parentNode;
parent.insertBefore(fragment, stub);
parent.removeChild(stub);
fragment.hidden = false;
}
function initFragments() {
var phoneDetailsStub = document.getElementById('phone-details-stub');
phoneDetailsElt = document.getElementById('phone-details');
var emailDetailsStub = document.getElementById('email-details-stub');
emailDetailsElt = document.getElementById('email-details');
var contactDetailsElt = document.getElementById('contact-detail');
listDetailsElt = document.getElementById('call-info-list-details');
LazyLoader.load([phoneDetailsElt, emailDetailsElt], function() {
replaceFragmentStub(phoneDetailsStub, phoneDetailsElt);
replaceFragmentStub(emailDetailsStub, emailDetailsElt);
ContactsButtons.init(listDetailsElt, contactDetailsElt);
});
}
var CallInfo = {
_initialised: false,
show: function(number, date, type, status) {
callInfoView = document.getElementById('call-info-view');
var self = this;
LazyLoader.load([callInfoView,
'/shared/js/dialer/contacts.js',
'/shared/js/dialer/utils.js',
'/shared/js/contacts/contacts_buttons.js',
'/shared/js/contacts/utilities/templates.js',
'/shared/js/contacts/sms_integration.js',
'/shared/js/text_normalizer.js',
'/dialer/js/telephony_helper.js',
'/shared/style/contacts/contacts_buttons.css',
'/shared/style/contacts.css',
'/dialer/style/buttons.css'], function() {
if (!self._initialised) {
self._initialised = true;
initListeners();
initFragments();
}
date = parseInt(date, 10);
CallLogDBManager.getGroup(number, date, type, status)
.then(updateView);
window.addEventListener('CallLogDbNewCall', updateViewIfNeeded);
});
}
};
exports.CallInfo = CallInfo;
})(window);