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.
This commit is contained in:
parent
93e3a48004
commit
b38dea0597
25901 changed files with 9982925 additions and 369 deletions
218
gaia/apps/system/js/voicemail.js
Executable file
218
gaia/apps/system/js/voicemail.js
Executable file
|
|
@ -0,0 +1,218 @@
|
|||
/* 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);
|
||||
};
|
||||
}
|
||||
});
|
||||
}());
|
||||
Loading…
Reference in a new issue