Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
218 lines
6.4 KiB
JavaScript
Executable file
218 lines
6.4 KiB
JavaScript
Executable file
/* global ModalDialog, BaseModule, SIMSlotManager, NotificationHelper */
|
|
'use strict';
|
|
(function() {
|
|
// Custom voicemail notification --
|
|
// This can be removed once DesktopNotification
|
|
// supports removing notifications via API
|
|
var Voicemail = function() {};
|
|
Voicemail.SETTINGS = [
|
|
'ril.iccInfo.mbdn'
|
|
];
|
|
BaseModule.create(Voicemail, {
|
|
name: 'Voicemail',
|
|
icon: null,
|
|
notifications: {},
|
|
tagPrefix: 'voicemailNotification:',
|
|
|
|
_start: function vm_init() {
|
|
var voicemail = window.navigator.mozVoicemail;
|
|
if (!voicemail) {
|
|
return;
|
|
}
|
|
|
|
this.icon = window.location.protocol + '//' +
|
|
window.location.hostname + '/style/icons/voicemail.png';
|
|
|
|
// Cleanup any pending notification and prepare event handler
|
|
return this.setupNotifications();
|
|
},
|
|
|
|
handleEvent: function vm_handleEvent(evt) {
|
|
var voicemailStatus = evt.status;
|
|
if (voicemailStatus) {
|
|
this.updateNotification(voicemailStatus);
|
|
}
|
|
},
|
|
|
|
updateNotification: function vm_updateNotification(status) {
|
|
var title = status.returnMessage;
|
|
var showCount = status.hasMessages && status.messageCount > 0;
|
|
var titleL10n;
|
|
|
|
if (title) {
|
|
titleL10n = { raw: status.returnMessage };
|
|
}
|
|
|
|
if (!titleL10n) {
|
|
titleL10n = showCount ? {
|
|
id: 'newVoicemails',
|
|
args: { n: status.messageCount }
|
|
} : 'newVoicemailsUnknown';
|
|
}
|
|
|
|
var bodyL10n = titleL10n;
|
|
|
|
var numbers = this._settings['ril.iccInfo.mbdn'];
|
|
var voicemail = navigator.mozVoicemail;
|
|
var number = numbers && numbers[status.serviceId];
|
|
|
|
if (!number && voicemail) {
|
|
number = voicemail.getNumber(status.serviceId);
|
|
}
|
|
|
|
if (number) {
|
|
bodyL10n = {
|
|
id: 'dialNumber',
|
|
args: { number: number }
|
|
};
|
|
}
|
|
|
|
if (status.hasMessages) {
|
|
this.showNotification(titleL10n, bodyL10n, number, status.serviceId);
|
|
} else {
|
|
this.hideNotification(status.serviceId);
|
|
}
|
|
},
|
|
|
|
showNotification: function
|
|
vm_showNotification(titleL10n, bodyL10n, voicemailNumber, serviceId) {
|
|
if (!('Notification' in window)) {
|
|
return;
|
|
}
|
|
|
|
serviceId = serviceId || 0;
|
|
var titlePromise, subTitlePromise;
|
|
|
|
if (!SIMSlotManager.hasOnlyOneSIMCardDetected()) {
|
|
if (typeof titleL10n === 'string') {
|
|
subTitlePromise = navigator.mozL10n.formatValue(titleL10n);
|
|
} else if (titleL10n.raw) {
|
|
subTitlePromise = Promise.resolve(titleL10n.raw);
|
|
} else {
|
|
subTitlePromise =
|
|
navigator.mozL10n.formatValue(titleL10n.id, titleL10n.args);
|
|
}
|
|
titlePromise = subTitlePromise.then(subtitle => {
|
|
return {
|
|
id: 'voicemailNotificationMultiSim',
|
|
args: { n: serviceId + 1, title: subtitle }
|
|
};
|
|
});
|
|
} else {
|
|
titlePromise = Promise.resolve(titleL10n);
|
|
}
|
|
|
|
var notifOptions = {
|
|
bodyL10n: bodyL10n,
|
|
icon: this.icon,
|
|
tag: this.tagPrefix + serviceId,
|
|
mozbehavior: {
|
|
showOnlyOnce: true
|
|
}
|
|
};
|
|
|
|
return titlePromise.then(titleL10n => {
|
|
NotificationHelper.send(titleL10n, notifOptions).then(notification => {
|
|
var callVoicemail = function vmNotificationCall_onClick(event) {
|
|
var telephony = window.navigator.mozTelephony;
|
|
if (!telephony) {
|
|
return;
|
|
}
|
|
|
|
var openLines = telephony.calls.length +
|
|
((telephony.conferenceGroup &&
|
|
telephony.conferenceGroup.calls.length) ? 1 : 0);
|
|
|
|
// User can make call only
|
|
// when there are less than 2 calls by spec. If the limit reached,
|
|
// return early to prevent holding active call.
|
|
if (openLines >= 2) {
|
|
return;
|
|
}
|
|
|
|
telephony.dial(voicemailNumber, serviceId);
|
|
};
|
|
|
|
var showNoVoicemail = (function vmNotificationNoCall_onClick(event) {
|
|
var voicemailDialog = {
|
|
title: 'voicemailNoNumberTitle',
|
|
text: 'voicemailNoNumberText',
|
|
confirm: {
|
|
title: 'voicemailNoNumberSettings',
|
|
callback: this.showVoicemailSettings
|
|
},
|
|
cancel: {
|
|
title: 'voicemailNoNumberCancel',
|
|
callback: function() {}
|
|
}
|
|
};
|
|
|
|
ModalDialog.confirm(
|
|
voicemailDialog.title, voicemailDialog.text,
|
|
voicemailDialog.confirm, voicemailDialog.cancel
|
|
);
|
|
}).bind(this);
|
|
|
|
notification.addEventListener('click',
|
|
voicemailNumber ? callVoicemail : showNoVoicemail);
|
|
|
|
notification.addEventListener('close',
|
|
(function vm_closeNotification(evt) {
|
|
this.notifications[serviceId] = null;
|
|
}).bind(this));
|
|
|
|
this.notifications[serviceId] = notification;
|
|
});
|
|
});
|
|
},
|
|
|
|
hideNotification: function vm_hideNotification(serviceId) {
|
|
if (!this.notifications[serviceId]) {
|
|
return;
|
|
}
|
|
|
|
this.notifications[serviceId].close();
|
|
},
|
|
|
|
setupNotifications: function vm_setupNotifications() {
|
|
// Always make sure the initial state is known
|
|
this.notifications = {};
|
|
var prefix = this.tagPrefix;
|
|
var promise = Notification.get();
|
|
return promise.then(function(notifications) {
|
|
notifications.forEach(function(notification) {
|
|
if (!notification) {
|
|
return;
|
|
}
|
|
|
|
// We cannot search for 'tag=voicemailNotification:*'
|
|
// so we do it by ourselves.
|
|
// Bail out if the notification does not match our tag.
|
|
if (!notification.tag || !notification.tag.startsWith(prefix)) {
|
|
return;
|
|
}
|
|
|
|
// Let's remove voicemail notification.
|
|
notification.close();
|
|
});
|
|
}).then((function() {
|
|
var voicemail = window.navigator.mozVoicemail;
|
|
voicemail.addEventListener('statuschanged', this);
|
|
}).bind(this));
|
|
},
|
|
|
|
showVoicemailSettings: function vm_showVoicemailSettings() {
|
|
var activity = new window.MozActivity({
|
|
name: 'configure',
|
|
data: {
|
|
target: 'device',
|
|
section: 'call'
|
|
}
|
|
});
|
|
|
|
activity.onerror = function() {
|
|
console.warn('Configure activity error:', activity.error.name);
|
|
};
|
|
}
|
|
});
|
|
}());
|