2020-08-21 13:59:43 +00:00
if ( window . location . host == "banglejs.com" ) {
document . getElementById ( "apploaderlinks" ) . innerHTML =
'This is the official Bangle.js App Loader - you can also try the <a href="https://espruino.github.io/BangleApps/">Development Version</a> for the most recent apps.' ;
} else if ( window . location . host == "espruino.github.io" ) {
document . title += " [Development]" ;
document . getElementById ( "apploaderlinks" ) . innerHTML =
'This is the development Bangle.js App Loader - you can also try the <a href="https://banglejs.com/apps/">Official Version</a> for stable apps.' ;
} else {
document . title += " [Unofficial]" ;
document . getElementById ( "apploaderlinks" ) . innerHTML =
'This is not the official Bangle.js App Loader - you can try the <a href="https://banglejs.com/apps/">Official Version</a> here.' ;
}
2021-09-16 09:49:29 +00:00
var RECOMMENDED _VERSION = "2v10" ;
2020-10-21 13:48:30 +00:00
// could check http://www.espruino.com/json/BANGLEJS.json for this
2021-10-20 14:20:25 +00:00
// We're only interested in Bangles
DEVICEINFO = DEVICEINFO . filter ( x => x . id . startsWith ( "BANGLEJS" ) ) ;
// Set up source code URL
2020-08-21 13:59:43 +00:00
( function ( ) {
let username = "espruino" ;
let githubMatch = window . location . href . match ( /\/(\w+)\.github\.io/ ) ;
if ( githubMatch ) username = githubMatch [ 1 ] ;
2020-10-21 13:48:30 +00:00
Const . APP _SOURCECODE _URL = ` https://github.com/ ${ username } /BangleApps/tree/master/apps ` ;
2020-08-21 13:59:43 +00:00
} ) ( ) ;
2020-10-21 13:48:30 +00:00
2021-10-20 14:20:25 +00:00
// When a device is found, filter the apps accordingly
2020-10-21 13:48:30 +00:00
function onFoundDeviceInfo ( deviceId , deviceVersion ) {
2021-10-29 07:33:31 +00:00
var fwURL = "#" ;
2021-06-30 12:24:58 +00:00
if ( deviceId == "BANGLEJS" ) {
2021-10-29 07:33:31 +00:00
fwURL = "https://www.espruino.com/Bangle.js#firmware-updates" ;
2021-06-30 12:24:58 +00:00
Const . MESSAGE _RELOAD = 'Hold BTN3\nto reload' ;
}
if ( deviceId == "BANGLEJS2" ) {
2021-10-29 07:33:31 +00:00
fwURL = "https://www.espruino.com/Bangle.js2#firmware-updates" ;
2021-06-30 15:22:49 +00:00
Const . MESSAGE _RELOAD = 'Hold button\nto reload' ;
2021-06-30 12:24:58 +00:00
}
2021-10-20 14:20:25 +00:00
2021-10-29 07:33:31 +00:00
if ( deviceId != "BANGLEJS" && deviceId != "BANGLEJS2" ) {
showToast ( ` You're using ${ deviceId } , not a Bangle.js. Did you want <a href="https://espruino.com/apps">espruino.com/apps</a> instead? ` , "warning" , 20000 ) ;
} else if ( versionLess ( deviceVersion , RECOMMENDED _VERSION ) ) {
showToast ( ` You're using an old Bangle.js firmware ( ${ deviceVersion } ). You can <a href=" ${ fwURL } " target="_blank">update with the instructions here</a> ` , "warning" , 20000 ) ;
}
2021-10-20 14:20:25 +00:00
// check against features shown?
filterAppsForDevice ( deviceId ) ;
/ * i f w e ' d s a v e d a d e v i c e I D b u t t h i s d e v i c e i s d i f f e r e n t , e n s u r e
we ask again next time * /
var savedDeviceId = getSavedDeviceId ( ) ;
if ( savedDeviceId !== undefined && savedDeviceId != deviceId )
setSavedDeviceId ( undefined ) ;
}
var originalAppJSON = undefined ;
function filterAppsForDevice ( deviceId ) {
2021-11-10 13:06:15 +00:00
if ( originalAppJSON === undefined && appJSON . length )
2021-10-20 14:20:25 +00:00
originalAppJSON = appJSON ;
var device = DEVICEINFO . find ( d => d . id == deviceId ) ;
// set the device dropdown
document . querySelector ( ".devicetype-nav span" ) . innerText = device ? device . name : "All apps" ;
if ( ! device ) {
if ( deviceId !== undefined )
showToast ( ` Device ID ${ deviceId } not recognised. Some apps may not work ` , "warning" ) ;
appJSON = originalAppJSON ;
} else {
// Now filter apps
appJSON = originalAppJSON . filter ( app => {
var supported = [ "BANGLEJS" ] ;
if ( ! app . supports ) {
console . log ( ` App ${ app . id } doesn't include a 'supports' field - ignoring ` ) ;
return false ;
}
if ( app . supports . includes ( deviceId ) ) return true ;
//console.log(`Dropping ${app.id} because ${deviceId} is not in supported list ${app.supports.join(",")}`);
return false ;
} ) ;
}
refreshLibrary ( ) ;
2020-10-21 13:48:30 +00:00
}
2021-10-20 14:20:25 +00:00
// If 'remember' was checked in the window below, this is the device
function getSavedDeviceId ( ) {
let deviceId = localStorage . getItem ( "deviceId" ) ;
if ( ( "string" == typeof deviceId ) && DEVICEINFO . find ( d => d . id == deviceId ) )
return deviceId ;
return undefined ;
}
function setSavedDeviceId ( deviceId ) {
localStorage . setItem ( "deviceId" , deviceId ) ;
}
// At boot, show a window to choose which type of device you have...
window . addEventListener ( 'load' , ( event ) => {
let deviceId = getSavedDeviceId ( )
2021-11-10 13:06:15 +00:00
if ( deviceId !== undefined ) return ; // already chosen
2021-10-20 14:20:25 +00:00
var html = ` <div class="columns">
$ { DEVICEINFO . map ( d => `
< div class = "column col-6 col-xs-6" >
< div class = "card devicechooser" deviceid = "${d.id}" style = "cursor:pointer" >
< div class = "card-header" >
< div class = "card-title h5" > $ { d . name } < / d i v >
<!-- < div class = "card-subtitle text-gray" > ... < / d i v > - - >
< / d i v >
< div class = "card-image" >
< img src = "${d.img}" alt = "${d.name}" width = "256" height = "256" class = "img-responsive" >
< / d i v >
< / d i v >
< / d i v > ` ) . j o i n ( " \ n " ) }
< / d i v > < d i v c l a s s = " c o l u m n s " >
< div class = "column col-12" >
< div class = "form-group" >
< label class = "form-switch" >
< input type = "checkbox" id = "remember_device" >
< i class = "form-icon" > < / i > D o n ' t a s k a g a i n
< / l a b e l >
< / d i v >
< / d i v >
< / d i v > ` ;
showPrompt ( "Which Bangle.js?" , html , { } , false ) ;
htmlToArray ( document . querySelectorAll ( ".devicechooser" ) ) . forEach ( button => {
button . addEventListener ( "click" , event => {
let rememberDevice = document . getElementById ( "remember_device" ) . checked ;
let button = event . currentTarget ;
let deviceId = button . getAttribute ( "deviceid" ) ;
hidePrompt ( ) ;
console . log ( "Chosen device" , deviceId ) ;
setSavedDeviceId ( rememberDevice ? deviceId : undefined ) ;
filterAppsForDevice ( deviceId ) ;
} ) ;
} ) ;
} ) ;
window . addEventListener ( 'load' , ( event ) => {
2021-10-21 09:14:40 +00:00
// Hook onto device chooser dropdown
2021-10-20 14:20:25 +00:00
htmlToArray ( document . querySelectorAll ( ".devicetype-nav .menu-item" ) ) . forEach ( button => {
button . addEventListener ( "click" , event => {
var a = event . target ;
var deviceId = a . getAttribute ( "dt" ) || undefined ;
filterAppsForDevice ( deviceId ) ; // also sets the device dropdown
setSavedDeviceId ( undefined ) ; // ask at startup next time
document . querySelector ( ".devicetype-nav span" ) . innerText = a . innerText ;
} ) ;
} ) ;
2021-10-21 09:14:40 +00:00
// Button to install all default apps in one go
document . getElementById ( "installdefault" ) . addEventListener ( "click" , event => {
getInstalledApps ( ) . then ( ( ) => {
if ( device . id == "BANGLEJS" )
2021-10-29 07:33:31 +00:00
return httpGet ( "defaultapps_banglejs1.json" ) ;
2021-10-21 09:14:40 +00:00
if ( device . id == "BANGLEJS2" )
return httpGet ( "defaultapps_banglejs2.json" ) ;
throw new Error ( "Unknown device " + device . id ) ;
} ) . then ( json => {
return installMultipleApps ( JSON . parse ( json ) , "default" ) ;
} ) . catch ( err => {
Progress . hide ( { sticky : true } ) ;
showToast ( "App Install failed, " + err , "error" ) ;
} ) ;
} ) ;
2021-10-20 14:20:25 +00:00
} ) ;
2021-10-26 12:15:21 +00:00
function onAppJSONLoaded ( ) {
2021-11-10 13:06:15 +00:00
let deviceId = getSavedDeviceId ( )
if ( deviceId !== undefined )
filterAppsForDevice ( deviceId ) ;
2021-10-26 12:15:21 +00:00
return new Promise ( resolve => {
httpGet ( "screenshots.json" ) . then ( screenshotJSON => {
var screenshots = [ ] ;
try {
screenshots = JSON . parse ( screenshotJSON ) ;
} catch ( e ) {
console . error ( "Screenshot JSON Corrupted" , e ) ;
}
screenshots . forEach ( s => {
var app = appJSON . find ( a => a . id == s . id ) ;
if ( ! app ) return ;
if ( ! app . screenshots ) app . screenshots = [ ] ;
app . screenshots . push ( { url : s . url } ) ;
} )
} ) . catch ( err => {
console . log ( "No screenshots.json found" ) ;
resolve ( ) ;
} ) ;
} ) ;
}