From f848f69770a095c358eff3572c94fd56b6403c45 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 6 Dec 2021 14:27:11 +0000 Subject: [PATCH 1/8] messages 0.35: Change App/Widget settings to 'App Settings' so it fits on Bangle screen --- apps.json | 2 +- apps/messages/ChangeLog | 3 ++- apps/messages/README.md | 12 +++++++++-- apps/messages/app.js | 45 +++++++++++++++++++++++++++++++++------ apps/messages/lib.js | 13 +++++------ apps/messages/settings.js | 7 ++++++ apps/messages/widget.js | 11 ++++++++-- 7 files changed, 74 insertions(+), 19 deletions(-) diff --git a/apps.json b/apps.json index 79ec4066c..d5726ad0c 100644 --- a/apps.json +++ b/apps.json @@ -57,7 +57,7 @@ { "id": "messages", "name": "Messages", - "version": "0.08", + "version": "0.09", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 5c65b150d..79fea07ea 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -8,5 +8,6 @@ Back now marks a message as read Clicking top-left opens a menu which allows you to delete a message or mark unread 0.07: Added settings menu with option to choose vibrate pattern and frequency (fix #909) -0.08: Fix rendering of long messages (fix #969) +0.08: Fix rendering of long messages (fix #969) buzz on new message (fix #999) +0.09: Message now disappears after 60s if no action taken and clock loads (fix 922) diff --git a/apps/messages/README.md b/apps/messages/README.md index c243ec06a..e9aa128d1 100644 --- a/apps/messages/README.md +++ b/apps/messages/README.md @@ -8,9 +8,17 @@ and responded to. It is a replacement for the old `notify`/`gadgetbridge` apps. -## Usage +## Settings + +You can change settings by going to the global `Settings` app, then `App Settings` +and `Messages`: + +* `Vibrate` - This is the pattern of buzzes that should be made when a new message is received +* `Repeat` - How often should buzzes repeat - the default of 4 means the Bangle will buzz every 4 seconds +* `Unread Timer` - when a new message is received we go into the Messages app. +If there is no user input for this amount of time then the app will exit and return +to the clock where `MESSAGES` will be shown in the Widget bar. -... ## Requests diff --git a/apps/messages/app.js b/apps/messages/app.js index 6c9972fd8..398dcac24 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -42,7 +42,12 @@ try { }; } - +/** this is a timeout if the app has started and is showing a single message +but the user hasn't seen it (eg no user input) - in which case +we should start a timeout for settings.unreadTimeout to return +to the clock. */ +var unreadTimeout; +/// List of all our messages var MESSAGES = require("Storage").readJSON("messages.json",1)||[]; if (!Array.isArray(MESSAGES)) MESSAGES=[]; var onMessagesModified = function(msg) { @@ -171,8 +176,14 @@ function showMessageSettings(msg) { function showMessage(msgid) { var msg = MESSAGES.find(m=>m.id==msgid); if (!msg) return checkMessages(); // go home if no message found - if (msg.src=="Maps") return showMapMessage(msg); - if (msg.id=="music") return showMusicMessage(msg); + if (msg.src=="Maps") { + cancelReloadTimeout(); // don't auto-reload to clock now + return showMapMessage(msg); + } + if (msg.id=="music") { + cancelReloadTimeout(); // don't auto-reload to clock now + return showMusicMessage(msg); + } // Normal text message display var title=msg.title, titleFont = fontLarge, lines; if (title) { @@ -186,14 +197,15 @@ function showMessage(msgid) { } var buttons = [ {type:"btn", src:getBackImage(), cb:()=>{ - msg.new = false; // read mail - saveMessages(); + msg.new = false; saveMessages(); // read mail + cancelReloadTimeout(); // don't auto-reload to clock now checkMessages({clockIfNoMsg:1,clockIfAllRead:0,showMsgIfUnread:1}); }} // back ]; if (msg.positive) { buttons.push({type:"btn", src:getPosImage(), cb:()=>{ msg.new = false; saveMessages(); + cancelReloadTimeout(); // don't auto-reload to clock now Bangle.messageResponse(msg,true); checkMessages({clockIfNoMsg:1,clockIfAllRead:1,showMsgIfUnread:1}); }}); @@ -202,6 +214,7 @@ function showMessage(msgid) { buttons.push({type:"btn", src:getNegImage(), cb:()=>{ console.log("Response"); msg.new = false; saveMessages(); + cancelReloadTimeout(); // don't auto-reload to clock now Bangle.messageResponse(msg,false); checkMessages({clockIfNoMsg:1,clockIfAllRead:1,showMsgIfUnread:1}); }}); @@ -210,7 +223,10 @@ function showMessage(msgid) { var body = (lines.length>4) ? lines.slice(0,4).join("\n")+"..." : lines.join("\n"); layout = new Layout({ type:"v", c: [ {type:"h", fillx:1, bgCol:colBg, c: [ - { type:"btn", src:getMessageImage(msg), cb:()=>showMessageSettings(msg) }, + { type:"btn", src:getMessageImage(msg), cb:()=>{ + cancelReloadTimeout(); // don't auto-reload to clock now + showMessageSettings(msg); + }}, { type:"v", fillx:1, c: [ {type:"txt", font:fontSmall, label:msg.src||"Message", bgCol:colBg, fillx:1, pad:2, halign:1 }, title?{type:"txt", font:titleFont, label:title, bgCol:colBg, fillx:1, pad:2 }:{}, @@ -249,7 +265,8 @@ function checkMessages(options) { // no new messages - go to clock? if (options.clockIfAllRead && newMessages.length==0) return load(); - + // we don't have to time out of this screen... + cancelReloadTimeout(); // Otherwise show a menu E.showScroller({ h : 48, @@ -291,9 +308,23 @@ function checkMessages(options) { }); } +function cancelReloadTimeout() { + if (!unreadTimeout) return; + clearTimeout(unreadTimeout); + unreadTimeout = undefined; +} + + g.clear(); Bangle.loadWidgets(); Bangle.drawWidgets(); setTimeout(() => { + var unreadTimeoutSecs = (require('Storage').readJSON("messages.settings.json", true) || {}).unreadTimeout; + if (unreadTimeoutSecs===undefined) unreadTimeoutSecs=60; + if (unreadTimeoutSecs) + unreadTimeout = setTimeout(function() { + print("Message not seen - reloading"); + load(); + }, unreadTimeoutSecs*1000); checkMessages({clockIfNoMsg:0,clockIfAllRead:0,showMsgIfUnread:1}); },10); // if checkMessages wants to 'load', do that diff --git a/apps/messages/lib.js b/apps/messages/lib.js index 4593c8605..e93a5e2ba 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -1,10 +1,10 @@ +/* Push a new message onto messages queue, event is: + {t:"add",id:int, src,title,subject,body,sender,tel, important:bool} // add new + {t:"add",id:int, id:"music", state, artist, track, etc} // add new + {t:"remove-",id:int} // remove + {t:"modify",id:int, title:string} // modified +*/ exports.pushMessage = function(event) { - /* event is: - {t:"add",id:int, src,title,subject,body,sender,tel, important:bool} // add new - {t:"add",id:int, id:"music", state, artist, track, etc} // add new - {t:"remove-",id:int} // remove - {t:"modify",id:int, title:string} // modified - */ var messages, inApp = "undefined"!=typeof MESSAGES; if (inApp) messages = MESSAGES; // we're in an app that has already loaded messages @@ -43,6 +43,7 @@ exports.pushMessage = function(event) { WIDGETS.messages.show(); }, 500); } +/// Remove all messages exports.clearAll = function(event) { var messages, inApp = "undefined"!=typeof MESSAGES; if (inApp) { diff --git a/apps/messages/settings.js b/apps/messages/settings.js index ef6266cf6..fd8ce8f39 100644 --- a/apps/messages/settings.js +++ b/apps/messages/settings.js @@ -3,6 +3,7 @@ let settings = require('Storage').readJSON("messages.settings.json", true) || {}; if (settings.vibrate===undefined) settings.vibrate="."; if (settings.repeat===undefined) settings.repeat=4; + if (settings.unreadTimeout===undefined) settings.unreadTimeout=60; return settings; } function updateSetting(setting, value) { @@ -30,6 +31,12 @@ format: v => v+"s", onchange: v => updateSetting("repeat", v) }, + 'Unread timer': { + value: settings().unreadTimeout, + min: 0, max: 240, step : 10, + format: v => v?v+"s":"Off", + onchange: v => updateSetting("unreadTimeout", v) + }, }; E.showMenu(mainmenu); }) diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 3a22b40fd..245a303fc 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -1,4 +1,3 @@ - WIDGETS["messages"]={area:"tl",width:0,draw:function() { if (!this.width) return; var c = (Date.now()-this.t)/1000; @@ -13,9 +12,10 @@ WIDGETS["messages"]={area:"tl",width:0,draw:function() { WIDGETS["messages"].buzz(); // buzz every 4 seconds } setTimeout(()=>WIDGETS["messages"].draw(), 1000); -},show:function() { +},show:function(quiet) { WIDGETS["messages"].t=Date.now(); // first time WIDGETS["messages"].l=Date.now()-10000; // last buzz + if (quiet) WIDGETS["messages"].t -= 500000; // if quiet, set last time in the past so there is no buzzing WIDGETS["messages"].width=64; Bangle.drawWidgets(); Bangle.setLCDPower(1);// turns screen on @@ -34,3 +34,10 @@ WIDGETS["messages"]={area:"tl",width:0,draw:function() { } b(); }}; +/* We might have returned here if we were in the Messages app for a +message but then the watch was never viewed. In that case we don't +want to buzz but should still show that there are unread messages. */ +if (global.MESSAGES===undefined) (function() { + var messages = require("Storage").readJSON("messages.json",1)||[]; + if (messages.some(m=>m.new)) WIDGETS["messages"].show(true); +})(); From 5501b749940967a2a0665e955fbdb0b8dc4e8173 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 6 Dec 2021 15:09:48 +0000 Subject: [PATCH 2/8] chronowid 0.04: Change to 7 segment font, move to top widget bar Better auto-update behaviour, less RAM used --- apps.json | 3 +- apps/chronowid/ChangeLog | 4 +- apps/chronowid/README.md | 11 ++- apps/chronowid/app.js | 9 ++- apps/chronowid/chrono_with_pastel.jpg | Bin 29883 -> 0 bytes apps/chronowid/chrono_with_wave.jpg | Bin 61355 -> 0 bytes apps/chronowid/screenshot.png | Bin 0 -> 2920 bytes apps/chronowid/widget.js | 106 +++++++++++--------------- 8 files changed, 61 insertions(+), 72 deletions(-) delete mode 100644 apps/chronowid/chrono_with_pastel.jpg delete mode 100644 apps/chronowid/chrono_with_wave.jpg create mode 100644 apps/chronowid/screenshot.png diff --git a/apps.json b/apps.json index d5726ad0c..83016448a 100644 --- a/apps.json +++ b/apps.json @@ -1989,11 +1989,12 @@ "id": "chronowid", "name": "Chrono Widget", "shortName": "Chrono Widget", - "version": "0.03", + "version": "0.04", "description": "Chronometer (timer) which runs as widget.", "icon": "app.png", "tags": "tool,widget", "supports": ["BANGLEJS","BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], "readme": "README.md", "storage": [ {"name":"chronowid.wid.js","url":"widget.js"}, diff --git a/apps/chronowid/ChangeLog b/apps/chronowid/ChangeLog index e173467a1..ded543397 100644 --- a/apps/chronowid/ChangeLog +++ b/apps/chronowid/ChangeLog @@ -1,3 +1,5 @@ 0.01: New widget and app! 0.02: Setting to reset values, timer buzzes at 00:00 and not later (see readme) -0.03: Display only minutes:seconds when less than 1 hour left \ No newline at end of file +0.03: Display only minutes:seconds when less than 1 hour left +0.04: Change to 7 segment font, move to top widget bar + Better auto-update behaviour, less RAM used diff --git a/apps/chronowid/README.md b/apps/chronowid/README.md index ec1d5dd46..6e0aba681 100644 --- a/apps/chronowid/README.md +++ b/apps/chronowid/README.md @@ -5,14 +5,13 @@ The advantage is, that you can still see your normal watchface and other widgets The widget is always active, but only shown when the timer is on. Hours, minutes, seconds and timer status can be set with an app. -When there is less than one seconds left on the timer it buzzes. +When there is less than one second left on the timer it buzzes. The widget has been tested on Bangle 1 and Bangle 2 ## Screenshots -![](chrono_with_wave.jpg) -![](chrono_with_pastel.jpg) +![](screenshot.png) ## Features @@ -28,15 +27,15 @@ There are no settings section in the settings app, timer can be set using an app * Hours: Set the hours for the timer * Minutes: Set the minutes for the timer * Seconds: Set the seconds for the timer -* Timer on: Starts the timer and displays the widget when set to 'On'. You have to leave the app to load the widget which starts the timer. The widget is always there, but only visible when timer is on. +* Timer on: Starts the timer and displays the widget when set to 'On'. You have to leave the app to load the widget which starts the timer. The widget is always there, but only visible when timer is on. ## Releases -* Offifical app loader: https://github.com/espruino/BangleApps/tree/master/apps/chronowid (https://banglejs.com/apps/) +* Official app loader: https://github.com/espruino/BangleApps/tree/master/apps/chronowid (https://banglejs.com/apps/) * Forked app loader: https://github.com/Purple-Tentacle/BangleApps/tree/master/apps/chronowid (https://purple-tentacle.github.io/BangleApps/index.html#) * Development: https://github.com/Purple-Tentacle/BangleAppsDev/tree/master/apps/chronowid ## Requests -If you have any feature requests, please write here: http://forum.espruino.com/conversations/345972/ \ No newline at end of file +If you have any feature requests, please write here: http://forum.espruino.com/conversations/345972/ diff --git a/apps/chronowid/app.js b/apps/chronowid/app.js index 0cacdee23..f38105e34 100644 --- a/apps/chronowid/app.js +++ b/apps/chronowid/app.js @@ -3,7 +3,6 @@ Bangle.loadWidgets(); Bangle.drawWidgets(); const storage = require('Storage'); -const boolFormat = v => v ? "On" : "Off"; let settingsChronowid; function updateSettings() { @@ -12,6 +11,7 @@ function updateSettings() { now.getHours() + settingsChronowid.hours, now.getMinutes() + settingsChronowid.minutes, now.getSeconds() + settingsChronowid.seconds); settingsChronowid.goal = goal.getTime(); storage.writeJSON('chronowid.json', settingsChronowid); + if (WIDGETS["chronowid"]) WIDGETS["chronowid"].reload(); } function resetSettings() { @@ -44,6 +44,7 @@ function showMenu() { timerMenu.started.value = settingsChronowid.started; } }, + '< Back' : ()=>{load();}, 'Reset values': function() { settingsChronowid.hours = 0; settingsChronowid.minutes = 0; @@ -84,15 +85,15 @@ function showMenu() { }, 'Timer on': { value: settingsChronowid.started, - format: boolFormat, + format: v => v ? "On" : "Off", onchange: v => { settingsChronowid.started = v; updateSettings(); } }, }; - timerMenu['-Exit-'] = ()=>{load();}; + return E.showMenu(timerMenu); } -showMenu(); \ No newline at end of file +showMenu(); diff --git a/apps/chronowid/chrono_with_pastel.jpg b/apps/chronowid/chrono_with_pastel.jpg deleted file mode 100644 index 2f5993e79cd54fc590a5ef534adfb09eb26d996b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29883 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�*5)8`ksFQ}K!J!fzWzs*sQ<-DfniE=dGhj|j8`wO99X(_%? ztT43es(Yw~Yu*k>C$y`eThx(E&&Cj^D7%_HGz$+~R z>~BKHoC9stuS-~Xw(9Lv)L@X7lT*!F=J2{ab8{c}JXh)BOH_OqRMndVx7!r96qR(v zY3+&a7uUI^8P{Ieb&pcpnUwTZhf$&FG&N!n^O#*SJrh0m|C8DUfEVbU7uEzOmwDQ2R2@Y?;&&z(7R@Et8R#bK&#!+hQdjizJEq)Pr>~1>m|?B)GLek3|IAt7O0(j96WQQOmwsW7vH-W zmP?I3ZW5XCjbKvmj%b7MQoTP_uJzf8jpjNkt2&9LTLl2DJI~^3A>27Oks#`$-7^|j zR4HXVL8@KMp=_!qRBAGBK>lpFb1Ze;n7VoK#1CUSCcqN3R76=P`i*ik2iu_0bf1$%NH85f}n;ZqEEeTu6 z&qd`Yq+d)+pYv+m?w*|`3=-arj=p2lSJ$~N3x&$kgq_7E60!?5Y(S+&rTRgg$6dnGv63 z^#v*+&ze}knK;iuU1`e-Ii6z%f&pdTJMPp%J8CEga(R12Igp5iC_p{TF(V+yLREdn z!_&5N+;mdUs+r27?pqh{>Ym6fp)x6vt|_vxnM_`md@~w{R{QLP_ zuiUFgDCBQF$<#!L@bih&<_Eua>SG#DpVnUBsNXtDTWW$$L3^}L7!>o=v?~Of2mZEr zJ%6?NI0u#Ke*S`t@kZLS2qG9F*H}^Y15oG;*wD1<3B-P|As^hR;ojZ|3*eYbK1e84 zS^c=i&hx=W!fqkP4;BvI{mhf4bE+JJ)_IS)w2=L^rgrZ4Bh4NUyH8*qCL+?;u#X13p;(_J|k9=-BDoAedLYPSZr!Z+f!V*mCtv7n45ml%Dr7e9&_8600a@%fF^OO@Y`-LggCD=K zJftto$44@Re$cIFrdFX;huT8py25*w;QcA!hI?07>fa6@O__HQNKPO7c@EjX`?q&S z=$LM~=WFU(JqPy1{tp0|#GKv3?_}`Yr5TqQ%bKY~9-NW2=?1p!hLRC5eRP|4p`qhz z%44oMr99WwS#_jm`XydfB>v_Pz_leSb6p6WJuVHQvG!f~m?|99C}tbit>mkq;jE%h zfNz!Ji45Dow?HL($!Qz%wQoKLITcQUSL4xLILG92h?MTJB15QqMZTkU;fgstp+tDR zGC0-e(NWlK%#pai2c$4p?4_5ABZWW)M?Xz`U^+U$sN#O}RradW4MxW&+A5Q`rQh#z zUax4oHZ**>Qd)Z|qC$Hcz+2w(NN*h<&`;%vJawNaP{>GCH4KTp4Bk6`nh0fHhp4vr zY8`A_9XnNBo2z*TE~gOME2tXWti{{75s#yJpIu#LTqT%mmXB4jRpvphQePV?QgwPD z)=yWT+0Rqq<)D6oW)l1+;K)uqiw}7SQ-u^p1Xx|ShI@(XOVC~7A(oIr4u$jzC1?NbG*}(Y7J-zD9f;y0mggV&cC9J=&bpNyc*cX zcNs@bt5~Q*b|aQ(jjDyhXG=1*6-yry?l)5_N%S*>WoWDRDV8R2Je6Ql^04mHJ^(Fi b9~BJ{2M;nzaQP1a3-x8SY=!=3!k`ObG9 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 RNxorkG7uK~AHshd{{z#+XtV$T diff --git a/apps/chronowid/screenshot.png b/apps/chronowid/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f94eece94099f8e5e72db95bd1f6dd3e5a58a7b4 GIT binary patch literal 2920 zcmb_eS5%YR68@8rKPm&p8b7a+DT_yA%1Co004yS?W|n6 zk@oN5LvVd##}{92fP}l+S^$q3hvoo4K;GWU{7jVZ&(g8{&$5D6D*OAxW-4<=p=eq= z>Wy=;k1+#z;HKBg1#aqH$n z>`V6-&Xj5XD6A2dR<;wr>-}Q#xSNs1B~3Y*0k9XJ8F^YZ4`8K-gf`NT_7XMEUOuR; z2@FJsGn!#^B;b99pNorJVd5@GoUH2uiwzQx-*$A?R>!AJ z575JRzUtD%Q`}1%;!!HZOLYlzf6m3Ue#!i8=|_GZonKlV(-|lCee>k24K~uucd&mi z`ru&9fw;(&8ckydUXpdUjW{Vmx&+%^2bqkqs9m1!P8%5=2nx?n-L#0kIb&~t)m@sM zC;A4tFv|i}&fJe&pO0vLOCe1_MpdrL{tNqUM%{qoIz7 ze0K_Df8}` zq56Y2odt2^kslv0uf$5eMrE~!jQYsKrjdlT6x=xJ^>cwH<;OgpUB$A=?6!Z#qXsXK zjVa~AL$YOoHEPB;$UQL{b#J9)L*wst|D^>Do|$KWC0EucW*d4iB`^XWSVk!BEQT;- z!o&%KyVB?T!$=D((LUCXb-n(gPa#T3CQBUS*?;akBz7Shj}dq)(;LVe5V^0nEQVd; z2k^(ehl1RbQNcp=M)0u>|7-ebny$!P~Id!&dM5yg|=;DVTQTy`BmW+Ju;9gx&wN7=+SGhSn3{6A>h)MHep(s7-d4qYS|2a zS8_^kCOU3?JG|EE94Xmrqy)giu&`L&Q?t$qoD9RyI0(!6ch-x3 z^%iP_KO_5W%aOzBsy)M$4Jj3GZ0l2ezUajL_OB-L<72L=fDymW_T9z>lnP2<&aJ;7 z-=hyy?F{7YT+@QuMcNE4{bXXK;7x(Ew%fN62F&ZxS|*hjcWfvU{L^rDddGzL%A?{S ze{DCU7*)irpYLw#3+tU?IRP{q9QLr;mALW9cK6Aaku)K=g0VPlOD{6GQkkp{m(Vfa zFtD+ZzZ(%aEi8>RizDxF-{z(JSI8R0rC@3lnW04Ly6wUj>;|o3CtK3O)f% z{-~Gx*?i1)F5n-xm4sD%h@`T15Cu?&D}oLWObqe7oq0NK`_oLzeoXqgWk`Zu_*z5-H(MbBfl;OI#PFit8?5X zLrtL?0ff0I2h&eggF(?g2<%b8X$WIml{F7k&QTMy43|Uv8`iCp7 z;TN7B<$YhNw{<(@XF!Jnn5?S}d2_#1nAWQ2fG@q)+wo?kzkujBuGpR*Lp|ZX!`krP zZJrP#n4j0wX5pd}hqwLP$f4xJWcM9CO3R@dA2pf>1<1Me-}F@g^E4^TW;|%Cl^N$f zH16baN1hYqZaTEikca+ucNQp?P^J1n7c4iMfr4)jsVZKlWT_c()S}^ezqG__y&@&i zi}D~xvh%4D1R^7_N`$buP)$^wI}G~~5qdLs!6CBh%H7w(A50;Uf$Rn(Q%y%vmI{6r zl_t%t0Jhk?1A=Gn`am^GZ`*x7c*o;U4v$e`;#n~G#5~%Jr2vjghOMfgt9aL3>jyzr zwI9^uNu44W6JJvfNWJHg12f|yo^otjpn+6l>IPLrw_&3wkzAID)K*5{Yrfj$G^r{# z#*yOExYX2`x*Y^6h{_Ipql%-@zcYNz`9%qtnR-|o2=tiE^$mVk3Xq&qRiwkEZk_HH zk4z|!l%nEb`Y8&KFe}yzCIWL literal 0 HcmV?d00001 diff --git a/apps/chronowid/widget.js b/apps/chronowid/widget.js index f0e785efd..2d1c78941 100644 --- a/apps/chronowid/widget.js +++ b/apps/chronowid/widget.js @@ -1,93 +1,79 @@ (() => { - const storage = require('Storage'); - settingsChronowid = storage.readJSON("chronowid.json",1)||{}; //read settingsChronowid from file - var height = 23; - var width = 58; + var settingsChronowid; var interval = 0; //used for the 1 second interval timer - var now = new Date(); + var diff; - var time = 0; - var diff = settingsChronowid.goal - now; - //Convert ms to time function getTime(t) { var milliseconds = parseInt((t % 1000) / 100), seconds = Math.floor((t / 1000) % 60), minutes = Math.floor((t / (1000 * 60)) % 60), hours = Math.floor((t / (1000 * 60 * 60)) % 24); - - hours = (hours < 10) ? "0" + hours : hours; - minutes = (minutes < 10) ? "0" + minutes : minutes; - seconds = (seconds < 10) ? "0" + seconds : seconds; - - return hours + ":" + minutes + ":" + seconds; + return hours.toString().padStart(2,0) + ":" + minutes.toString().padStart(2,0) + ":" + seconds.toString().padStart(2,0); } - function printDebug() { - print ("Nowtime: " + getTime(now)); - print ("Now: " + now); + /*function printDebug() { print ("Goaltime: " + getTime(settingsChronowid.goal)); print ("Goal: " + settingsChronowid.goal); print("Difftime: " + getTime(diff)); print("Diff: " + diff); print ("Started: " + settingsChronowid.started); print ("----"); - } + }*/ //counts down, calculates and displays function countDown() { - now = new Date(); + var now = new Date(); diff = settingsChronowid.goal - now; //calculate difference - WIDGETS["chronowid"].draw(); - //time is up + // time is up if (settingsChronowid.started && diff < 1000) { Bangle.buzz(1500); //write timer off to file settingsChronowid.started = false; - storage.writeJSON('chronowid.json', settingsChronowid); + require('Storage').writeJSON('chronowid.json', settingsChronowid); clearInterval(interval); //stop interval + interval = undefined; } - //printDebug(); + // calculates width and redraws accordingly + WIDGETS["chronowid"].redraw(); } - // draw your widget - function draw() { - if (!settingsChronowid.started) { - width = 0; - return; //do not draw anything if timer is not started - } - g.reset(); - if (diff >= 0) { - if (diff < 3600000) { //less than 1 hour left - width = 58; - g.clearRect(this.x,this.y,this.x+width,this.y+height); - g.setFont("6x8", 2); - g.drawString(getTime(diff).substring(3), this.x+1, this.y+5); //remove hour part 00:00:00 -> 00:00 - } - if (diff >= 3600000) { //one hour or more left - width = 48; - g.clearRect(this.x,this.y,this.x+width,this.y+height); - g.setFont("6x8", 1); - g.drawString(getTime(diff), this.x+1, this.y+((height/2)-4)); //display hour 00:00:00 - } - } - // not needed anymoe, because we check if diff < 1000 now, so 00:00 is displayed. - // else { - // width = 58; - // g.clearRect(this.x,this.y,this.x+width,this.y+height); - // g.setFont("6x8", 2); - // g.drawString("END", this.x+15, this.y+5); - // } - } - - if (settingsChronowid.started) interval = setInterval(countDown, 1000); //start countdown each second - // add the widget - WIDGETS["chronowid"]={area:"bl",width:width,draw:draw,reload:function() { - reload(); - Bangle.drawWidgets(); // relayout all widgets + WIDGETS["chronowid"]={area:"tl",width:0,draw:function() { + if (!this.width) return; + g.reset().setFontAlign(0,0).clearRect(this.x,this.y,this.x+this.width,this.y+23); + //g.drawRect(this.x,this.y,this.x+this.width-1, this.y+23); + var scale; + var timeStr; + if (diff < 3600000) { //less than 1 hour left + width = 58; + scale = 2; + timeStr = getTime(diff).substring(3); // remove hour part 00:00:00 -> 00:00 + } else { //one hour or more left + width = 48; + scale = 1; + timeStr = getTime(diff); //display hour 00:00:00 but small + } + // Font5x9Numeric7Seg - just build this in as it's tiny + g.setFontCustom(atob("AAAAAAAAAAIAAAQCAQAAAd0BgMBdwAAAAAAAdwAB0RiMRcAAAERiMRdwAcAQCAQdwAcERiMRBwAd0RiMRBwAAEAgEAdwAd0RiMRdwAcERiMRdwAFAAd0QiEQdwAdwRCIRBwAd0BgMBAAABwRCIRdwAd0RiMRAAAd0QiEQAAAAAAAAAA="), 32, atob("BgAAAAAAAAAAAAAAAAYCAAYGBgYGBgYGBgYCAAAAAAAABgYGBgYG"), 9 + (scale<<8)); + g.drawString(timeStr, this.x+this.width/2, this.y+12); + }, redraw:function() { + var last = this.width; + if (!settingsChronowid.started) this.width = 0; + else this.width = (diff < 3600000) ? 58 : 48; + if (last != this.width) Bangle.drawWidgets(); + else this.draw(); + }, reload:function() { + settingsChronowid = require('Storage').readJSON("chronowid.json",1)||{}; + if (interval) clearInterval(interval); + interval = undefined; + // start countdown each second + if (settingsChronowid.started) interval = setInterval(countDown, 1000); + // reset everything + countDown(); }}; //printDebug(); - countDown(); -})(); \ No newline at end of file + // set width correctly, start countdown each second + WIDGETS["chronowid"].reload(); +})(); From 16b92b613f29cf7b1dbdeb3bef59771099695ab0 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 6 Dec 2021 15:35:24 +0000 Subject: [PATCH 3/8] openstreetmap 0.11: Add slight offset to OSM data to align it properly + Fix alignment of satellite info text (fix #984) --- apps.json | 7 ++++--- apps/openstmap/ChangeLog | 2 ++ apps/openstmap/app.js | 4 ++-- apps/openstmap/custom.html | 20 +++++++++++++++++--- apps/openstmap/screenshot.png | Bin 0 -> 5711 bytes 5 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 apps/openstmap/screenshot.png diff --git a/apps.json b/apps.json index e02549843..099209894 100644 --- a/apps.json +++ b/apps.json @@ -1955,11 +1955,12 @@ "id": "openstmap", "name": "OpenStreetMap", "shortName": "OpenStMap", - "version": "0.10", - "description": "[BETA] Loads map tiles from OpenStreetMap onto your Bangle.js and displays a map of where you are", + "version": "0.11", + "description": "Loads map tiles from OpenStreetMap onto your Bangle.js and displays a map of where you are. Once installed this also adds map functionality to `GPS Recorder` and `Recorder` apps", "icon": "app.png", - "tags": "outdoors,gps", + "tags": "outdoors,gps,osm", "supports": ["BANGLEJS","BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], "custom": "custom.html", "customConnect": true, "storage": [ diff --git a/apps/openstmap/ChangeLog b/apps/openstmap/ChangeLog index 69c34ed4e..6cb9d061e 100644 --- a/apps/openstmap/ChangeLog +++ b/apps/openstmap/ChangeLog @@ -8,3 +8,5 @@ 0.08: Update for drag event refactor 0.09: Use current theme cols when drawing GPS info 0.10: Improve scale factor calculation to fix scaling issues (#984) +0.11: Add slight offset to OSM data to align it properly (fix #984) + Fix alignment of satellite info text diff --git a/apps/openstmap/app.js b/apps/openstmap/app.js index c33acd8ad..62597ca20 100644 --- a/apps/openstmap/app.js +++ b/apps/openstmap/app.js @@ -25,11 +25,11 @@ function drawMarker() { var fix; Bangle.on('GPS',function(f) { fix=f; - g.reset().clearRect(0,y1,240,y1+8).setFont("6x8").setFontAlign(0,0); + g.reset().clearRect(0,y1,g.getWidth()-1,y1+8).setFont("6x8").setFontAlign(0,0); var txt = fix.satellites+" satellites"; if (!fix.fix) txt += " - NO FIX"; - g.drawString(txt,120,y1 + 4); + g.drawString(txt,g.getWidth()/2,y1 + 4); drawMarker(); }); Bangle.setGPSPower(1, "app"); diff --git a/apps/openstmap/custom.html b/apps/openstmap/custom.html index eeb148f54..56dea1188 100644 --- a/apps/openstmap/custom.html +++ b/apps/openstmap/custom.html @@ -132,8 +132,10 @@ TODO: var zoom = map.getZoom(); var centerlatlon = map.getBounds().getCenter(); var center = map.project(centerlatlon, zoom).divideBy(OSMTILESIZE); - var ox = Math.round((center.x - Math.floor(center.x)) * OSMTILESIZE); - var oy = Math.round((center.y - Math.floor(center.y)) * OSMTILESIZE); + // Reason for 16px adjustment below not 100% known, but it seems to + // align everything perfectly: https://github.com/espruino/BangleApps/issues/984 + var ox = Math.round((center.x - Math.floor(center.x)) * OSMTILESIZE) + 16; + var oy = Math.round((center.y - Math.floor(center.y)) * OSMTILESIZE) + 16; center = center.floor(); // make sure we're in the middle of a tile // JS version of Bangle.js's projection function bproject(lat, lon) { @@ -155,8 +157,15 @@ TODO: var bd = bproject(pd.lat, pd.lng) var scale = bc.distanceTo(bd); - var tileGetters = []; + // test + /*var p = bproject(centerlatlon.lat, centerlatlon.lng); + var q = bproject(mylat, mylon); + var testPt = { + x : (q.x-p.x)/scale + (MAPSIZE/2), + y : (MAPSIZE/2) - (q.y-p.y)/scale + };*/ + var tileGetters = []; // Render everything to a canvas... var canvas = document.getElementById("maptiles"); canvas.style.display=""; @@ -173,6 +182,11 @@ TODO: tileGetters.push(new Promise(function(resolve,reject) { img.onload = function(){ ctx.drawImage(img,i*OSMTILESIZE - ox, j*OSMTILESIZE - oy); + /*if (testPt) { + ctx.fillStyle="green"; + ctx.fillRect(testPt.x-1, testPt.y-5, 3,10); + ctx.fillRect(testPt.x-5, testPt.y-1, 10,3); + }*/ resolve(); }; })); diff --git a/apps/openstmap/screenshot.png b/apps/openstmap/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..2895b562ebb2b8313b232a2422150b60f6c9662c GIT binary patch literal 5711 zcmV-V7O?4wP)Py02}wjjRCr$Po$H#bxDG_8-~XZae4%4n2wh6HWK6>Ob7lwQi@aPe8Iu0__wV1o z|DOLn5x8jtejb2tI&)9Aw+K7{e=!I@Kfi<5_TZmZV38O}X5j&Nk;%ED8 zX60!Uj=&4x7r2@dH-N8BldOI`3Jg#8wFRZ!ys4(Aq*~7#z?+v8?8F1`wR8Saty9?O z!1(7{IVl*@z0?zPfPembQ(h3+fB)%+VUGeA1blXtT!E=)MHE<8*kc06%RB(jp5-rU zkNQ^*vwo^@Javd#h)03H2(av-YE~g?A*jkmleh=q>{m-Di94P$Jg-wGPtj9d zkA<-Ou~%Qa{=Crsuy?x%NGA`{Iq)h2drl!%nTe+#X%Tq7k&zb4r=lw&@G$_tGS$d; zx3tXG%y@-1qU~NW$)DWjG=S+hTqB^N!S4Y{yC+gtq%1m?-g3Mz^xu*AOW#J`--jR> zBmIod>CBi+0ayy82eB4#>2n@%9?ZW?`}n=92*8pu_p}=UDGKuG^~d*)VSz2R;Q=UJ zZ=ZShM#topp9(NKNHhq1Vem!aOUr^PnwWu6h`(L60(6q;&licQN) zYJ${Ff#_zG=2rZ`DeE`5w$o5481S48EP-UoywZM5U!z(`JD;~gJ&mw^HM8~T; z^ZE(^A0TrSI11UF0B(?aM}kxYB2BvS35n^0pIgv3UUZjKNcMX>$Jh@z>J>z|8+fCOE3VJ!8%ivx8?x zzyI`ZoX_PuPtXC@5|PMYGJ_Qb{nfVTS9|)m62MV-BMT!k&t6%cob^~r9``PQy^gl) z5!iYl@)Va|w|1GTwvYAxoPGuU^dlvm3VcU^IV0#COa<5jJpy>oYW3Pjk_l^(Si95T zwLQ()c7k8^`>oXjI5MeQy}*E@-WsUVEMo0`6k=qoC;QNnxLNAd8;mIENHC(o<9+um z#QSXWaNBkdAx#4~3fXE3Y~>sh173Lv+-8GHEkrM{J@mi+UU-)N^0qaE@(JoCD%mcdN;Y&~|(BsO6#z=(a=`W<+>=gkpi!~-x=7oyUw zy$9fq2|apQ1yr^u4%>X90$*Vtc6fGAk1ih@V{Z{iD*W*PTRTbLF7v0hh*D6mU11?+ z1KbxgPk;ZeTM&nmxayALLmDgT0gNSlHng;dT6=d^;F&CVZE?U&1;!?K46y3Ey%nvG zQHR!B6fHv*!6v5=r?HdA$Y|`V6xai)a^6B#!b;-MAXW}$wC)(dxYBC*X8JKrm6S`mF#<37rbC1xN*K!2Iqn ziz8({&__Km_I4yn0_hONXS17v@z}d-G zRDqF2vBI47^g&hNXk{w}$=XFKcbL(mE`9>>_+Otw5n%4&IGj!0DiSQe%YF$I;6pac ze&e7=!5@JAxydeJ0<0b3Xh8F$j#oJe@@lp2fscFJ!&xKwBj4!asPd{&`+%r=HdHg~ zQvuF^R|C2dV9z30aQ6nDFVZ%?3fL;@>>c+C_ra$SSwL3+MAgnx91m_}LbN(4#1Fto zBy-BR9++>ft=V3nD*#5pM9W#B)qJy5cT_ErooS07IQQtg#b9+y7IOja1yuq+10Zfo zA|9_|@z4d$`+~xTp4CPdL?kv#(g}3x0I-xrM-n#4^Ns+g^EH%KC$eIMC?N0_+BM$NGsk91}nHFL+VdFly2jCtEd+xCUP5b>#3amZQqVeT%n+^2| z;B3$9J=Lr5xm9+-QsPksMkXFj3OC{C_~m&mA&u<5v(?%JIMVT6@TCDGTQi^o!0Kx zUIReqHd?M{u0^q<--&C`R=}$Tgq~1nfTO20!J6dFp;GdR?z)d?qUu-$ODSt@n&p%ioL0T7{Y__D&?a@FXvn4O_Ink(g57TkU~c z?D)x4i#g?Hr37xX6F>*P^${{p*fcu^gm5cz zD}b-I3*K?v);}Qf&k2N{6h`OxRsaKRq!)QkAl5yBxP=1G_Pdc4K>JqVS1aoLq!Wmx z0gi4Z5%99g&Hxy(B-=y+uVrfEUgZR$C2^6Hlw~c%Dgayks04VH`byALoj~w-Ne?sH znK~*mO98y1UHCSDtKmh!ysZNF0(_NPpA-d|9dNt9LV>H`_0D(sc{&)zb&k<`0UQ}P z5+vjVg4Toh)m4wsq^&y>=-xT@=4lBF(K9&Ff3h!$dV}|_Uu7Q-isf}O@asOSoj?FX zbBkOC@Q7WYYSAF;t9WbE78^Gu||dCTHN#@Ao85g0~Ge8{(@J_zM3^ zW0(zet2>gMEemkeE>NFq!RsXoXh3MWZv!~f^X|I{`BQ7R1~>{X1(I(+R-m(0SOXui z5T`F3e(?!J1-u(0v%Zxa1y}=7gZFS6kdVxI{q>H}_R|K^vDHo>tW%s!HTGiJvpepV zrxM^EHS7s$g~#%OezGyIdlEAS%Z&_l%e(#s} z9RXMxFXDl(0yrWZ5!Lp@0O7(EyetdR(@}9NCJERT@FD>n0oYq~8o=6#hNtMrZdV0w z)IuV$KZywf@F`(&AVWHG%HoCJ3eNiN0Hi;M#NhSSAmb#%JAvp`-!|dgJF6b{eZgB4 zVt?MdjI;nUfgZ7w$h?^rLQ1OmXFVOH_w)vAgW=VK#al`wGch<9u`VaINJDn z=M9|$w44gC2S^XN9FCD7NQ(;{^k}(ifS(fxe1^ooR*(294{&SSdZ|V>yjega1*xYeoDo9b1-SN&vT$3+{`N z6AcTD3>&A}Ejm}d^MFEqNN%HzA!?;TOh5O4=8D%=wbg#F#qk11+l=~EPmN{)%*PNp z7K_eXlqoO%C!X5V&fbQi5Oc6BczNAiH7p={0ru`YO+FZLG__-=%L0HyLieDzYn!U(? z_P_#i4vaL4Og>$`NC35fdhk{TuL|I7JA(S(h@yI)H!3m+S6-PE1@^#{I^kIfX+fZi z1TA;+Q$SMsi2zq9Z;NfOHTA&VnL`yAg`%gN1T$4xw9dme9Iy_S3Q3UD&$2AURSH}I zuXap|LK!LNDzKGEMLm`VLtCXIsyhlV8nnAB@F@u`dJ;Dyf!pTXQeaK_kj|YZT2aJS z7cYNMIY3P#Dy>->&s$41WEN@poB9YfXe85NW0JfcEkS_lsY@4C0`dY$wpyT`kF zZ6af;Qr|Y=$YR*aCjXG%-hPo9R{}ltQ8M+Kp4xf9&9V%%A5{R)Qr{V%B5fdIfz1EO zLLk;an$W0XqMftKWd=bDy0?=ciitdMxDw#1B#v`J8HsXca`5uNBQT8I+Y53BJKr43+aTb6y;ED#Xol@xf^2?Vu@Qlgk)ANMwz0*?SJne@^6 zxLw*$lbdyFO?4*^G4o=Vc|2zaAM zY3QIOZ|n81%0BFq4R#(`5Z=684R5Lf^S99|AhNdo6Bq*v2V|hDSQWst)Ynr*Z%4}V z%bDs+cDP?Rr*%@BaZk07pk%Jb9x_o+{fPi)LFswksuPF&f9T7wKjPeF<-py;;B z7aza>&I#NqYTP3@C;O+p(Cz^p*$On3i_}3^dHe4SfRP~fs4r0mvx(Uj;%)Uw&gXI@ugdB zx6QVU;-lo=EHw&A6vB#x59vcSz*%<012dZAXlmW7#z?HaF`O&}eH#r?Uao{lgV_q4 zy^6gtQ~`X2eee=0K2|F>QK2gZxC&m)4_TjEN}lO|k$_4Qnx&Yt0Y>1}phUp-fJWl& ziHWGd5qNvvwzsw}&woY-6e*7cv`2kcP2lJk2RzuUM2yzs#haJSp6{+C4w-oBlcX(w zSD!^6T=4$y%J0os;P19=aRlmX3u44NwKxOlDS5e91yDX zB2@}}MFLm#co^NeN6J~OgpxR9+m*6U?Ya1fs-)8@RQL%1(=m)dbmhGkccCOM6W}Z1 zMaJ<-37n*0cd`;Lz$1f+Bo9_*J3~<;ZB(i6?gzonWG8SLesrc9d$u*4#6^^I)dUV< zrwZV!{O?uAVx#T40HaUhdXlac0rmny15QCl9{D0_c_qLjJMBvM9`Y>obxOoHBFd(1 zVd%ZH%6)*!^i+o za3kfa0KU@yBETHHrSRt#&|NsI95VkW1wKvQ`>$#?D5dLs;1%(^4K-^tz^`2LOaWEgMNNkbxkOA}jh+0M>TR)l@bL{>dis zpI4O5`q(0LZzQ^F57R|B)S-XHJrrMtv_;jGH zon`mp0C31@!LEo&^?B8JcCUACBQ|fejZHiNAyi+dv=S()y51_ji$c@H=TiV4g~*%R zDxhgH?=Ds^iQ|4sIz_OOGbtIg7Khj2p6jS*{{;U_7vfa_j<$>1y=|<>>y%B-x$=%~ zRgyZRTSpJb-aVB7NBr+d47A01CpGQ@SQ{Xfb4iUO4*O8+T58xY{IvC%}(@e8PQ^%6%fhz4KF*oS{PJi2|L^{{hB+8qNW4`wjpA002ovPDHLkV1jDJ B!2|#R literal 0 HcmV?d00001 From 39b3a3fba290eeec05ec997e6928618c43296040 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 6 Dec 2021 15:38:06 +0000 Subject: [PATCH 4/8] messages Fix phone icon (#1014) --- apps/messages/ChangeLog | 1 + apps/messages/app.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 79fea07ea..196e85107 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -11,3 +11,4 @@ 0.08: Fix rendering of long messages (fix #969) buzz on new message (fix #999) 0.09: Message now disappears after 60s if no action taken and clock loads (fix 922) + Fix phone icon (#1014) diff --git a/apps/messages/app.js b/apps/messages/app.js index 398dcac24..c609acb4b 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -74,7 +74,7 @@ function getNegImage() { function getMessageImage(msg) { if (msg.img) return atob(msg.img); var s = (msg.src||"").toLowerCase(); - if (s=="Phone") return atob("FxeBABgAAPgAAfAAB/AAD+AAH+AAP8AAP4AAfgAA/AAA+AAA+AAA+AAB+AAB+AAB+OAB//AB//gB//gA//AA/8AAf4AAPAA="); + if (s=="phone") return atob("FxeBABgAAPgAAfAAB/AAD+AAH+AAP8AAP4AAfgAA/AAA+AAA+AAA+AAB+AAB+AAB+OAB//AB//gB//gA//AA/8AAf4AAPAA="); if (s=="skype") return atob("GhoBB8AAB//AA//+Af//wH//+D///w/8D+P8Afz/DD8/j4/H4fP5/A/+f4B/n/gP5//B+fj8fj4/H8+DB/PwA/x/A/8P///B///gP//4B//8AD/+AAA+AA=="); if (s=="hangouts") return atob("FBaBAAH4AH/gD/8B//g//8P//H5n58Y+fGPnxj5+d+fmfj//4//8H//B//gH/4A/8AA+AAHAABgAAAA="); if (s=="whatsapp") return atob("GBiBAAB+AAP/wAf/4A//8B//+D///H9//n5//nw//vw///x///5///4///8e//+EP3/APn/wPn/+/j///H//+H//8H//4H//wMB+AA=="); From 6b2350188f67eca67e5db91f3cb55cbd8a068920 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 6 Dec 2021 16:11:01 +0000 Subject: [PATCH 5/8] Bangle.js 2 customised welcome support --- apps.json | 7 +- apps/mywelcome/ChangeLog | 1 + apps/mywelcome/{app.js => app-bangle1.js} | 0 apps/mywelcome/app-bangle2.js | 254 ++++++++++++++++++++++ apps/mywelcome/custom.html | 13 +- apps/welcome/app-bangle2.js | 1 + 6 files changed, 268 insertions(+), 8 deletions(-) rename apps/mywelcome/{app.js => app-bangle1.js} (100%) create mode 100644 apps/mywelcome/app-bangle2.js diff --git a/apps.json b/apps.json index 099209894..ef939c7bb 100644 --- a/apps.json +++ b/apps.json @@ -263,16 +263,17 @@ "id": "mywelcome", "name": "Customised Welcome", "shortName": "My Welcome", - "version": "0.12", + "version": "0.13", "description": "Appears at first boot and explains how to use Bangle.js. Like 'Welcome', but can be customised with a greeting", "icon": "app.png", "tags": "start,welcome", - "supports": ["BANGLEJS"], + "supports": ["BANGLEJS","BANGLEJS2"], "custom": "custom.html", "screenshots": [{"url":"bangle1-customized-welcome-screenshot.png"}], "storage": [ {"name":"mywelcome.boot.js","url":"boot.js"}, - {"name":"mywelcome.app.js","url":"app.js"}, + {"name":"mywelcome.app.js","url":"app-bangle1.js","supports": ["BANGLEJS"]}, + {"name":"mywelcome.app.js","url":"app-bangle2.js","supports": ["BANGLEJS2"]}, {"name":"mywelcome.settings.js","url":"settings.js"}, {"name":"mywelcome.img","url":"app-icon.js","evaluate":true} ], diff --git a/apps/mywelcome/ChangeLog b/apps/mywelcome/ChangeLog index b012da933..f2b54e42c 100644 --- a/apps/mywelcome/ChangeLog +++ b/apps/mywelcome/ChangeLog @@ -14,3 +14,4 @@ 0.10: Add birthday style 0.11: Skip double buffering, use 240x240 size 0.12: Fix swipe direction (#800) +0.13: Bangle.js 2 support diff --git a/apps/mywelcome/app.js b/apps/mywelcome/app-bangle1.js similarity index 100% rename from apps/mywelcome/app.js rename to apps/mywelcome/app-bangle1.js diff --git a/apps/mywelcome/app-bangle2.js b/apps/mywelcome/app-bangle2.js new file mode 100644 index 000000000..aeee6918d --- /dev/null +++ b/apps/mywelcome/app-bangle2.js @@ -0,0 +1,254 @@ +// exec each function from seq one after the other +function animate(seq,period) { + var c = g.getColor(); + var i = setInterval(function() { + if (seq.length) { + var f = seq.shift(); + g.setColor(c); + if (f) f(); + } else clearInterval(i); + },period); +} + +// Fade in to FG color with angled lines +function fade(col, callback) { + var n = 0; + function f() {"ram" + g.setColor(col); + for (var i=n;i<240;i+=10) g.drawLine(i,0,0,i).drawLine(i,240,240,i); + g.flip(); + n++; + if (n<10) setTimeout(f,0); + else callback(); + } + f(); +} + + +var SCENE_COUNT=11; +function getScene(n) { + if (n==0) return function() { + console.log("Start app"); + g.clear(1); + eval(require("Storage").read("mywelcome.custom.js")); + } + if (n==1) return function() { + g.reset().setBgColor(0).clearRect(0,0,176,176); + g.setFont("6x15"); + var n=0; + var l = Bangle.getLogo(); + var im = g.imageMetrics(l); + var i = setInterval(function() { + n+=0.1; + g.setColor(n,n,n); + g.drawImage(l,(176-im.width)/2,(176-im.height)/2); + if (n>=1) { + clearInterval(i); + setTimeout(()=>g.drawString("Open",44,104), 500); + setTimeout(()=>g.drawString("Hackable",44,116), 1000); + setTimeout(()=>g.drawString("Smart Watch",44,128), 1500); + } + },50); + }; + if (n==2) return function() { + var img = require("heatshrink").decompress(atob("ptR4n/j/4gH+8H5wl+jOukVVoHZ8dt/n//n37OtgH9sHhwHp4H5xmkGiH72MRje/LL/7iIAEE7sPEgoAC+AlagIlIiMQErPxDwUYxAABwIHCj8N7nOl3uEqa6BEggnFjfM5nCkUil3gEq5KDAAQmC6QmBE4JxSEhIABiQmB8QmSXoQlCYRMdEwIlCAAIlNhYlOiO85nNEyMPEoZwIAAcsYIYmPXoYlMiKaFExX/u9VEqLBBOYrCH+czmtVqJyDEpiaCOYsgSYszmc3qtTEqMR7hzG8AlGmd1OQglOOY6aEgYlCmmZoJMCTBrnD6SaIEoU/zOUuolSjbnBJgqaCEoU5zOXX4RyQYBBzCS4X5zNDqqZCJiERJg5zBEoVJEoM1JgYlQjhMHc4JLEmZMEEp6ZIJgPzS4WTmZMVTILmFYAK+BmglCmd1JgUYJiPNEorABEIOZygDBm5MCiJMQlhMH8ByBXwIlBJgUxJiMd5nOTIzlBTAK+BAANVq4jPAAS/HJgJyCTATAEACC/B4S/IJgIlCYAgAPiS/Kn5yEYANTEyPc5niOQxMB/LlCOapyJJgbpBYAZzROQK/Gl0ATIWfEoZzBc6IlB6SYGgBJBJgpzSlhyH8EAh5MBTIjnCuIlOjjlHTAJzC/LmDTSSYIEoTABOYIlETSKYHXwIABOYM0yYmETSCYHEobnDOYqaBExu8TAwlEc4U5EoiaCmK+NTAolFEwX0TQzBMXwXiEpTBCAAomNEoS+EEo4mIYIImKEoS+EEpDoBEyUbEo3gEo4mJdAImIJY4lJEycdEoPOOBYmPuIlE+HcJYhKKTZ1fhYkB2EAhnNcYMuEhomMr8A3YABEoJyB5gjOAAYmHm9VgELEoJMBEoXAEyXzE45YBJgXwEqx1I+ByDOYJyVJw5yCgEB3cQGgJMWJwQnCu6/CgFBigDB13S/glVAAf1qomCglEoADB1QDBADEPEoNVqEAolEgEKolKErJMDYAJMD0lE0AmaEoNaAgJMCFIYAahV/IgIiDOTgABNYJMEOToiCIoJMCOTzfCN4RMBOTxsDJIRyfIwZMBKQZzfJgRyfOYZMBOUBzCJgNKOT5zDJgLoCADxKBOAIABOT6aCAARyfOYRyjOYRyjOYlKEsBzEEsBzEOUJzDOUIABOUiaDOURzCOUZzCEscKCiY")); + var im = g.imageMetrics(img); + g.reset(); + g.setBgColor("#ff00ff"); + var y = 176, speed = 5; + function balloon(callback) { + y-=speed; + var x = (176-im.width)/2; + g.drawImage(img,x,y); + g.clearRect(x,y+81,x+77,y+81+speed); + if (y>30) setTimeout(balloon,0,callback); + else callback(); + } + fade("#ff00ff", function() { + balloon(function() { + g.setColor(-1).setFont("6x15:2").setFontAlign(0,0); + g.drawString("Welcome.",88,130); + }); + }); + setTimeout(function() { + var n=0; + var i = setInterval(function() { + n+=4; + g.scroll(0,-4); + if (n>150) + clearInterval(i); + },20); + },3500); + + }; + if (n==3) return function() { + g.reset(); + g.setBgColor("#ffff00").setColor(0).clear(); + g.setFont("12x20").setFontAlign(0,0); + var x = 70, y = 25, h=25; + animate([ + ()=>g.drawString("Your",x,y+=h), + ()=>g.drawString("Bangle.js",x,y+=h), + ()=>g.drawString("has one",x,y+=h), + ()=>g.drawString("button",x,y+=h), + ()=>{g.setFont("12x20:2").setFontAlign(0,0,1).drawString("HERE!",150,88);} + ],200); + }; + if (n==4) return function() { + g.reset(); + g.setBgColor("#00ffff").setColor(0).clear(); + g.setFontAlign(0,0).setFont("6x15:2"); + g.drawString("Press",88,40).setFontAlign(0,-1); + g.setFont("12x20"); + g.drawString("To wake the\nscreen up, or to\nselect", 88,60); + }; + if (n==5) return function() { + g.reset(); + g.setBgColor("#00ffff").setColor(0).clear(); + g.setFontAlign(0,0).setFont("6x15:2"); + g.drawString("Long Press",88,40).setFontAlign(0,-1); + g.setFont("12x20"); + g.drawString("To go back to\nthe clock", 88,60); + }; + if (n==6) return function() { + g.reset(); + g.setBgColor("#ff0000").setColor(0).clear(); + g.setFontAlign(0,0).setFont("12x20"); + g.drawString("If Bangle.js ever\nstops, hold the\nbutton for\nten seconds.\n\nBangle.js will\nthen reboot.", 88,78); + }; + if (n==7) return function() { + g.reset(); + g.setBgColor("#0000ff").setColor(-1).clear(); + g.setFont("12x20").setFontAlign(0,0); + var x = 88, y = -20, h=60; + animate([ + ()=>{g.drawString("Bangle.js has a\nfull touchscreen",x,y+=h);}, + 0,0, + ()=>{g.drawString("Drag up and down\nto scroll and\ntap to select",x,y+=h);}, + ],300); + }; + if (n==8) return function() { + g.reset(); + g.setBgColor("#00ff00").setColor(0).clear(); + g.setFont("12x20").setFontAlign(0,0); + var x = 88, y = -35, h=80; + animate([ + ()=>{g.drawString("Bangle.js comes\nwith a few\napps installed",x,y+=h);}, + 0,0, + ()=>{g.drawString("To add more, visit\nbanglejs.com/apps",x,y+=h);}, + ],400); + }; + if (n==9) return function() { + g.reset(); + g.setBgColor("#ff0000").setColor(0).clear(); + g.setFont("12x20").setFontAlign(0,0); + var x = 88; + g.drawString("You can also make\nyour own apps!",x,30); + g.drawString("Check out\nbanglejs.com",x,130); + + var rx = 0, ry = 0; + // draw a cube + function draw() { + // rotate + rx += 0.1; + ry += 0.11; + var rcx=Math.cos(rx), + rsx=Math.sin(rx), + rcy=Math.cos(ry), + rsy=Math.sin(ry); + // Project 3D coordinates into 2D + function p(x,y,z) { + var t; + t = x*rcy + z*rsy; + z = z*rcy - x*rsy; + x=t; + t = y*rcx + z*rsx; + z = z*rcx - y*rsx; + y=t; + z += 4; + return [88 + 60*x/z, 78+ 60*y/z]; + } + + var a; + // draw a series of lines to make up our cube + var s = 30; + g.clearRect(88-s,78-s,88+s,78+s); + a = p(-1,-1,-1); g.moveTo(a[0],a[1]); + a = p(1,-1,-1); g.lineTo(a[0],a[1]); + a = p(1,1,-1); g.lineTo(a[0],a[1]); + a = p(-1,1,-1); g.lineTo(a[0],a[1]); + a = p(-1,-1,-1); g.lineTo(a[0],a[1]); + a = p(-1,-1,1); g.moveTo(a[0],a[1]); + a = p(1,-1,1); g.lineTo(a[0],a[1]); + a = p(1,1,1); g.lineTo(a[0],a[1]); + a = p(-1,1,1); g.lineTo(a[0],a[1]); + a = p(-1,-1,1); g.lineTo(a[0],a[1]); + a = p(-1,-1,-1); g.moveTo(a[0],a[1]); + a = p(-1,-1,1); g.lineTo(a[0],a[1]); + a = p(1,-1,-1); g.moveTo(a[0],a[1]); + a = p(1,-1,1); g.lineTo(a[0],a[1]); + a = p(1,1,-1); g.moveTo(a[0],a[1]); + a = p(1,1,1); g.lineTo(a[0],a[1]); + a = p(-1,1,-1); g.moveTo(a[0],a[1]); + a = p(-1,1,1); g.lineTo(a[0],a[1]); + } + + setInterval(draw,50); + }; + if (n==10) return function() { + g.reset(); + g.setBgColor("#ffffff");g.clear(); + g.setFontAlign(0,0); + g.setFont("12x20"); + + var x = 88, y = 10, h=21; + animate([ + ()=>g.drawString("That's it!",x,y+=h), + ()=>{g.drawString("Press",x,y+=h*2); + g.drawString("the button",x,y+=h); + g.drawString("to start",x,y+=h); + g.drawString("Bangle.js",x,y+=h);} + ],400); + } +} + +var sceneNumber = 0; + +function move(dir) { + if (dir>0 && sceneNumber+1 == SCENE_COUNT) return; // at the end + sceneNumber = (sceneNumber+dir)%SCENE_COUNT; + if (sceneNumber<0) sceneNumber=0; + clearInterval(); + getScene(sceneNumber)(); + if (sceneNumber>1) { + var l = SCENE_COUNT; + for (var i=0;i move(dir)); +setWatch(()=>{ + if (sceneNumber == SCENE_COUNT-1) + load(); + else + move(1); +}, BTN1, {repeat:true}); + +Bangle.setLCDTimeout(0); +Bangle.setLocked(0); +Bangle.setLCDPower(1); +move(0); diff --git a/apps/mywelcome/custom.html b/apps/mywelcome/custom.html index c4c721765..340f178e8 100644 --- a/apps/mywelcome/custom.html +++ b/apps/mywelcome/custom.html @@ -28,13 +28,15 @@ function getApp() { var line3 = document.getElementById("line3").value; var line4 = document.getElementById("line4").value; var style = document.getElementById("style").value; + // build the app's text using a templated String if (style=="Birthday") return `(function() { var ib = require("heatshrink").decompress(atob("jk0ggGDhOZAAWQCYwMEBxAMFAAIaHyc/+c5DgwMC/84Dg4aCBgwcDBoOf+Y4GBoQEBn4zCI44DBDQ4NEyf4BpgoIBoefxINMBhApEBrQAKBrrrGWpANZHBT7FBpYqIFAYcJBggNOFQwoFDgwMHBwoMIBwYMKBrkykANLmcwBu0zBrMDBv4AFN5gA/ADY")); var ir = require("heatshrink").decompress(atob("jk0ggGDhvdAAXQCYwMEBxAMFAAIaH6c/+c9DgwMC/8zDg4aC/4YCHIwNB7/zHAwNCAgM/DQwqDAYIaHBonT/oNMFBAND74NNBhApEBrQAKBrrrGWpANZHBT7FBpYqIFAYcJBgkA5oMF7gNFFQwoFDgwMHHIoMIAAPM5gMKBrk0oANLmcwBu0zBrMDBv4AFN5gA/ADYA=")); var ig = require("heatshrink").decompress(atob("jk0ggGDg93AAVwCYwMEBxAMFAAIaHuc/+c3DgwMC/8yDg4aC/4YCHIwNBv/zHAwNCAgM/DQwqDAYIaHBolz+4NMFBANDv8nBpgMIFIgNaABQNddYy1IBrI4KfYoNLFRAoDDhIMEgHnBgt+BooqGFAoqGBg4OFBhAODBhQNcmUgBpczmAN2mYNZgYN/AApvMAH4Ab")); var igift = require("heatshrink").decompress(atob("q1QxH+ADOi0QbZ5nMHDQAbKgIACKa4ACKnJWVKghW0KgxWTKgxWyKhBWRKhBWwKhRWPKhRWuKhhWNKhhWtKpxWKKhys8KxBU8Ky5U+KypU/KyhU/KyhU/KynGKn5WTKn5WUKmHCADpJJE7uYABZUfKuuYKv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/AAv+Kv5VT/wADyIAaKpIlbABZSEKv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/Kv5V/ADNtKv6rdKzZVwKhAABy5V/Khw")); - var W=240,H=240; + var W=g.getWidth(),H=g.getHeight(); + var titleFont = g.getFonts().includes("12x20") ? "12x20" : "6x8:2"; var blns = []; function updateFlake(f) { f.im = [ir,ig,ib][Math.round(Math.random()*100)%3]; @@ -60,7 +62,7 @@ var ig = require("heatshrink").decompress(atob("jk0ggGDg93AAVwCYwMEBxAMFAAIaHuc/ }); var x = W/2, y = H/2; g.drawImage(igift,x-43,y-80); - g.setFont("6x8",2).setFontAlign(0,0); + g.setFont(titleFont).setFontAlign(0,0); g.drawString(${JSON.stringify(line1)},x,y+=20); g.drawString(${JSON.stringify(line2)},x,y+=20); g.setFont("6x8"); @@ -68,7 +70,7 @@ var ig = require("heatshrink").decompress(atob("jk0ggGDg93AAVwCYwMEBxAMFAAIaHuc/ g.drawString(${JSON.stringify(line4)},x,y+=10); g.flip(); } - g.clear(); + g.clear(1).setBgColor(0).setColor(-1).clearRect(0,0,W,H); setInterval(draw,50); })()`; // if (style=="Christmas") @@ -76,6 +78,7 @@ var ig = require("heatshrink").decompress(atob("jk0ggGDg93AAVwCYwMEBxAMFAAIaHuc/ var isnow = require("heatshrink").decompress(atob("jEagQWTgfAAocf+gFDh4FDiARBggVB3AFBl3Agf8jfkn/AgX/v/9/+Agfv/2//YrBgfwh4wCgfghYFJCIYdFFIw1EIIpNFL44FFOIoAP")); var itree = require("heatshrink").decompress(atob("mtWxH+ADHHDTI0aGuXH5vNGmhqvTYIzBGtoxF6fTG4g4oGgQyBAAZssGoI0Ga1g1FGdo01ZgIAEGmHHNoLSuAAN/rdb0YFBGlgCBGYIABA4YArGYY1CGn4znAAM6GeVd5PQ5Iyurc/vQ0oGZFAn+d4XC3d5GddiGYIEBy+7zoEBGlFhoEcsQ9GT08+oFk1mkGdaVBMgNArnJ6/KzswGs/J6GlrlbqtbvPC5PCy8wGohniMIPJvIpCqmX3e7vI0BqhqlMIY0DqhtBqoEBa0xgBMIIoEqoABGQwzfsIhBv4qHABM50vQGjg1CGaN66DoBGt1ioGd5LoBGjo1PGYNhvLoCa7wnBqgvGA4YzCAgN5GUAsCqoDBmAHCAYU/wPQ0oSDGcBiDqkwAYcxoFd5PX6GdGjrIIqtUAAc3jk5vPC4fCy5pef5I2BTQMcnAHBy+7y95T0oADnFk1ekBpI2aGRUin7NGAA9hsIzVsIgHTAKZBZoPJ5LNDGhBpXGolcwOsrtcA4TNB3bNDGb/+sVin9AoGe6HX5InEvN/TkP+5XQwM/sRsBzqWB4QuKGjvC6HQ4QdDvKWBZYMwmAuHmFUCYNbqibX3fD5O7qolEZQQ0FBwgKDqgJBGiphEDwNUEgJbBFIQqCAgYOCB4IzCnE6GyhYFGoQnDABYzGAAQ1UAAo2NBoQSBnOB0t/Gjo2EABIPCoGe6HX4QzTGRIAEqtVF4QEBBQc4oE4y/J5PCvIxeABk/oADBvO73eXTyAyZMwM/Awd5vIOFGslAr2Av4PLNcU/jmA6HX5I1KasFcn8dTIOd5PJ4SZGGiNhAAIyNn0ckU+ZYe7AAJpJEYJnNGZk+n9kw9cBAcwGoN5aZg1JJJQABm8/oEjoDKC5ALCrUwqh/NrvQ6HDGp04n9doEdoE/sQJBZQZhCqgABGZk6zw0K/1dnVAoNAFwOlCYL1FubJBy4GCGh1AnOX4XC3YzHFYOeCgdV5PQ5OdD4rKBqqYNGYlbv+X3edGY3CGgKMDAAO7JAJgDAClcr2BEYgADaIZ0DL4uXGbDuB6HX5I1GsP+sNhOgWXIhBmWd4Od5PK4TwFGIJoBAYI2BAD0/jlcQoO7AAJaEGQQADGr0/sjNEvOdAoZmDGgw2ZsVAkeAZpQACGZI2VsU/kVGn1bZoPJZogpGGhA4GfRYwBoGC1mlBQbNFFoo0JNxAGCEod/wM6oFAn9iv/J6/Kzo1Ey9/MZQAKCg4GCFgTDEvPCSwI0BC5I0RN4ocEYYPQ5OdHgeXSwTFKGaJyKFYPC3f+MIdbpzFLAD4zB/1OqtbqtOGgYArGAIADGl9UAAI0wGQN5GoQ0vvIABGoI0uGYQABqo0zNOg0uaQY0/GllOGn40//w=")); var W=g.getWidth(),H=g.getHeight(); + var titleFont = g.getFonts().includes("12x20") ? "12x20" : "6x8:2"; var flakes = []; for (var i=0;i<10;i++) { var f = { @@ -97,7 +100,7 @@ var ig = require("heatshrink").decompress(atob("jk0ggGDg93AAVwCYwMEBxAMFAAIaHuc/ }); var x = W/2, y = H/2; g.drawImage(itree,x-27,y-80); - g.setFont("6x8",2).setFontAlign(0,0); + g.setFont(titleFont).setFontAlign(0,0); g.drawString(${JSON.stringify(line1)},x,y+=20); g.drawString(${JSON.stringify(line2)},x,y+=20); g.setFont("6x8"); @@ -105,7 +108,7 @@ var ig = require("heatshrink").decompress(atob("jk0ggGDg93AAVwCYwMEBxAMFAAIaHuc/ g.drawString(${JSON.stringify(line4)},x,y+=10); g.flip(); } - g.clear(); + g.clear(1).setBgColor(0).setColor(-1).clearRect(0,0,W,H); setInterval(draw,50); })(); `; diff --git a/apps/welcome/app-bangle2.js b/apps/welcome/app-bangle2.js index 93d1c5657..41d051148 100644 --- a/apps/welcome/app-bangle2.js +++ b/apps/welcome/app-bangle2.js @@ -244,5 +244,6 @@ setWatch(()=>{ }, BTN1, {repeat:true}); Bangle.setLCDTimeout(0); +Bangle.setLocked(0); Bangle.setLCDPower(1); move(0); From 1bac94c622273ac6197952a3ea4c9353f650c273 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 6 Dec 2021 16:17:31 +0000 Subject: [PATCH 6/8] 0.02: Minor layout format tweak so it uses less memory and draws ok on Bangle.js 1 (#1012) --- apps.json | 2 +- apps/weatherClock/ChangeLog | 3 ++- apps/weatherClock/app.js | 32 +++++++++++++++----------------- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/apps.json b/apps.json index ef939c7bb..5182a74f1 100644 --- a/apps.json +++ b/apps.json @@ -4738,7 +4738,7 @@ { "id": "weatherClock", "name": "Weather Clock", - "version": "0.01", + "version": "0.02", "description": "A clock which displays current weather conditions (requires Gadgetbridge and Weather apps).", "icon": "app.png", "screenshots": [{"url":"screens/screen1.png"}], diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 2286a7f70..f4a63e976 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -1 +1,2 @@ -0.01: New App! \ No newline at end of file +0.01: New App! +0.02: Minor layout format tweak so it uses less memory and draws ok on Bangle.js 1 (#1012) diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 0a3d390f2..46cc38312 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -69,22 +69,20 @@ var clockLayout = new Layout( { {type:"txt", font:"10%", label:"01/01/1970", id:"date" } ] }, - {type: "v", fillx: 1, c: [ - {type: "h", valign : 1, fillx:1, c: [ - {type: "img", filly: 1, id: "weatherIcon", src: sunIcon}, - {type: "v", fillx:1, c: [ - {type: "h", c: [ - {type: "txt", font: "10%", id: "temp", label: "000"}, - {type: "txt", font: "10%", id: "tempUnit", label: "°C"}, - ]}, - {type: "h", c: [ - {type: "txt", font: "10%", id: "wind", label: "00"}, - {type: "txt", font: "10%", id: "windUnit", label: "km/h"}, - ]} - ] - }, - ]}, - ]}] + {type: "h", valign : 1, fillx:1, c: [ + {type: "img", filly: 1, id: "weatherIcon", src: sunIcon}, + {type: "v", fillx:1, c: [ + {type: "h", c: [ + {type: "txt", font: "10%", id: "temp", label: "000"}, + {type: "txt", font: "10%", id: "tempUnit", label: "°C"}, + ]}, + {type: "h", c: [ + {type: "txt", font: "10%", id: "wind", label: "00"}, + {type: "txt", font: "10%", id: "windUnit", label: "km/h"}, + ]} + ] + }, + ]}] }); // timeout used to update every minute @@ -133,4 +131,4 @@ Bangle.setUI("clock"); // Show launcher when middle button pressed Bangle.loadWidgets(); Bangle.drawWidgets(); clockLayout.render(); -draw(); \ No newline at end of file +draw(); From ff8b08911de66f55a5332582f6fa2acb7a61d889 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 6 Dec 2021 16:17:55 +0000 Subject: [PATCH 7/8] 0.35: Change App/Widget settings to 'App Settings' so it fits on Bangle screen --- apps.json | 2 +- apps/setting/ChangeLog | 1 + apps/setting/settings.js | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 5182a74f1..77941f0f7 100644 --- a/apps.json +++ b/apps.json @@ -146,7 +146,7 @@ { "id": "setting", "name": "Settings", - "version": "0.34", + "version": "0.35", "description": "A menu for setting up Bangle.js", "icon": "settings.png", "tags": "tool,system", diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index d840654fe..b393dda00 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -37,3 +37,4 @@ 0.32: Fix 'beep' menu on Bangle.js 2 0.33: Really fix 'beep' menu on Bangle.js 2 this time 0.34: Remove Quiet Mode LCD settings: now handled by Quiet Mode Schedule app +0.35: Change App/Widget settings to 'App Settings' so it fits on Bangle screen diff --git a/apps/setting/settings.js b/apps/setting/settings.js index 9432d0a38..e00c15462 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -96,7 +96,7 @@ function showMainMenu() { '': { 'title': 'Settings' }, '< Back': ()=>load(), 'Make Connectable': ()=>makeConnectable(), - 'App/Widget Settings': ()=>showAppSettingsMenu(), + 'App Settings': ()=>showAppSettingsMenu(), 'BLE': ()=>showBLEMenu(), 'Debug Info': { value: settings.log, From 05e1b3ff500f02056f31a964d272d3881820aa96 Mon Sep 17 00:00:00 2001 From: Didgeridoohan Date: Tue, 7 Dec 2021 09:18:27 +0100 Subject: [PATCH 8/8] Remove duplicate entry for SensiBLE --- apps.json | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/apps.json b/apps.json index 77941f0f7..13bb5892d 100644 --- a/apps.json +++ b/apps.json @@ -4646,23 +4646,6 @@ {"name":"a_speech_timer.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "sensible", - "name": "SensiBLE", - "shortName": "SensiBLE", - "version": "0.02", - "description": "Collect, display and advertise real-time sensor data.", - "icon": "sensible.png", - "type": "app", - "tags": "tool,sensors", - "supports" : [ "BANGLEJS2" ], - "allow_emulator": true, - "readme": "README.md", - "storage": [ - { "name": "sensible.app.js", "url": "sensible.js" }, - { "name": "sensible.img", "url": "sensible-icon.js", "evaluate": true } - ] - }, { "id": "mylocation", "name": "My Location", "shortName":"My Location",