diff --git a/apps.json b/apps.json index 879195658..86a41c84c 100644 --- a/apps.json +++ b/apps.json @@ -92,6 +92,7 @@ {"name":"messages","url":"lib.js"} ], "data": [{"name":"messages.json"},{"name":"messages.settings.json"}], + "screenshots": [{"url":"screenshot.jpg"},{"url":"screen-notification.gif"}], "sortorder": -9 }, { @@ -217,7 +218,7 @@ { "id": "locale", "name": "Languages", - "version": "0.13", + "version": "0.14", "description": "Translations for different countries", "icon": "locale.png", "type": "locale", diff --git a/apps/ios/README.md b/apps/ios/README.md new file mode 100644 index 000000000..b4c2c6ac9 --- /dev/null +++ b/apps/ios/README.md @@ -0,0 +1,31 @@ +# iOS integration app + +This is the iOS integration app for Bangle.js. This app allows you to receive +notifications from your iPhone. The Apple Notification Center Service (ANCS) +sends all the messages to your watch. + +You can allow this if you connect your Bangle to your iPhone. It will be +prompted for immediatly after you connect the Bangle to the iPhone. + +### Connecting your Bangle(2).js to your iPhone +The Bangle watches are Bluetooth Low Energy (BLE) devices. Sometimes they +will not be seen/detected by the Bluetooth scanner in your iPhone settings +menu. + +To resolve this, you can download numerous apps who can actually scan +for BLE devices. There are great ones out there, free and paid. + +We really like WebBLE, which we also recommend to load apps on your +watch with your iOS device, as Safari does not support WebBluetooth +for now. It's just a few bucks/pounds/euro's. + +If you like to try a free app first, you can always use NRF Toolbox or +Bluetooth BLE Device Finder to find and connect your Bangle. + +## Requests + +Please file any issues on https://github.com/espruino/BangleApps/issues/new?title=ios%20app + +## Creator + +Gordon Williams diff --git a/apps/ios/boot.js b/apps/ios/boot.js index d17130167..be43b70ea 100644 --- a/apps/ios/boot.js +++ b/apps/ios/boot.js @@ -125,13 +125,19 @@ E.on('notify',msg=>{ // Apple media service E.on('AMS',a=>{ + function format_song_time(song_seconds) { + var minutes = (new Array(3).join("0")+(Math.floor(song_seconds / 60))).slice(-2); + var seconds = (new Array(3).join("0")+(parseInt(song_seconds) - minutes * 60)).slice(-2); + return minutes + ":" + seconds; + } + function push(m) { var msg = { t : "modify", id : "music", title:"Music" }; if (a.id=="artist") msg.artist = m; else if (a.id=="album") msg.album = m; else if (a.id=="title") msg.track = m; - else if (a.id=="duration") msg.track = m; - else return; // duration? need to reformat + else if (a.id=="duration") msg.duration = format_song_time(m); + else return; require("messages").pushMessage(msg); } if (a.truncated) NRF.amsGetMusicInfo(a.id).then(push) diff --git a/apps/locale/ChangeLog b/apps/locale/ChangeLog index 509d67077..448f8119a 100644 --- a/apps/locale/ChangeLog +++ b/apps/locale/ChangeLog @@ -13,3 +13,4 @@ 0.11: Added translations for nl_NL and changes one formatting 0.12: Fixed nl_NL formatting, because the full months won't fit on the Bangle.js2's screen 0.13: Now use shorter de_DE date format to more closely match other languages for size +0.14: Added some first translations for Messages in nl_NL diff --git a/apps/locale/locales.js b/apps/locale/locales.js index 2e1429ef8..1d659f161 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -198,7 +198,8 @@ var locales = { day: "zondag,maandag,dinsdag,woensdag,donderdag,vrijdag,zaterdag", abmonth: "jan,feb,mrt,apr,mei,jun,jul,aug,sep,okt,nov,dec", month: "januari,februari,maart,april,mei,juni,juli,augustus,september,oktober,november,december", - trans: { yes: "ja", Yes: "Ja", no: "nee", No: "Nee", ok: "ok", on: "aan", off: "uit", "< Back": "< Terug" } + trans: { yes: "ja", Yes: "Ja", no: "nee", No: "Nee", ok: "ok", on: "aan", off: "uit", + "< Back": "< Terug", "Delete": "Verwijderen", "Mark Unread": "Markeer als ongelezen" } }, "en_NL": { // English date units with Dutch number, currency and navigation units. lang: "en_NL", diff --git a/apps/messages/README.md b/apps/messages/README.md index 71af4fed7..5f13c8e10 100644 --- a/apps/messages/README.md +++ b/apps/messages/README.md @@ -17,6 +17,16 @@ and `Messages`: If there is no user input for this amount of time then the app will exit and return to the clock where a ringing bell will be shown in the Widget bar. +## Images +_1. Screenshot of a notification_ + +![](screenshot.jpg) + +_2. What the notify icon looks like (it's touchable on Bangle.js2!)_ + +![](screen-notification.gif) + + ## Requests @@ -25,3 +35,11 @@ Please file any issues on https://github.com/espruino/BangleApps/issues/new?titl ## Creator Gordon Williams + +## Contributors + +[Jeroen Peters](https://github.com/jeroenpeters1986) + +## Attributions + +Icons used in this app are from https://icons8.com diff --git a/apps/messages/app-icon.js b/apps/messages/app-icon.js index e4fe80077..6d6f684f8 100644 --- a/apps/messages/app-icon.js +++ b/apps/messages/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwxH+ABV7ACQfLABobBwOCACGBGLAYBwWIACWCGC4uHEAQJBRIYPIF7wACAggvfRqYADF6qBDAC7uWACGmAAIFCF6+tAB+zAAQFCF84uGF7ghDFw+s1iNDAoIva2fX64wH2a3CfjYvDFwQwHQwWCxIASIoJfOXZAvKSoIvWX47qDF5CYEBhIvMLpA3BEQ4hB0vP5+lBpIvRFwgvIFwYwDF7AuFR5F71YvD1YvYFwwvHEAIvE54OIF5wuDF4LvJXwQACF7AtE64FDEBAADMYIvVLgvXAAIvIdwrwIF5q7GFwYvGD4IuFSA4vMdQ4HED4t7wIvHwJgEF5YuMF44AKF5wuNd5AACDYIFDX54uNF45kFBRAvMFxYvLABQvLEwXX65lIF8AmDFxIviRhQACcoQADGoYKGAArvLFxQAB1mm02CFIIvDFqIvIFxINFF4aDIABYvDJwIgBwOsEoKaC1mBBwovCRoQvZcwOmF4mmBwusF4IuVF4wDBL5OtF4TpFF6y7PAAQyBGYIvXFyQAEF7AuVF7AAZF6qrCACgvXxAAWF6owBEJJSCwQvKFygvBERIvMBgIv/eBC9TdywwEGIIAQCgQuWGIoAQEiA")) \ No newline at end of file +require("heatshrink").decompress(atob("mEw4cA///ueLn/Hz/nr+G3Wtiv/v/fHc8CpMkyQCCpARJydt23bAQVJCBEEBwYCCtMgCJWkzVJmwFBCJEGEY1tkg1PCJRoDAQg1I0gPE2/S0gRNpu+y4RKNIIRBtRHKg2lTgMkyY6FAQNACIeuTgMkzc2CAtKCImkzYKB7YRD7IRI3VJk3fCIWkydkCI4uBm36CIMlndstgRJRgIRBkM7ttMCJCMCCIW7CJVt+m7CImMCI+Tt/3NYUhkmdCJGbv75BCIMpWoONCI/b9M2PoUNCIOpCI2m79L2x9CpwRB2OyCIoOBrp9DYwYRFgs36Xt32TUIW0zahGgs+y59BdIjXHgt0zdv0rpEfY8FfAN9lwRMg2uPoXbk3bIgNbtu26QRE+x9C7dUyVMyAkDCAQ1Bmx9BCINt+oRBwAODCIc7qWt6n9t2lpmECJU9zXpvnVpskCAwRBvd/lva6Po6hEBCJElIgO276yBtQRIdIIRC/RmCCJOkOoWtNoQRIgiGDAQgjIGgQCECL3SCJkECI8gCJYCDtIRIgGTCItJCBEAgR9FpARJAD4A=")) \ No newline at end of file diff --git a/apps/messages/app.js b/apps/messages/app.js index d62d4932e..fd5a4bb4d 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -21,6 +21,7 @@ */ var Layout = require("Layout"); +var locale = require("locale"); var fontSmall = "6x8"; var fontMedium = g.getFonts().includes("6x15")?"6x15":"6x8:2"; var fontBig = g.getFonts().includes("12x20")?"12x20":"6x8:2"; @@ -66,7 +67,7 @@ function getBackImage() { return atob("FhYBAAAAEAAAwAAHAAA//wH//wf//g///BwB+DAB4EAHwAAPAAA8AADwAAPAAB4AAHgAB+AH/wA/+AD/wAH8AA=="); } function getNotificationImage() { - return atob("GBiBAf////wA//AAf/AAf/AAf/f/f/f/f/fgA/fv/ffvPffuPffuPffuHffv/ffmA/f4f/fxf/f/f/f/f/AAf/Bwf/AAf/wA/////w=="); + return atob("FBSBAH//7//////////////////////////////////////////////3//4PgADgAA4AAAAA"); } function getFBIcon() { return atob("GBiBAAAAAAAAAAAYAAD/AAP/wAf/4A/48A/g8B/g+B/j+B/n+D/n/D8A/B8A+B+B+B/n+A/n8A/n8Afn4APnwADnAAAAAAAAAAAAAA=="); @@ -99,7 +100,7 @@ function getMessageImage(msg) { if (s=="twitter") return atob("GhYBAABgAAB+JgA/8cAf/ngH/5+B/8P8f+D///h///4f//+D///g///wD//8B//+AP//gD//wAP/8AB/+AB/+AH//AAf/AAAYAAA"); if (s=="telegram") return atob("GBiBAAAAAAAAAAAAAAAAAwAAHwAA/wAD/wAf3gD/Pgf+fh/4/v/z/P/H/D8P/Acf/AM//AF/+AF/+AH/+ADz+ADh+ADAcAAAMAAAAA=="); 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=="); - if (s=="wordfeud") return atob("GBgBP//8f//+////////////+/5X+/73+/7/+/7/+f7/+c7//Y7//a7//az//bX//XX//XX//Hn//nn//vn/////////f//+AB6A"); + if (s=="wordfeud") return atob("GBgCWqqqqqqlf//////9v//////+v/////++v/////++v8///Lu+v8///L++v8///P/+v8v//P/+v9v//P/+v+fx/P/+v+Pk+P/+v/PN+f/+v/POuv/+v/Ofdv/+v/NvM//+v/I/Y//+v/k/k//+v/i/w//+v/7/6//+v//////+v//////+f//////9Wqqqqqql"); if (msg.id=="music") return atob("FhaBAH//+/////////////h/+AH/4Af/gB/+H3/7/f/v9/+/3/7+f/vB/w8H+Dwf4PD/x/////////////3//+A="); if (msg.id=="back") return getBackImage(); return getNotificationImage(); @@ -177,14 +178,17 @@ function showMusicMessage(msg) { } function showMessageSettings(msg) { + var delete_txt = locale.translate("Delete"); + var unread_txt = locale.translate("Mark Unread"); + var back_txt = locale.translate("< Back"); E.showMenu({"":{"title":"Message"}, - "< Back" : () => showMessage(msg.id), - "Delete" : () => { + back_txt : () => showMessage(msg.id), + delete_txt : () => { MESSAGES = MESSAGES.filter(m=>m.id!=msg.id); saveMessages(); checkMessages({clockIfNoMsg:0,clockIfAllRead:0,showMsgIfUnread:0}); }, - "Mark Unread" : () => { + unread_txt : () => { msg.new = true; saveMessages(); checkMessages({clockIfNoMsg:0,clockIfAllRead:0,showMsgIfUnread:0}); @@ -242,7 +246,7 @@ 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:()=>{ + { type:"btn", src:getMessageImage(msg), pad: 3, cb:()=>{ cancelReloadTimeout(); // don't auto-reload to clock now showMessageSettings(msg); }}, @@ -271,7 +275,7 @@ function checkMessages(options) { if (!MESSAGES.length) { if (!options.clockIfNoMsg) return E.showPrompt("No Messages",{ title:"Messages", - img:require("heatshrink").decompress(atob("kkk4UBrkc/4AC/tEqtACQkBqtUDg0VqAIGgoZFDYQIIM1sD1QAD4AIBhnqA4WrmAIBhc6BAWs8AIBhXOBAWz0AIC2YIC5wID1gkB1c6BAYFBEQPqBAYXBEQOqBAnDAIQaEnkAngaEEAPDFgo+IKA5iIOhCGIAFb7RqAIGgtUBA0VqobFgNVA")), + img:require("heatshrink").decompress(atob("k0swQEB1QAC1AND1f/AAWgBAUrBAf+wAIBgW//2uCoP4CQUvCQYcDCQIID/QSClQ4D1QSDDYn+EpHgCQ4lDCQfqFAeiBAX7FAgSDIoniCQn61QSH3/vCQ3rBQISF/wMCCQoaBCQ+qCQ+vAIISFBQInBCQpDB94SFKgJVBCQv+YAJeG/RxHQiAZCAgSqE1Y5CwS9E3+AaA379DQD/fv9++3TQEQQP79T2IcY4ABCRkqeQeqErBwCCQcrAwLEB/5nCgSKEM4UAhQJDDYYJBIIYbCgA")), buttons : {"Ok":1} }).then(() => { load() }); return load(); diff --git a/apps/messages/app.png b/apps/messages/app.png index 8b25702fc..831467a8d 100644 Binary files a/apps/messages/app.png and b/apps/messages/app.png differ diff --git a/apps/messages/screen-notification.gif b/apps/messages/screen-notification.gif new file mode 100644 index 000000000..776610245 Binary files /dev/null and b/apps/messages/screen-notification.gif differ diff --git a/apps/messages/screenshot.jpg b/apps/messages/screenshot.jpg new file mode 100644 index 000000000..32c4c41c1 Binary files /dev/null and b/apps/messages/screenshot.jpg differ diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 442a758c3..95f4f5b33 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -9,7 +9,8 @@ WIDGETS["messages"]={area:"tl",width:0,draw:function() { */ var c = parseInt(Date.now()/1000); g.reset().clearRect(this.x,this.y,this.x+this.width,this.y+23); - g.drawImage((c&1) ? atob("FBSBAAGAABwAA/gAf8AP/AD/wA/8AP/gD/8Af/AP/4D//A//4f//H//x//w//gP8gAA4AAOA") : atob("FBSBAAAYAAOAAfwAP+AD/wA/8AP/AH/wD/8A/+Af/wP/8H//D//4//+D//gH/8AT/AHAABwA"), this.x, this.y); + //g.drawImage((c&1) ? atob("FBSBAAGAABwAA/gAf8AP/AD/wA/8AP/gD/8Af/AP/4D//A//4f//H//x//w//gP8gAA4AAOA") : atob("FBSBAAAYAAOAAfwAP+AD/wA/8AP/AH/wD/8A/+Af/wP/8H//D//4//+D//gH/8AT/AHAABwA"), this.x, this.y); + g.drawImage((c&1) ? atob("HBgBAAAAAAAAAAAAAAAAAAAABgAAAPAAAB+AAAH4AAAfgAAD/AAAP8AAA/wAAH/gAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") : atob("HBiBAcAAADgAAAGAAAAQAGAAAAYAAADwAAAfgAAD/AAAP8AAA/wAAD/AAAf+AAB/4AAAAAAAAAAAAGAAgAAAGAAAAYAAAB8AAA/4P///j///+f///7///w=="), this.x, this.y); //if (c<60) Bangle.setLCDPower(1); // keep LCD on for 1 minute