Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
856 lines
25 KiB
JavaScript
Executable file
856 lines
25 KiB
JavaScript
Executable file
'use strict';
|
|
/* global _ */
|
|
/* global Cache */
|
|
/* global ConfirmDialog */
|
|
/* global Contacts */
|
|
/* global ContactsBTExport */
|
|
/* global ContactsExporter */
|
|
/* global ContactsSDExport */
|
|
/* global ContactsSIMExport */
|
|
/* global IccHandler */
|
|
/* global LazyLoader */
|
|
/* global navigationStack */
|
|
/* global Rest */
|
|
/* global SimContactsImporter */
|
|
/* global SimDomGenerator */
|
|
/* global utils */
|
|
/* global VCFReader */
|
|
/* global ContactsService */
|
|
/* global ExtServices */
|
|
/* global Loader */
|
|
/* global BulkDelete */
|
|
/* global ICE */
|
|
/* global Telemetry */
|
|
|
|
var contacts = window.contacts || {};
|
|
|
|
/***
|
|
This class handles all the activity regarding
|
|
the settings screen for contacts
|
|
**/
|
|
contacts.Settings = (function() {
|
|
|
|
var navigationHandler,
|
|
importSettingsHeader,
|
|
orderCheckBox,
|
|
orderItem,
|
|
orderByLastName,
|
|
setICEButton,
|
|
importSettingsPanel,
|
|
importSettingsTitle,
|
|
importContacts,
|
|
exportContacts,
|
|
importOptions,
|
|
exportOptions,
|
|
importLiveOption,
|
|
importGmailOption,
|
|
importSDOption,
|
|
exportSDOption,
|
|
newOrderByLastName = null,
|
|
PENDING_LOGOUT_KEY = 'pendingLogout',
|
|
bulkDeleteButton;
|
|
|
|
var EXPORT_TRANSITION_LEVEL = 2, DELETE_TRANSITION_LEVEL = 1;
|
|
|
|
// Initialise the settings screen (components, listeners ...)
|
|
var init = function initialize() {
|
|
// Create the DOM for our SIM cards and listen to any changes
|
|
IccHandler.init(new SimDomGenerator(), contacts.Settings.cardStateChanged);
|
|
|
|
initContainers();
|
|
// To avoid any race condition we listen for online events once
|
|
// containers have been initialized
|
|
window.addEventListener('online', checkOnline);
|
|
window.addEventListener('offline', checkOnline);
|
|
|
|
// Subscribe to events related to change state in the sd card
|
|
utils.sdcard.subscribeToChanges('check_sdcard', function(value) {
|
|
updateStorageOptions(utils.sdcard.checkStorageCard());
|
|
});
|
|
|
|
window.addEventListener('timeformatchange', updateTimestamps);
|
|
};
|
|
|
|
var hideSettings = function hideSettings() {
|
|
contacts.Settings.close();
|
|
};
|
|
|
|
// Get the different values that we will show in the app
|
|
var getData = function getData() {
|
|
var config = utils.cookie.load();
|
|
var order = config ? config.order : false;
|
|
orderByLastName = order;
|
|
newOrderByLastName = null;
|
|
updateOrderingUI();
|
|
};
|
|
|
|
var updateOrderingUI = function updateOrderingUI() {
|
|
var value = newOrderByLastName === null ? orderByLastName :
|
|
newOrderByLastName;
|
|
orderCheckBox.checked = value;
|
|
orderCheckBox.setAttribute('aria-checked', value);
|
|
};
|
|
|
|
var updateImportTitle = function updateImportTitle(l10nString) {
|
|
importSettingsTitle.setAttribute('data-l10n-id', l10nString);
|
|
};
|
|
|
|
// Initialises variables and listener for the UI
|
|
var initContainers = function initContainers() {
|
|
orderItem = document.getElementById('settingsOrder');
|
|
orderCheckBox = orderItem.querySelector('[name="order.lastname"]');
|
|
orderCheckBox.addEventListener('change', onOrderingChange.bind(this));
|
|
// Creating a navigation handler from this view
|
|
navigationHandler = new navigationStack('view-settings');
|
|
|
|
// Init panel & elements for caching them
|
|
importSettingsPanel = document.getElementById('import-settings');
|
|
importSDOption = document.getElementById('import-sd-option');
|
|
exportSDOption = document.getElementById('export-sd-option');
|
|
importSettingsTitle = document.getElementById('import-settings-title');
|
|
importLiveOption = document.getElementById('import-live-option');
|
|
importGmailOption = document.getElementById('import-gmail-option');
|
|
|
|
// ICE view
|
|
setICEButton = document.getElementById('set-ice');
|
|
|
|
/*
|
|
* Adding listeners
|
|
*/
|
|
|
|
document.getElementById('settings-close').addEventListener(
|
|
'click',
|
|
hideSettings
|
|
);
|
|
// Listener for updating the timestamp based on extServices
|
|
window.addEventListener('message', function updateList(e) {
|
|
if (e.data.type === 'import_updated') {
|
|
updateTimestamps();
|
|
checkNoContacts();
|
|
}
|
|
});
|
|
|
|
// Navigation back
|
|
importSettingsHeader = document.getElementById('import-settings-header');
|
|
importSettingsHeader.addEventListener('action', importSettingsBackHandler);
|
|
|
|
// Handlers for the navigation through the panels
|
|
importContacts = document.getElementById('importContacts');
|
|
importContacts.firstElementChild.
|
|
addEventListener('click', importContactsHandler);
|
|
|
|
exportContacts = document.getElementById('exportContacts');
|
|
exportContacts.firstElementChild.
|
|
addEventListener('click', exportContactsHandler);
|
|
|
|
// Handlers for the actions related with EXPORT/IMPORT
|
|
importOptions = document.getElementById('import-options');
|
|
importOptions.addEventListener('click', importOptionsHandler);
|
|
|
|
exportOptions = document.getElementById('export-options');
|
|
exportOptions.addEventListener('click', exportOptionsHandler);
|
|
|
|
// ICE view
|
|
setICEButton.addEventListener('click', showICEScreen);
|
|
|
|
// Bulk delete
|
|
bulkDeleteButton = document.getElementById('bulkDelete');
|
|
bulkDeleteButton.addEventListener('click', bulkDeleteHandler);
|
|
};
|
|
|
|
// UI event handlers
|
|
function importSettingsBackHandler() {
|
|
navigationHandler.back(function navigateBackHandler() {
|
|
// Removing the previous assigned style for having
|
|
// a clean view
|
|
importSettingsPanel.classList.remove('export');
|
|
importSettingsPanel.classList.remove('import');
|
|
});
|
|
}
|
|
|
|
function importContactsHandler() {
|
|
// Hide elements for export and transition
|
|
LazyLoader.load(['/contacts/js/utilities/telemetry.js'], () => {
|
|
importSettingsPanel.classList.remove('export');
|
|
importSettingsPanel.classList.add('import');
|
|
updateImportTitle('importContactsTitle');
|
|
navigationHandler.go('import-settings', 'right-left');
|
|
});
|
|
}
|
|
|
|
function exportContactsHandler() {
|
|
// Hide elements for import and transition
|
|
LazyLoader.load(['/contacts/js/export/contacts_exporter.js'], loadSearch);
|
|
|
|
function loadSearch() {
|
|
Loader.view('search', function() {
|
|
importSettingsPanel.classList.remove('import');
|
|
importSettingsPanel.classList.add('export');
|
|
updateImportTitle('exportContactsTitle');
|
|
navigationHandler.go('import-settings', 'right-left');
|
|
});
|
|
}
|
|
}
|
|
|
|
function showICEScreen(cb) {
|
|
LazyLoader.load([
|
|
'/contacts/js/utilities/ice_data.js',
|
|
'/contacts/js/views/ice_settings.js',
|
|
'/shared/js/contacts/utilities/ice_store.js'], function(){
|
|
ICE.refresh();
|
|
navigationHandler.go('ice-settings', 'right-left');
|
|
if (typeof cb === 'function') {
|
|
cb();
|
|
}
|
|
});
|
|
}
|
|
|
|
// Given an event, select wich should be the targeted
|
|
// import/export source
|
|
function getSource(e) {
|
|
var source = e.target.parentNode.dataset.source;
|
|
// Check special cases
|
|
if (source && source.indexOf('-') != -1) {
|
|
source = source.substr(0, source.indexOf('-'));
|
|
}
|
|
return source;
|
|
}
|
|
|
|
function logImportUsage(name) {
|
|
return Telemetry.logImportUsage(name);
|
|
}
|
|
|
|
function importOptionsHandler(e) {
|
|
/* jshint validthis:true */
|
|
|
|
var source = getSource(e);
|
|
switch (source) {
|
|
case 'sim':
|
|
var iccId = e.target.parentNode.dataset.iccid;
|
|
window.setTimeout(requireSimImport.bind(this,
|
|
onSimImport.bind(this, iccId)), 0);
|
|
break;
|
|
case 'sd':
|
|
window.setTimeout(requireOverlay.bind(this, onSdImport), 0);
|
|
break;
|
|
case 'gmail':
|
|
ExtServices.onContactsImported = logImportUsage.bind(null, 'gmail');
|
|
ExtServices.importGmail();
|
|
break;
|
|
case 'live':
|
|
ExtServices.onContactsImported = logImportUsage.bind(null, 'live');
|
|
ExtServices.importLive();
|
|
break;
|
|
}
|
|
}
|
|
|
|
var bulkDeleteHandler = function bulkDeleteHandler() {
|
|
LazyLoader.load(
|
|
[
|
|
'/contacts/js/contacts_bulk_delete.js',
|
|
'/contacts/js/contacts_remover.js'
|
|
],
|
|
function() {
|
|
Loader.view('search', function() {
|
|
contacts.List.selectFromList(_('DeleteTitle'),
|
|
function onSelectedContacts(promise, done) {
|
|
BulkDelete.performDelete(promise, done);
|
|
},
|
|
null,
|
|
navigationHandler,
|
|
{
|
|
transitionLevel: DELETE_TRANSITION_LEVEL
|
|
}
|
|
);
|
|
});
|
|
}
|
|
);
|
|
};
|
|
|
|
function exportOptionsHandler(e) {
|
|
var source = getSource(e);
|
|
switch (source) {
|
|
case 'sim':
|
|
var iccId = e.target.parentNode.dataset.iccid;
|
|
LazyLoader.load(['/contacts/js/export/sim.js'],
|
|
function() {
|
|
doExport(new ContactsSIMExport(IccHandler.getIccById(iccId)));
|
|
}
|
|
);
|
|
break;
|
|
case 'sd':
|
|
LazyLoader.load(
|
|
[
|
|
'/shared/js/device_storage/get_storage_if_available.js',
|
|
'/shared/js/device_storage/get_unused_filename.js',
|
|
'/shared/js/contact2vcard.js',
|
|
'/shared/js/setImmediate.js',
|
|
'/contacts/js/export/sd.js'
|
|
],
|
|
function() {
|
|
doExport(new ContactsSDExport());
|
|
}
|
|
);
|
|
break;
|
|
case 'bluetooth':
|
|
LazyLoader.load(
|
|
[
|
|
'/shared/js/device_storage/get_storage_if_available.js',
|
|
'/shared/js/device_storage/get_unused_filename.js',
|
|
'/shared/js/contact2vcard.js',
|
|
'/shared/js/setImmediate.js',
|
|
'/contacts/js/export/bt.js'
|
|
],
|
|
function() {
|
|
doExport(new ContactsBTExport());
|
|
}
|
|
);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function doExport(strategy) {
|
|
// Launch the selection mode in the list, and then invoke
|
|
// the export with the selected strategy.
|
|
|
|
contacts.List.selectFromList(_('exportContactsAction'),
|
|
function onSelectedContacts(promise) {
|
|
// Resolve the promise, meanwhile show an overlay to
|
|
// warn the user of the ongoin operation, dismiss it
|
|
// once we have the result
|
|
requireOverlay(function _loaded() {
|
|
utils.overlay.show('preparing-contacts', null, 'spinner');
|
|
promise.onsuccess = function onSuccess(ids) {
|
|
// Once we start the export process we can exit from select mode
|
|
// This will have to evolve once export errors can be captured
|
|
contacts.List.exitSelectMode();
|
|
var exporter = new ContactsExporter(strategy);
|
|
exporter.init(ids, function onExporterReady() {
|
|
// Leave the contact exporter to deal with the overlay
|
|
exporter.start();
|
|
});
|
|
};
|
|
promise.onerror = function onError() {
|
|
contacts.List.exitSelectMode();
|
|
utils.overlay.hide();
|
|
};
|
|
});
|
|
},
|
|
null,
|
|
navigationHandler,
|
|
{
|
|
isDanger: false,
|
|
transitionLevel: EXPORT_TRANSITION_LEVEL
|
|
}
|
|
);
|
|
}
|
|
|
|
// Options checking & updating
|
|
|
|
var checkSIMCard = function checkSIMCard() {
|
|
var statuses = IccHandler.getStatus();
|
|
statuses.forEach(function onStatus(status) {
|
|
enableSIMOptions(status.iccId, status.cardState);
|
|
});
|
|
};
|
|
|
|
// Disables/Enables an option and show the error if needed
|
|
var updateOptionStatus =
|
|
function updateOptionStatus(domOption, disabled, error) {
|
|
if (domOption === null) {
|
|
return;
|
|
}
|
|
var optionButton = domOption.firstElementChild;
|
|
if (disabled) {
|
|
optionButton.setAttribute('disabled', 'disabled');
|
|
if (error) {
|
|
domOption.classList.add('error');
|
|
} else {
|
|
domOption.classList.remove('error');
|
|
}
|
|
} else {
|
|
optionButton.removeAttribute('disabled');
|
|
domOption.classList.remove('error');
|
|
}
|
|
};
|
|
|
|
// Disables/Enables the actions over the sim import functionality
|
|
var enableSIMOptions = function enableSIMOptions(iccId, cardState) {
|
|
var importSimOption = document.getElementById('import-sim-option-' + iccId);
|
|
var exportSimOption = document.getElementById('export-sim-option-' + iccId);
|
|
var disabled = (cardState !== 'ready' && cardState !== 'illegal');
|
|
updateOptionStatus(importSimOption, disabled, true);
|
|
updateOptionStatus(exportSimOption, disabled, true);
|
|
};
|
|
|
|
/**
|
|
* Disables/Enables the actions over the sdcard import/export functionality
|
|
* @param {Boolean} cardAvailable Whether functions should be enabled or not.
|
|
*/
|
|
var updateStorageOptions = function updateStorageOptions(cardAvailable) {
|
|
// Enable/Disable button and shows/hides error message
|
|
updateOptionStatus(importSDOption, !cardAvailable, true);
|
|
updateOptionStatus(exportSDOption, !cardAvailable, true);
|
|
|
|
var importSDErrorL10nId = null;
|
|
var exportSDErrorL10nId = null;
|
|
|
|
var cardShared = utils.sdcard.status === utils.sdcard.SHARED;
|
|
if (!cardAvailable) {
|
|
importSDErrorL10nId = 'noMemoryCardMsg';
|
|
exportSDErrorL10nId = 'noMemoryCardMsgExport';
|
|
|
|
if (cardShared) {
|
|
importSDErrorL10nId = exportSDErrorL10nId = 'memoryCardUMSEnabled';
|
|
}
|
|
}
|
|
|
|
// update the message
|
|
var importSDErrorNode = importSDOption.querySelector('p.error-message');
|
|
if (importSDErrorL10nId) {
|
|
importSDErrorNode.setAttribute('data-l10n-id', importSDErrorL10nId);
|
|
} else {
|
|
importSDErrorNode.removeAttribute('data-l10n-id');
|
|
importSDErrorNode.textContent = '';
|
|
}
|
|
|
|
var exportSDErrorNode = exportSDOption.querySelector('p');
|
|
if (exportSDErrorL10nId) {
|
|
exportSDErrorNode.setAttribute('data-l10n-id', exportSDErrorL10nId);
|
|
} else {
|
|
exportSDErrorNode.removeAttribute('data-l10n-id');
|
|
exportSDErrorNode.textContent = '';
|
|
}
|
|
|
|
};
|
|
|
|
/**
|
|
* Loads the overlay class before showing
|
|
*/
|
|
function requireOverlay(callback) {
|
|
Loader.utility('Overlay', callback);
|
|
}
|
|
|
|
/**
|
|
* Loads required libraries for sim import
|
|
*/
|
|
function requireSimImport(callback) {
|
|
var libraries = ['Overlay', 'Import_sim_contacts'];
|
|
var pending = libraries.length;
|
|
|
|
libraries.forEach(function onPending(library) {
|
|
Loader.utility(library, next);
|
|
});
|
|
|
|
function next() {
|
|
if (!(--pending)) {
|
|
callback();
|
|
}
|
|
}
|
|
}
|
|
|
|
function resetWait(wakeLock) {
|
|
Contacts.hideOverlay();
|
|
if (wakeLock) {
|
|
wakeLock.unlock();
|
|
}
|
|
}
|
|
|
|
// Listens for any change in the ordering preferences
|
|
var onOrderingChange = function onOrderingChange(evt) {
|
|
newOrderByLastName = orderCheckBox.checked;
|
|
updateOrderingUI();
|
|
};
|
|
|
|
// Import contacts from SIM card and updates ui
|
|
var onSimImport = function onSimImport(iccId, done) {
|
|
var icc = IccHandler.getIccById(iccId);
|
|
if (icc === null) {
|
|
return;
|
|
}
|
|
var progress = Contacts.showOverlay('simContacts-reading',
|
|
'activityBar');
|
|
|
|
var wakeLock = navigator.requestWakeLock('cpu');
|
|
|
|
var cancelled = false, contactsRead = false;
|
|
var importer = new SimContactsImporter(icc);
|
|
utils.overlay.showMenu();
|
|
utils.overlay.oncancel = function oncancel() {
|
|
cancelled = true;
|
|
importer.finish();
|
|
if (contactsRead) {
|
|
// A message about canceling will be displayed while the current chunk
|
|
// is being cooked
|
|
progress.setClass('activityBar');
|
|
utils.overlay.hideMenu();
|
|
progress.setHeaderMsg('messageCanceling');
|
|
} else {
|
|
importer.onfinish(); // Early return while reading contacts
|
|
}
|
|
};
|
|
var totalContactsToImport;
|
|
var importedContacts = 0;
|
|
// Delay for showing feedback to the user after importing
|
|
var DELAY_FEEDBACK = 200;
|
|
|
|
importer.onread = function import_read(n) {
|
|
contactsRead = true;
|
|
totalContactsToImport = n;
|
|
if (totalContactsToImport > 0) {
|
|
progress.setClass('progressBar');
|
|
progress.setHeaderMsg('simContacts-importing');
|
|
progress.setTotal(totalContactsToImport);
|
|
}
|
|
};
|
|
|
|
importer.onfinish = function import_finish(numDupsMerged) {
|
|
window.setTimeout(function onfinish_import() {
|
|
resetWait(wakeLock);
|
|
if (importedContacts > 0) {
|
|
var source = 'sim-' + iccId;
|
|
utils.misc.setTimestamp(source, function() {
|
|
// Once the timestamp is saved, update the list
|
|
updateTimestamps();
|
|
checkNoContacts();
|
|
});
|
|
}
|
|
if (!cancelled) {
|
|
utils.status.show({
|
|
id: 'simContacts-imported3',
|
|
args: {
|
|
n: importedContacts
|
|
}
|
|
},
|
|
!numDupsMerged ? null : {
|
|
id: 'contactsMerged',
|
|
args: {
|
|
numDups: numDupsMerged
|
|
}
|
|
});
|
|
} else {
|
|
logImportUsage('sim');
|
|
}
|
|
|
|
typeof done === 'function' && done();
|
|
|
|
}, DELAY_FEEDBACK);
|
|
|
|
importer.onfinish = null;
|
|
};
|
|
|
|
importer.onimported = function imported_contact() {
|
|
importedContacts++;
|
|
if (!cancelled) {
|
|
progress.update();
|
|
}
|
|
};
|
|
|
|
importer.onerror = function import_error() {
|
|
var cancel = {
|
|
title: 'cancel',
|
|
callback: function() {
|
|
ConfirmDialog.hide();
|
|
}
|
|
};
|
|
var retry = {
|
|
title: 'retry',
|
|
isRecommend: true,
|
|
callback: function() {
|
|
ConfirmDialog.hide();
|
|
// And now the action is reproduced one more time
|
|
window.setTimeout(requireSimImport.bind(this,
|
|
onSimImport.bind(this, iccId)), 0);
|
|
}
|
|
};
|
|
ConfirmDialog.show(null, 'simContacts-error', cancel, retry);
|
|
resetWait(wakeLock);
|
|
};
|
|
|
|
importer.start();
|
|
};
|
|
|
|
var onSdImport = function onSdImport(cb) {
|
|
var cancelled = false;
|
|
var importer = null;
|
|
var progress = Contacts.showOverlay(
|
|
'memoryCardContacts-importing',
|
|
'activityBar',
|
|
'infiniteProgress'
|
|
);
|
|
utils.overlay.showMenu();
|
|
utils.overlay.oncancel = function() {
|
|
cancelled = true;
|
|
importer ? importer.finish() : Contacts.hideOverlay();
|
|
};
|
|
var wakeLock = navigator.requestWakeLock('cpu');
|
|
|
|
var importedContacts = 0;
|
|
// Delay for showing feedback to the user after importing
|
|
var DELAY_FEEDBACK = 200;
|
|
|
|
utils.sdcard.retrieveFiles([
|
|
'text/vcard',
|
|
'text/x-vcard',
|
|
'text/directory;profile=vCard',
|
|
'text/directory'
|
|
], ['vcf', 'vcard'], function(err, fileArray) {
|
|
if (err) {
|
|
return import_error(err, cb);
|
|
}
|
|
|
|
if (cancelled) {
|
|
return;
|
|
}
|
|
|
|
if (fileArray.length) {
|
|
var promises = [];
|
|
fileArray.forEach(file => {
|
|
promises.push(utils.sdcard.getTextFromFile(file, onContacts));
|
|
});
|
|
Promise.all(promises).then(results => {
|
|
var numDupsMerged = results.reduce((sum, current) => {
|
|
return sum + current;
|
|
});
|
|
window.setTimeout(() => {
|
|
utils.misc.setTimestamp('sd', () => {
|
|
// Once the timestamp is saved, update the list
|
|
updateTimestamps();
|
|
checkNoContacts();
|
|
resetWait(wakeLock);
|
|
|
|
if (!cancelled) {
|
|
var msg1 = {
|
|
id: 'memoryCardContacts-imported3',
|
|
args: {
|
|
n: importedContacts
|
|
}
|
|
};
|
|
var msg2 = !numDupsMerged ? null : {
|
|
id: 'contactsMerged',
|
|
args: {
|
|
numDups: numDupsMerged
|
|
}
|
|
};
|
|
|
|
utils.status.show(msg1, msg2);
|
|
|
|
logImportUsage('sd');
|
|
|
|
if (typeof cb === 'function') {
|
|
cb();
|
|
}
|
|
}
|
|
});
|
|
}, DELAY_FEEDBACK);
|
|
}).catch(error => {
|
|
import_error(error);
|
|
});
|
|
} else {
|
|
import_error('No contacts were found.', cb);
|
|
}
|
|
});
|
|
|
|
function onContacts(text) {
|
|
if (cancelled) {
|
|
return Promise.reject();
|
|
}
|
|
return new Promise((resolve, reject) => {
|
|
importer = new VCFReader(text);
|
|
if (!text || !importer) {
|
|
var error = 'No contacts were found';
|
|
import_error(error);
|
|
reject(error);
|
|
return;
|
|
}
|
|
|
|
importer.onimported = imported_contact;
|
|
importer.onerror = error => {
|
|
import_error(error);
|
|
reject(error);
|
|
};
|
|
|
|
importer.process((unused, numDupsMerged) => {
|
|
if (cancelled) {
|
|
reject('Cancelled');
|
|
Contacts.hideOverlay();
|
|
return;
|
|
}
|
|
resolve(numDupsMerged);
|
|
});
|
|
});
|
|
}
|
|
|
|
function imported_contact() {
|
|
importedContacts++;
|
|
progress.update();
|
|
}
|
|
|
|
function import_error(e, cb) {
|
|
var cancel = {
|
|
title: 'cancel',
|
|
callback: function() {
|
|
ConfirmDialog.hide();
|
|
}
|
|
};
|
|
|
|
var retry = {
|
|
title: 'retry',
|
|
isRecommend: true,
|
|
callback: function() {
|
|
ConfirmDialog.hide();
|
|
// And now the action is reproduced one more time
|
|
window.setTimeout(requireOverlay.bind(this, onSdImport), 0);
|
|
}
|
|
};
|
|
ConfirmDialog.show(null, 'memoryCardContacts-error', cancel,
|
|
retry);
|
|
resetWait(wakeLock);
|
|
if (typeof cb === 'function') {
|
|
cb();
|
|
}
|
|
}
|
|
};
|
|
|
|
// Dismiss settings window and execute operations if values got modified
|
|
var close = function close() {
|
|
if (newOrderByLastName != null &&
|
|
newOrderByLastName != orderByLastName && contacts.List) {
|
|
contacts.List.setOrderByLastName(newOrderByLastName);
|
|
utils.cookie.update({order: newOrderByLastName});
|
|
Cache.evict();
|
|
// Force the reset of the dom, we know that we changed the order
|
|
contacts.List.load(null, true);
|
|
orderByLastName = newOrderByLastName;
|
|
}
|
|
|
|
Contacts.goBack();
|
|
};
|
|
|
|
var checkOnline = function() {
|
|
// Perform pending automatic logouts
|
|
window.setTimeout(automaticLogout, 0);
|
|
|
|
// Other import services settings
|
|
updateOptionStatus(importGmailOption, !navigator.onLine, true);
|
|
updateOptionStatus(importLiveOption, !navigator.onLine, true);
|
|
};
|
|
|
|
var checkNoContacts = function checkNoContacts() {
|
|
var exportButton = exportContacts.firstElementChild;
|
|
|
|
ContactsService.isEmpty(function(error, isEmpty) {
|
|
if (error) {
|
|
window.console.warn(
|
|
'Error while trying to know the contact number',
|
|
error
|
|
);
|
|
// In case of error is safer to leave enabled
|
|
exportButton.removeAttribute('disabled');
|
|
bulkDeleteButton.removeAttribute('disabled');
|
|
return;
|
|
}
|
|
if (isEmpty) {
|
|
exportButton.setAttribute('disabled', 'disabled');
|
|
bulkDeleteButton.setAttribute('disabled', 'disabled');
|
|
setICEButton.setAttribute('disabled', 'disabled');
|
|
} else {
|
|
exportButton.removeAttribute('disabled');
|
|
bulkDeleteButton.removeAttribute('disabled');
|
|
setICEButton.removeAttribute('disabled');
|
|
}
|
|
});
|
|
};
|
|
|
|
function saveStatus(data) {
|
|
window.asyncStorage.setItem(PENDING_LOGOUT_KEY, data);
|
|
}
|
|
|
|
function automaticLogout() {
|
|
if (navigator.offLine === true) {
|
|
return;
|
|
}
|
|
|
|
LazyLoader.load(['/shared/js/contacts/utilities/http_rest.js'],
|
|
function() {
|
|
window.asyncStorage.getItem(PENDING_LOGOUT_KEY, function(data) {
|
|
if (!data) {
|
|
return;
|
|
}
|
|
var services = Object.keys(data);
|
|
var numResponses = 0;
|
|
|
|
services.forEach(function(service) {
|
|
var url = data[service];
|
|
|
|
var callbacks = {
|
|
success: function logout_success() {
|
|
numResponses++;
|
|
window.console.log('Successfully logged out: ', service);
|
|
delete data[service];
|
|
if (numResponses === services.length) {
|
|
saveStatus(data);
|
|
}
|
|
},
|
|
error: function logout_error() {
|
|
numResponses++;
|
|
if (numResponses === services.length) {
|
|
saveStatus(data);
|
|
}
|
|
},
|
|
timeout: function logout_timeout() {
|
|
numResponses++;
|
|
if (numResponses === services.length) {
|
|
saveStatus(data);
|
|
}
|
|
}
|
|
};
|
|
Rest.get(url, callbacks);
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
var updateTimestamps = function updateTimestamps() {
|
|
// TODO Add the same functionality to 'EXPORT' methods when ready.
|
|
var importSources =
|
|
document.querySelectorAll('#import-options li[data-source]');
|
|
Array.prototype.forEach.call(importSources, function(node) {
|
|
utils.misc.getTimestamp(node.dataset.source,
|
|
function(time) {
|
|
var spanID = 'notImported';
|
|
if (time) {
|
|
spanID = 'imported';
|
|
var timeElement = node.querySelector('p > time');
|
|
timeElement.setAttribute('datetime',
|
|
(new Date(time)).toLocaleString());
|
|
timeElement.textContent = utils.time.pretty(time);
|
|
}
|
|
node.querySelector('p > span').setAttribute('data-l10n-id', spanID);
|
|
});
|
|
});
|
|
};
|
|
|
|
var refresh = function refresh() {
|
|
getData();
|
|
checkOnline();
|
|
checkSIMCard();
|
|
utils.sdcard.getStatus(function statusUpdated() {
|
|
updateStorageOptions(utils.sdcard.checkStorageCard());
|
|
});
|
|
updateTimestamps();
|
|
checkNoContacts();
|
|
};
|
|
|
|
return {
|
|
'init': init,
|
|
'close': close,
|
|
'refresh': refresh,
|
|
'cardStateChanged': checkSIMCard,
|
|
'updateTimestamps': updateTimestamps,
|
|
'showICEScreen' : showICEScreen,
|
|
get navigation() { return navigationHandler; },
|
|
'importFromSDCard': onSdImport,
|
|
'importFromSIMCard': onSimImport
|
|
};
|
|
})();
|