This is an example on how I’ve implemented a simple idle timeout check in Sencha Touch 2.
First capture any touch events that might occur by using:
var viewPort = Ext.get('ext-viewport');
viewPort.on(['touchstart', 'touchend', 'touchmove', 'swipe', 'dragstart', 'drag', 'dragend', 'tap', 'singletap', 'doubletap', 'longpress', 'pinch', 'rotate'], 'onViewPortEvent', this);
I’ve defined my onViewPortEvent to reset the timer.
onViewPortEvent: function (e, target, options, eventController) {
if (MySessionTimeout.app.sessionPromptShowing == 0) {
MySessionTimeout.app.idleMin = MySessionTimeout.app.settingsIdleMin;
MySessionTimeout.app.idleSec = MySessionTimeout.app.settingsIdleSec;
}
}
Initially I tried by using only one delayed task and run it, but for some reasons it would only fire it once (many experience the same thing).
So I wrote the same task twice and jumped between them to keep the timer going.
Here’s the snippet of task1:
var task1 = Ext.create('Ext.util.DelayedTask', function () {
if (MySessionTimeout.app.idleSec < 1 && MySessionTimeout.app.idleMin > 0) {
MySessionTimeout.app.idleMin--;
MySessionTimeout.app.idleSec = 60;
}
//Logging out once the timer reaches 1sec
if (MySessionTimeout.app.idleMin == 0 && MySessionTimeout.app.idleSec == 1) {
if (debugC) console.log('task1 cancel');
me.onSessionTimeout('Signing out due to inactivity..');
task1.cancel();
task2.cancel();
}
//Display a Prompt to the user if the minute counter hits 0
if (MySessionTimeout.app.idleMin == 0 && MySessionTimeout.app.sessionPromptShowing == 0) {
MySessionTimeout.app.sessionPromptShowing = 1;
Ext.Msg.confirm("MySessionTimeout", "Your session is about to expire, do you want to continue?", function (answer) {
if (answer == 'yes') {
MySessionTimeout.app.idleMin = MySessionTimeout.app.settingsIdleMin;
MySessionTimeout.app.idleSec = MySessionTimeout.app.settingsIdleSec;
MySessionTimeout.app.sessionPromptShowing = 0;
} else {
MySessionTimeout.app.sessionPromptShowing = 0;
me.onSessionTimeout('Signing out..');
}
});
}
MySessionTimeout.app.idleSec--;
me.getTimer().setHtml(' minutes: ' + MySessionTimeout.app.idleMin + ' seconds: ' + MySessionTimeout.app.idleSec);
task2.delay(1000);
}, this);
Task2 is build the same way with the exception of changing task2.delay(1000) to task1.delay(1000).
After that, simply fire up task1.delay(1000).
Fork me on Github | Demo (in progress)
