VulpesOS/assets/webapps/communications.gaiamobile.org/dialer/js/call_log.js
OverSu 200d1fb235 Release Android Preview 21 and bilingual changelog
Add permission-based reading of Android contacts, SMS and call history. Include shared Gaia fixes and document device validation limits. Pixel image qualification remains pending.
2026-10-14 13:13:46 +02:00

55 lines
No EOL
23 KiB
JavaScript

;'use strict';var CallLog={_initialized:false,_headersInterval:null,_empty:true,_contactCache:false,init:function cl_init(){if(this._initialized){this.becameVisible();return;}
window.performance.mark('callLogStart');this._initialized=true;var lazyFiles=['/shared/style/confirm.css','/shared/style/switches.css','/shared/style/lists.css','/shared/js/confirm.js','/shared/js/dialer/utils.js','/shared/js/sticky_header.js','/shared/js/sim_settings_helper.js','/shared/js/date_time_helper.js'];var self=this;var validContactsCachePromise=this._validateContactsCache();LazyLoader.load(lazyFiles,function resourcesLoaded(){var mainNodes=['all-filter','call-log-container','call-log-edit-mode','call-log-filter','call-log-icon-edit','call-log-view','deselect-all-threads','delete-button','edit-mode-header','header-edit-mode-text','missed-filter','select-all-threads','edit-mode'];mainNodes.forEach(function(id){this[Utils.toCamelCase(id)]=document.getElementById(id);},self);var dualSim=!!navigator.mozIccManager&&navigator.mozIccManager.iccIds.length>1;self.callLogContainer.classList.toggle('dual-sim',dualSim);validContactsCachePromise.then(function(){self.render();window.addEventListener('timeformatchange',self._updateCallTimes.bind(self));self.callLogIconEdit.addEventListener('click',self.showEditMode.bind(self));self.editModeHeader.addEventListener('action',self.hideEditMode.bind(self));self.missedFilter.addEventListener('click',self.filter.bind(self));self.allFilter.addEventListener('click',self.unfilter.bind(self));self.callLogContainer.addEventListener('click',self);self.callLogContainer.addEventListener('contextmenu',self);self.selectAllThreads.addEventListener('click',self.selectAll.bind(self));self.deselectAllThreads.addEventListener('click',self.deselectAll.bind(self));self.deleteButton.addEventListener('click',self.deleteLogGroups.bind(self));document.addEventListener('visibilitychange',function(){if(document.hidden){self.pauseHeaders();}else{self.updateHeadersContinuously();if(Navigation.currentView==='recents'){self.becameVisible();}}});self.sticky=new StickyHeader(self.callLogContainer,document.getElementById('sticky'));self.becameVisible();});});},_validateContactsCache:function cl_validateContactsCache(){var self=this;return new Promise(function(resolve,reject){window.asyncStorage.getItem('contactCacheRevision',function onItem(cacheRevision){Contacts.getRevision(function(contactsRevision){if(cacheRevision>contactsRevision){window.asyncStorage.setItem('contactCacheRevision',contactsRevision);self._contactCache=true;resolve();return;}
self._contactCache=(cacheRevision>=contactsRevision);if(self._contactCache){resolve();return;}
CallLogDBManager.invalidateContactsCache(function(error){if(!error){self._contactCache=true;resolve();}});});});});},_updateCallTimes:function cl_updateCallTimes(){var logItemElts=this.callLogContainer.querySelectorAll('.log-item');for(var i=0;i<logItemElts.length;i++){var logItemElt=logItemElts[i];var timestamp=logItemElt.getAttribute('data-timestamp');var formattedTime=Utils.prettyDate(parseInt(timestamp,10));var callTimeElt=logItemElt.querySelector('.call-time');callTimeElt.textContent=formattedTime;}},becameVisible:function cl_becameVisible(){this.updateHeaders();this.cleanNotifications();},updateHeaders:function cl_updateHeaders(){var headers=this.callLogContainer.getElementsByTagName('header');for(var i=0,l=headers.length;i<l;i++){var current=headers[i];Utils.setHeaderDate(current,parseInt(current.dataset.timestamp));}},updateHeadersContinuously:function cl_updateHeaders(){var updater=this.updateHeaders.bind(this);this._headersInterval=setInterval(updater,60000);},pauseHeaders:function cl_pauseHeaders(){clearInterval(this._headersInterval);},render:function cl_render(){var self=this;var daysToRender=[];var chunk=[];var prevDate;var screenRendered=false;var MAX_GROUPS_FOR_FIRST_RENDER=8;var MAX_GROUPS_TO_BATCH_RENDER=100;var batchGroupCounter=0;CallLogDBManager.getGroupList(function logGroupsRetrieved(cursor){if(!cursor.value){if(chunk.length===0){self.renderEmptyCallLog();self.disableEditModeButton();}else{daysToRender.push(chunk);self.renderSeveralDays(daysToRender);if(!screenRendered){window.performance.mark('firstChunkReady');}
self.enableEditModeButton();self.sticky.refresh();self.updateHeadersContinuously();}
window.performance.measure('callLogReady','callLogStart');return;}
self._empty=false;var currDate=new Date(cursor.value.date);batchGroupCounter++;if(!prevDate||(currDate.getTime()==prevDate.getTime())){chunk.push(cursor.value);}else{daysToRender.push(chunk);chunk=[cursor.value];var renderNow=false;if(batchGroupCounter>=MAX_GROUPS_FOR_FIRST_RENDER&&!screenRendered){renderNow=true;screenRendered=true;window.performance.mark('firstChunkReady');}else if(batchGroupCounter>=MAX_GROUPS_TO_BATCH_RENDER){renderNow=true;}
if(renderNow){self.renderSeveralDays(daysToRender);daysToRender=[];batchGroupCounter=0;}}
prevDate=currDate;cursor.continue();},'lastEntryDate',true,true);},renderSeveralDays:function cl_renderSeveralDays(chunks){for(var i=0,l=chunks.length;i<l;i++){this.renderChunk(chunks[i]);}},renderChunk:function cl_renderChunk(chunk){var callLogSection=this.createSectionForGroup(chunk[0]);var phoneNumbers=[];var logGroupContainer=callLogSection.getElementsByTagName('ol')[0];for(var i=0;i<chunk.length;i++){var current=chunk[i];var logGroupDOM=this.createGroup(current);logGroupContainer.appendChild(logGroupDOM);phoneNumbers.push(current.number);}
this.callLogContainer.appendChild(callLogSection);if(!this._contactCache){this.updateListWithContactInfo(null,null,logGroupContainer);}},renderEmptyCallLog:function cl_renderEmptyCallLog(isEmptyMissedCallsGroup){this.disableEditModeButton();if(!isEmptyMissedCallsGroup){this._empty=true;}
var noResultContainer=document.getElementById('no-result-container');noResultContainer.hidden=false;var allCallsMsg1=document.getElementById('no-result-msg1');var allCallsMsg2=document.getElementById('no-result-msg2');var noMissedCallsMsg=document.getElementById('no-result-msg3');allCallsMsg1.hidden=isEmptyMissedCallsGroup||false;allCallsMsg2.hidden=isEmptyMissedCallsGroup||false;noMissedCallsMsg.hidden=!isEmptyMissedCallsGroup;if(!isEmptyMissedCallsGroup){var noResultContainerClone=noResultContainer.cloneNode(true);this.callLogContainer.innerHTML='';this.callLogContainer.appendChild(noResultContainerClone);}},appendGroup:function cl_appendGroup(group){if(!this._initialized){return;}
this.unfilter();this.enableEditModeButton();var logGroupDOM=this.createGroup(group);var dayIndex=group.date;var container=this.callLogContainer;var previousLogGroup=document.getElementById(group.id);if(previousLogGroup){var parent=previousLogGroup.parentNode;parent.removeChild(previousLogGroup);this.insertInSection(logGroupDOM,parent);return logGroupDOM;}
var groupSelector='[data-timestamp="'+dayIndex+'"]';var sectionExists=container.querySelector(groupSelector);if(sectionExists){var section=sectionExists.getElementsByTagName('ol')[0];this.insertInSection(logGroupDOM,section);return logGroupDOM;}
var callLogSection=this.createSectionForGroup(group);var logGroupContainer=callLogSection.getElementsByTagName('ol')[0];logGroupContainer.appendChild(logGroupDOM);var previousSections=container.getElementsByTagName('section');var referenceSection;var previousSectionsLength=previousSections.length;for(var i=0;i<previousSectionsLength;i++){var current=previousSections[i];if(dayIndex>current.dataset.timestamp){referenceSection=current;break;}}
if(referenceSection){container.insertBefore(callLogSection,referenceSection);}else{if(this._empty){var noResultContainer=document.getElementById('no-result-container').cloneNode(true);container.innerHTML='';noResultContainer.hidden=true;container.appendChild(noResultContainer);this._empty=false;}
container.appendChild(callLogSection);}
this.sticky.refresh();return logGroupDOM;},insertInSection:function cl_insertInSect(group,section){var groups=section.getElementsByTagName('li');var groupsLength=groups.length;var referenceGroup;var date=group.dataset.timestamp;for(var i=0;i<groupsLength;i++){var current=groups[i];if(parseInt(date)>parseInt(current.dataset.timestamp)){referenceGroup=current;break;}}
if(referenceGroup){section.insertBefore(group,referenceGroup);}else{section.appendChild(group);}},createGroup:function cl_createGroup(group){var date=group.lastEntryDate;var number=group.number;var type=group.type;var emergency=group.emergency;var voicemail=group.voicemail;var status=group.status||'';var contact=group.contact;var groupDOM=document.createElement('li');groupDOM.classList.add('log-item');groupDOM.dataset.timestamp=date;groupDOM.dataset.phoneNumber=number;groupDOM.dataset.type=type;groupDOM.setAttribute('role','option');groupDOM.setAttribute('aria-selected',false);if(contact&&contact.id){groupDOM.dataset.contactId=contact.id;}
groupDOM.id=group.id;var iconStyle='icon ';switch(type){case'dialing':case'alerting':iconStyle+='icon-outgoing';break;case'incoming':groupDOM.dataset.status=status;if(status==='connected'){iconStyle+='icon-incoming';}else{iconStyle+='icon-missed';groupDOM.classList.add('missed-call');}
break;}
if(typeof group.serviceId!=='undefined'){var serviceClass=(parseInt(group.serviceId)===0)?'first-sim':'second-sim';iconStyle+=' '+serviceClass;}
var label=document.createElement('label');label.setAttribute('aria-hidden',true);label.className='pack-checkbox call-log-selection danger';var input=document.createElement('input');input.setAttribute('type','checkbox');input.value=group.id;var span=document.createElement('span');label.appendChild(input);label.appendChild(span);var main=document.createElement('a');main.setAttribute('role','presentation');var icon=document.createElement('aside');icon.className='icon call-type-icon '+iconStyle;var primInfo=document.createElement('p');primInfo.className='primary-info';var primInfoMain=document.createElement('span');primInfoMain.className='primary-info-main';var bdi=document.createElement('bdi');if(contact&&contact.primaryInfo){bdi.textContent=contact.primaryInfo;}else{if(number){bdi.textContent=number;}else{bdi.setAttribute('data-l10n-id','withheld-number');}}
primInfoMain.appendChild(bdi);primInfo.appendChild(primInfoMain);if(group.retryCount&&group.retryCount>1){var retryCount=document.createElement('span');retryCount.className='retry-count';retryCount.textContent='('+group.retryCount+')';primInfo.appendChild(retryCount);}
var phoneNumberAdditionalInfo='';var phoneNumberTypeL10nId=null;if(contact&&contact.matchingTel){phoneNumberAdditionalInfo=Utils.getPhoneNumberAdditionalInfo(contact.matchingTel);}else if(voicemail||emergency){phoneNumberAdditionalInfo={raw:number};phoneNumberTypeL10nId=voicemail?'voiceMail':(emergency?'emergencyNumber':null);}else{phoneNumberAdditionalInfo={id:'unknown'};}
var addInfo=document.createElement('p');addInfo.className='additional-info';addInfo.setAttribute('aria-hidden','true');var typeAndCarrier=document.createElement('span');typeAndCarrier.className='type-carrier';if(phoneNumberAdditionalInfo){if(phoneNumberAdditionalInfo.raw){typeAndCarrier.removeAttribute('data-l10n-id');typeAndCarrier.textContent=phoneNumberAdditionalInfo.raw;}else{navigator.mozL10n.setAttributes(typeAndCarrier,phoneNumberAdditionalInfo.id,phoneNumberAdditionalInfo.args);}}
addInfo.appendChild(typeAndCarrier);var callTime=document.createElement('span');callTime.className='call-time';callTime.textContent=Utils.prettyDate(date)+' ';addInfo.appendChild(callTime);main.appendChild(icon);main.appendChild(primInfo);main.appendChild(addInfo);if(phoneNumberTypeL10nId){var bdiPrim=primInfoMain.querySelector('bdi');primInfoMain.removeChild(bdiPrim);primInfoMain.setAttribute('data-l10n-id',phoneNumberTypeL10nId);var primElem=primInfoMain.parentNode;var parent=primElem.parentNode;parent.insertBefore(addInfo,primElem.nextElementSibling);}
groupDOM.appendChild(label);groupDOM.appendChild(main);return groupDOM;},createSectionForGroup:function cl_createSectionForGroup(group){var referenceTimestamp=group.date;var groupContainer=document.createElement('section');groupContainer.dataset.timestamp=referenceTimestamp;var header=document.createElement('header');Utils.setHeaderDate(header,referenceTimestamp);header.dataset.timestamp=referenceTimestamp;header.id='header-'+referenceTimestamp;header.dataset.update=true;var ol=document.createElement('ol');ol.classList.add('log-group');ol.setAttribute('role','listbox');ol.setAttribute('aria-multiselectable',true);ol.id='group-container-'+referenceTimestamp;groupContainer.appendChild(header);groupContainer.appendChild(ol);return groupContainer;},enableEditModeButton:function cl_enableEditModeButton(){CallLog.callLogIconEdit.removeAttribute('disabled');},disableEditModeButton:function cl_disableEditModeButton(){CallLog.callLogIconEdit.setAttribute('disabled','disabled');},showEditModeButton:function cl_showEditModeButton(){CallLog.callLogIconEdit.hidden=false;},hideEditModeButton:function cl_hideEditModeButton(){CallLog.callLogIconEdit.hidden=true;},showEditMode:function cl_showEditMode(event){if(this.callLogIconEdit.hasAttribute('disabled')){event.preventDefault();event.stopPropagation();return;}
this.editMode.removeAttribute('hidden');this.headerEditModeText.setAttribute('data-l10n-id','edit');this.deleteButton.setAttribute('disabled','disabled');this.selectAllThreads.removeAttribute('disabled');this.selectAllThreads.setAttribute('data-l10n-id','selectAll');this.deselectAllThreads.setAttribute('disabled','disabled');document.body.classList.add('recents-edit');},hideEditMode:function cl_hideEditMode(){document.body.classList.remove('recents-edit');var cont=this.callLogContainer;var inputs=cont.querySelectorAll('input[type="checkbox"]');var logItems=cont.querySelectorAll('.log-item');var i,l;for(i=0,l=inputs.length;i<l;i++){inputs[i].checked=false;}
for(i=0,l=logItems.length;i<l;i++){logItems[i].setAttribute('aria-selected',false);}
if(this.callLogContainer.classList.contains('filter')){this.filter();}else{this.unfilter();}
this.editMode.setAttribute('hidden','');},handleEvent:function cl_handleEvent(evt){var logItem=evt.target;if(document.body.classList.contains('recents-edit')){if(logItem.dataset.phoneNumber){var checkbox=logItem.getElementsByTagName('input')[0];var toggleChecked=!checkbox.checked;checkbox.checked=toggleChecked;logItem.setAttribute('aria-selected',toggleChecked);}
this.updateHeaderCount();return;}
var dataset=logItem.dataset;var phoneNumber=dataset.phoneNumber;if(!phoneNumber){return;}
if(evt.type=='click'){if(navigator.mozIccManager&&navigator.mozIccManager.iccIds.length>1){KeypadManager.updatePhoneNumber(phoneNumber);Navigation.showKeypad();}else{SimSettingsHelper.getCardIndexFrom('outgoingCall',function(ci){CallHandler.call(phoneNumber,ci);});}}else{evt.preventDefault();var primaryInfo=logItem.querySelector('.primary-info-main').textContent;LazyLoader.load(['/dialer/js/call_group_menu.js'],function(){CallGroupMenu.show(primaryInfo,phoneNumber,dataset.timestamp,dataset.type,dataset.status);});}},filter:function cl_filter(){this.callLogContainer.classList.add('filter');AccessibilityHelper.setAriaSelected(this.missedFilter.firstElementChild,[this.allFilter.firstElementChild,this.missedFilter.firstElementChild]);this.callLogContainer.setAttribute('aria-labelledby','missed-filter-tab');var containers=this.callLogContainer.getElementsByTagName('ol');var totalMissedCalls=0;for(var i=0,l=containers.length;i<l;i++){var noMissedCalls=containers[i].getElementsByClassName('missed-call');if(noMissedCalls.length===0){containers[i].parentNode.classList.add('groupFiltered');}
totalMissedCalls+=noMissedCalls.length;}
if(totalMissedCalls===0){this.renderEmptyCallLog(true);}else{var noResultContainer=document.getElementById('no-result-container');noResultContainer.hidden=true;this.enableEditModeButton();}},unfilter:function cl_unfilter(){var logItems=this.callLogContainer.querySelectorAll('.log-item');if(logItems.length===0){this.renderEmptyCallLog();}else{var noResultContainer=document.getElementById('no-result-container');noResultContainer.hidden=true;this.enableEditModeButton();}
this.callLogContainer.classList.remove('filter');AccessibilityHelper.setAriaSelected(this.allFilter.firstElementChild,[this.allFilter.firstElementChild,this.missedFilter.firstElementChild]);this.callLogContainer.setAttribute('aria-labelledby','all-filter-tab');var hiddenContainers=document.getElementsByClassName('groupFiltered');for(var i=(hiddenContainers.length-1);i>=0;i--){hiddenContainers[i].classList.remove('groupFiltered');}},updateHeaderCount:function cl_updateHeaderCount(){var selector=this.callLogContainer.classList.contains('filter')?'li.missed-call input[type="checkbox"]:checked':'input[type="checkbox"]:checked';var allSelector=this.callLogContainer.classList.contains('filter')?'li.missed-call input[type="checkbox"]':'input[type="checkbox"]';var selected=this.callLogContainer.querySelectorAll(selector).length;var allInputs=this.callLogContainer.querySelectorAll(allSelector).length;if(selected===0){this.headerEditModeText.setAttribute('data-l10n-id','edit');this.selectAllThreads.removeAttribute('disabled');this.selectAllThreads.setAttribute('data-l10n-id','selectAll');this.deselectAllThreads.setAttribute('disabled','disabled');this.deleteButton.setAttribute('disabled','disabled');return;}
navigator.mozL10n.setAttributes(this.headerEditModeText,'edit-selected',{n:selected});this.deleteButton.removeAttribute('disabled');if(selected===allInputs){this.deselectAllThreads.removeAttribute('disabled');this.selectAllThreads.setAttribute('disabled','disabled');}else{this.selectAllThreads.removeAttribute('disabled');this.selectAllThreads.setAttribute('data-l10n-id','selectAll');this.deselectAllThreads.removeAttribute('disabled');}},selectAll:function cl_selectAll(){var selector=this.callLogContainer.classList.contains('filter')?'li.missed-call input[type="checkbox"]:not(:checked)':'input[type="checkbox"]:not(:checked)';var inputs=this.callLogContainer.querySelectorAll(selector);for(var i=0,l=inputs.length;i<l;i++){inputs[i].checked=true;}
this.updateHeaderCount();},deselectAll:function cl_selectAll(){var selector='input[type="checkbox"]:checked';var inputs=this.callLogContainer.querySelectorAll(selector);for(var i=0,l=inputs.length;i<l;i++){inputs[i].checked=false;}
this.updateHeaderCount();},deleteLogGroups:function cl_deleteLogGroups(){var selector='input[type="checkbox"]:checked';var inputsSelected=this.callLogContainer.querySelectorAll(selector);var self=this;var msg={'id':'delete-n-log?','args':{n:inputsSelected.length}};var yesObject={title:'delete',isDanger:true,callback:function deleteLogGroup(){ConfirmDialog.hide();var logGroupsToDelete=[];for(var i=0,l=inputsSelected.length;i<l;i++){var logGroup=inputsSelected[i].parentNode.parentNode;var olContainer=logGroup.parentNode;olContainer.removeChild(logGroup);if(olContainer.children.length===0){var section=olContainer.parentNode;self.callLogContainer.removeChild(section);}
var dataset=logGroup.dataset;var toDelete={date:parseInt(dataset.timestamp),number:dataset.phoneNumber===null?'':dataset.phoneNumber,type:dataset.type};if(dataset.status){toDelete.status=dataset.status;}
logGroupsToDelete.push(toDelete);}
CallLogDBManager.deleteGroupList(logGroupsToDelete,function(){self.hideEditMode();});}};var noObject={title:'cancel',callback:function onCancel(){ConfirmDialog.hide();}};ConfirmDialog.show(null,msg,noObject,yesObject);},_updateContact:function _updateContact(log,phoneNumber,contactId,updateDb){var self=this;Contacts.findByNumber(phoneNumber,function(contact,matchingTel){if(!contact||!matchingTel){self._removeContact(log,contactId,updateDb);return;}
if(self._contactCache&&updateDb){CallLogDBManager.updateGroupContactInfo(contact,matchingTel,function(result){if(typeof result==='number'&&result>0){self.updateContactInfo(log,contact,matchingTel);}});}else{self.updateContactInfo(log,contact,matchingTel);}});},_removeContact:function _removeContact(log,contactId,updateDb){if(this._contactCache&&updateDb){var self=this;CallLogDBManager.removeGroupContactInfo(contactId,null,function(result){if(typeof result==='number'&&result>0){self.updateContactInfo(log);}});}else{this.updateContactInfo(log);}},updateListWithContactInfo:function cl_updateList(reason,contactId,target){var container=target||this.callLogContainer;if(!container){return;}
var logs=[];switch(reason){case'remove':logs=container.querySelectorAll('li[data-contact-id="'+contactId+'"]');break;default:logs=container.querySelectorAll('.log-item');break;}
for(var i=0,l=logs.length;i<l;i++){var log=logs[i];var logInfo=log.dataset;this._updateContact(log,logInfo.phoneNumber,contactId,i===0);}},updateContactInfo:function cl_updateContactInfo(element,contact,matchingTel){var primInfoCont=element.querySelector('.primary-info-main');var addInfo=element.getElementsByClassName('additional-info')[0];var typeAndCarrier=addInfo.querySelector('.type-carrier');if(!matchingTel){if(element.dataset.contactId){primInfoCont.textContent='';var bdi=document.createElement('bdi');bdi.textContent=element.dataset.phoneNumber;primInfoCont.appendChild(bdi);typeAndCarrier.textContent='';typeAndCarrier.setAttribute('data-l10n-id','unknown');delete element.dataset.contactId;}
return;}
var primaryInfo=Utils.getPhoneNumberPrimaryInfo(matchingTel,contact);if(primaryInfo){primInfoCont.textContent='';var bdiPrim=document.createElement('bdi');bdiPrim.textContent=primaryInfo;primInfoCont.appendChild(bdiPrim);}
var phoneNumberAdditionalInfo=Utils.getPhoneNumberAdditionalInfo(matchingTel);navigator.mozL10n.setAttributes(typeAndCarrier,phoneNumberAdditionalInfo.id,phoneNumberAdditionalInfo.args);if(contact){element.dataset.contactId=contact.id;}},cleanNotifications:function cl_cleanNotifcations(){Notification.get().then(function onSuccess(notifications){for(var i=0;i<notifications.length;i++){if(!notifications[i].tag){notifications[i].close();}}},function onError(reason){console.debug('Call log Notification.get() promise error: '+reason);});},_getGroupFromLog:function cl_getGroupFromLog(log){if(!log){return;}
var data=log.dataset;if(!data||!data.id){return;}
var groupId=data.id.split('-');var group={date:groupId[0],number:groupId[1],type:groupId[2]};if(data.status){group.status=data.status;}
return group;}};navigator.mozContacts.oncontactchange=function oncontactchange(event){var reason=event.reason;var options={filterBy:['id'],filterOp:'equals',filterValue:event.contactID};if(reason==='remove'){CallLog.updateListWithContactInfo('remove',event.contactID);return;}
var request=navigator.mozContacts.find(options);request.onsuccess=function contactRetrieved(e){if(!e.target.result||e.target.result.length===0){console.warn('Call log: No Contact Found: ',event.contactID);return;}
var contact=e.target.result[0];if(!fb.isFbContact(contact)){CallLog.updateListWithContactInfo(reason,event.contactID);return;}
var fbReq=fb.getData(contact);fbReq.onsuccess=function fbContactSuccess(){CallLog.updateListWithContactInfo(reason,event.contactID);};fbReq.onerror=function fbContactError(){console.error('Error while querying FB: ',fbReq.error.name);CallLog.updateListWithContactInfo(reason,event.contactID);};};request.onerror=function errorHandler(e){console.error('Error retrieving contact by ID '+event.contactID);};};