Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
295 lines
9.2 KiB
JavaScript
Executable file
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);
|