/* global LazyLoader, EmergencyCallbackIcon, BaseModule, UtilityTray */
'use strict';
(function() {
/*
* This emergency callback mode manager is for:
* - Initialize the manager if network type is cdma and regist an event handler
* for emergency callback mode change.
* - Display a notification to showing the system is entered the callback
* mode with count down timer.
* - Popup a dialog for user to notify the mode will block data network and
* let user decide callback mode should exit or not.
*
*/
var EmergencyCallbackManager = function(core) {
if (core && core.mobileConnections) {
this._conn = core.mobileConnections[0];
}
};
BaseModule.create(EmergencyCallbackManager, {
name: 'EmergencyCallbackManager',
timer: 0,
timeoutController: null,
TOASTER_TIMEOUT: 2000,
EVENT_PREFIX: 'emergencycallback',
notification: null,
message: null,
toaster: null,
toasterMessage: null,
warningDialog: null,
okButton: null,
cancelButton: null,
/**
* Indicates the emergency callback state
* @type {Boolean}
*/
active: false,
_start: function ecm_init() {
// Dom elements
this.notification =
document.getElementById('emergency-callback-notification');
this.message = this.notification.querySelector('.title-container');
this.notificationTimer = this.notification.querySelector('.timer');
this.toaster = document.getElementById('emergency-callback-toaster');
this.toasterMessage = this.toaster.querySelector('.message');
this.toasterTimer = this.toaster.querySelector('.timer');
this.warningDialog = document.getElementById('emergency-callback-dialog');
this.dialogTimer = this.warningDialog.querySelector('small');
this.okButton = document.getElementById('emergency-callback-exit-button');
this.cancelButton =
document.getElementById('emergency-callback-stay-button');
this.warningTimer = this.warningDialog.querySelector('p');
LazyLoader.load(['js/emergency_callback_icon.js']).then(function() {
this.icon = new EmergencyCallbackIcon(this);
this.icon.start();
}.bind(this))['catch'](function(err) { // XXX: workaround gjslint
console.error(err);
});
// Event handler
this._conn.addEventListener('emergencycbmodechange',
this.onEmergencyCbModeChange.bind(this));
this.notification.addEventListener('click',
this.notificationClicked.bind(this));
this.toaster.addEventListener('click', this.toasterClicked.bind(this));
this.okButton.addEventListener('click',
this.exitEmergencyCbMode.bind(this));
this.cancelButton.addEventListener('click', this.cancelPrompt.bind(this));
},
exitEmergencyCbMode: function ecm_exitEmergencyCbMode() {
this.warningDialog.classList.remove('visible');
this.warningDialog.hidden = true;
this._conn.exitEmergencyCbMode();
},
notificationClicked: function ecm_notificationClicker() {
this.showEmergencyCbPrompt();
UtilityTray.hide();
},
toasterClicked: function ecm_toasterClicker() {
this.showEmergencyCbPrompt();
this.toaster.classList.remove('displayed');
this.toaster.hidden = true;
},
showEmergencyCbPrompt: function ecm_showEmergencyCbPrompt() {
// Add home key event handler to dismiss the prompt if home is pressed
// while prompt displayed.
var self = this;
window.addEventListener('home', function hidePrompt() {
window.removeEventListener('home', hidePrompt);
self.cancelPrompt();
});
this.warningDialog.classList.add('visible');
this.warningDialog.hidden = false;
},
cancelPrompt: function ecm_cancelPrompt() {
this.warningDialog.classList.remove('visible');
this.warningDialog.hidden = true;
},
displayNotificationAndToaster: function() {
this.displayNotificationIfHidden();
this.toasterTimer.textContent = this.timerString;
this.toaster.classList.add('displayed');
this.toaster.hidden = false;
setTimeout(function waitToHide() {
this.toaster.classList.remove('displayed');
this.toaster.hidden = true;
}.bind(this), this.TOASTER_TIMEOUT);
},
hideNotificationIfDisplayed: function() {
if (this.notification.classList.contains('displayed')) {
this.notification.classList.remove('displayed');
this.notification.hidden = true;
this.publish('statechanged', false);
}
},
displayNotificationIfHidden: function() {
if (!this.notification.classList.contains('displayed')) {
this.notification.classList.add('displayed');
this.notification.hidden = false;
this.publish('statechanged', true);
}
},
updateTimer: function ecm_updateTimer() {
this.timer -= 1000;
if (this.timer < 0) {
window.clearInterval(this.timeoutController);
this.timeoutController = null;
return;
}
this.notificationTimer.textContent = this.dialogTimer.textContent =
this.timerString;
},
onDataError: function(evt) {
// TODO: We shold be able to confirm the error is caused by
// emergency callback mode before showing prompt.
this.showEmergencyCbPrompt();
},
onEmergencyCbModeChange: function(evt) {
var active = evt.active;
this.active = active;
this.icon && this.icon.update();
if (active) {
if (this.timeoutController) {
window.clearInterval(this.timeoutController);
}
this.timer = evt.timeoutMs;
this.displayNotificationAndToaster();
this.timeoutController =
window.setInterval(this.updateTimer.bind(this), 1000);
this._conn.ondataerror = this.onDataError.bind(this);
} else {
this.hideNotificationIfDisplayed();
this.warningDialog.classList.remove('visible');
this.warningDialog.hidden = true;
window.clearInterval(this.timeoutController);
this.timeoutController = null;
this._conn.ondataerror = null;
}
}
}, {
timerString: {
configurable: false,
get: function() {
var totalSec = this.timer / 1000;
var min = Math.floor(totalSec / 60);
var secString = (totalSec % 60).toString();
var sec = secString.length > 1 ? secString : '0' + secString;
return (min + ':' + sec);
}
}
});
}());