Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
190 lines
6.4 KiB
JavaScript
190 lines
6.4 KiB
JavaScript
/* 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);
|
|
}
|
|
}
|
|
});
|
|
}());
|