diff --git a/apps/fastload/boot.js b/apps/fastload/boot.js index 7787aaa83..11ce0563b 100644 --- a/apps/fastload/boot.js +++ b/apps/fastload/boot.js @@ -1,4 +1,6 @@ { +const SETTINGS = require("Storage").readJSON("fastload.json") || {}; + let loadingScreen = function(){ g.reset(); @@ -14,9 +16,58 @@ let loadingScreen = function(){ g.flip(true); }; -// only needed to show "Fastloading..." on starting the launcher +let cache = require("Storage").readJSON("fastload.cache") || {}; + +function checkApp(n){ + print("checking", n); + // no widgets, no problem + if (!global.WIDGETS) return true; + let app = require("Storage").read(n); + if (cache[n] && E.CRC32(app) == cache[n].crc) + return cache[n].fast + cache[n] = {}; + cache[n].fast = app.includes("Bangle.loadWidgets"); + cache[n].crc = E.CRC32(app); + require("Storage").writeJSON("fastload.cache", cache); + print("updated cache", cache[n]); + return cache[n].fast; +} + +global._load = load; + +function slowload(n){ + print("slowload", n); + global._load(n); +} + +function fastload(n){ + print("fastload", n) + if (!n || checkApp(n)){ + print("actually try fastloading using Bangle.load"); + // Bangle.load can call load, to prevent recursion this must be the system load + global.load = slowload; + Bangle.load(n); + // if fastloading worked, we need to set load back to this method + global.load = fastload; + } + else + slowload(n); +}; +global.load = fastload; + Bangle.load = (o => (name) => { + print("Bangle.load", name); if (Bangle.uiRemove) loadingScreen(); - setTimeout(o,0,name); + if (SETTINGS.autoloadLauncher && !name){ + print("redirect to launcher"); + let orig = Bangle.load; + Bangle.load = (n)=>{ + Bangle.load = orig; + fastload(n); + } + Bangle.showLauncher(); + Bangle.load = orig; + } else + o(name); })(Bangle.load); }