diff --git a/examples/pxScene2d/src/rcvrcore/optimus.js b/examples/pxScene2d/src/rcvrcore/optimus.js index 57b0a6fb5f..c27eb97c1a 100644 --- a/examples/pxScene2d/src/rcvrcore/optimus.js +++ b/examples/pxScene2d/src/rcvrcore/optimus.js @@ -22,12 +22,16 @@ limitations under the License. var applicationsArray = []; var availableApplicationsArray = []; var eventListenerHash = {}; +var html5_suspend_whitelist = []; +var html5_suspend_delay_seconds = 5; var scene; var root; var appManager = new Optimus(); module.exports = appManager; +var node_url = require('url'); + var ApplicationType = Object.freeze({ SPARK:"SPARK", SPARK_INSTANCE:"SPARK_INSTANCE", @@ -205,6 +209,7 @@ function Application(props) { var userAgent = null; var localStorage = false; var appParent = null; + var suspendDelayTimeout = null; // Internal function needed for suspend var do_suspend_internal = function(o) @@ -220,8 +225,33 @@ function Application(props) { } if (_this.type === ApplicationType.WEB){ if (_browser !== undefined && _browser.suspend){ - _this.log("Suspending Web app"); - _browser.suspend(); + _this.log("Suspending Web app"); + + if (_this.urlDelaysSuspend(_this.api().url) && html5_suspend_delay_seconds >= 1) + { + _this.log("delaying suspend and setting visibility to hidden"); + _this.api().visibility = 'hidden'; + + if(suspendDelayTimeout != null) + { + _this.log("WARNING! suspendDelayTimeout already set, canceling and restarting anew"); + clearTimeout(suspendDelayTimeout); + suspendDelayTimeout = null; + } + + suspendDelayTimeout = setTimeout(function () + { + _this.log("doing delayed suspend now"); + _browser.suspend(); + suspendDelayTimeout = null; + }, html5_suspend_delay_seconds * 1000); + } + else + { + _this.log("suspending immediately"); + _browser.suspend(); + } + _state = ApplicationState.SUSPENDED; _this.applicationSuspended(); return true; @@ -328,7 +358,15 @@ function Application(props) { } if (this.type === ApplicationType.WEB){ if (_browser !== undefined && _browser.resume){ - this.log("Resuming Web app"); + this.log("Resuming Web app"); + + if(suspendDelayTimeout != null) + { + _this.log("suspendDelayTimeout set, canceling"); + clearTimeout(suspendDelayTimeout); + suspendDelayTimeout = null; + } + _browser.resume(); _state = ApplicationState.RUNNING; this.applicationResumed(); @@ -374,6 +412,14 @@ function Application(props) { } try { this.log("about to destroy"); + + if(suspendDelayTimeout != null) + { + _this.log("suspendDelayTimeout set, canceling"); + clearTimeout(suspendDelayTimeout); + suspendDelayTimeout = null; + } + if (_externalApp.destroy) { ret = _externalApp.destroy(); } else if (this.type === ApplicationType.SPARK && _externalApp.api && _externalApp.api.destroy) { @@ -426,6 +472,18 @@ function Application(props) { _externalApp.parent = p; } }; + // Check if a link would have a delayed suspend + this.urlDelaysSuspend = function(url_val) + { + var parsedURL = node_url.parse(url_val); + var url_hostname = parsedURL.hostname; + + for(var i=0;i