diff --git a/apps.json b/apps.json index 699defbcf..7d8faec91 100644 --- a/apps.json +++ b/apps.json @@ -77,7 +77,7 @@ { "id": "messages", "name": "Messages", - "version": "0.11", + "version": "0.12", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", @@ -92,6 +92,7 @@ {"name":"messages","url":"lib.js"} ], "data": [{"name":"messages.json"},{"name":"messages.settings.json"}], + "screenshots": [{"url":"screenshot.png"},{"url":"screenshot-notify.gif"}], "sortorder": -9 }, { @@ -115,7 +116,7 @@ { "id": "ios", "name": "iOS Integration", - "version": "0.06", + "version": "0.07", "description": "Display notifications/music/etc from iOS devices", "icon": "app.png", "tags": "tool,system,ios,apple,messages,notifications", @@ -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/ChangeLog b/apps/ios/ChangeLog index 28ad78dec..5e60068aa 100644 --- a/apps/ios/ChangeLog +++ b/apps/ios/ChangeLog @@ -4,4 +4,7 @@ 0.04: Added common bundleId's 0.05: Added more bundleId's (app-id's which can be used to determine a friendly app name in the notifications) -0.06: Fix (not) popupping up old messages \ No newline at end of file +0.06: Fix (not) popupping up old messages +0.07: Added more details from music (instead of Undefined) + Added more app identifiers + 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 d402facbb..8ccfb617d 100644 --- a/apps/ios/boot.js +++ b/apps/ios/boot.js @@ -65,14 +65,16 @@ E.on('notify',msg=>{ "com.apple.facetime": "FaceTime", "com.apple.mobilecal": "Calendar", "com.apple.mobilemail": "Mail", + "com.apple.mobilephone": "Phone", "com.apple.MobileSMS": "SMS Message", "com.apple.Passbook": "iOS Wallet", + "com.apple.podcasts": "Podcasts", "com.apple.reminders": "Reminders", "com.apple.shortcuts": "Shortcuts", "com.atebits.Tweetie2": "Twitter", "com.burbn.instagram" : "Instagram", "com.facebook.Facebook": "Facebook", - "com.facebook.Messenger": "FB Messenger", + "com.facebook.Messenger": "Messenger", "com.google.Chromecast" : "Google Home", "com.google.Gmail" : "GMail", "com.google.hangouts" : "Hangouts", @@ -81,22 +83,26 @@ E.on('notify',msg=>{ "com.ifttt.ifttt" : "IFTTT", "com.jumbo.app" : "Jumbo", "com.linkedin.LinkedIn" : "LinkedIn", + "com.microsoft.Office.Outlook" : "Outlook Mail", "com.nestlabs.jasper.release" : "Nest", "com.netflix.Netflix" : "Netflix", "com.reddit.Reddit" : "Reddit", "com.skype.skype": "Skype", "com.skype.SkypeForiPad": "Skype", "com.spotify.client": "Spotify", + "com.strava.stravaride": "Strava", "com.tinyspeck.chatlyio": "Slack", "com.toyopagroup.picaboo": "Snapchat", "com.ubercab.UberClient": "Uber", "com.ubercab.UberEats": "UberEats", + "com.vilcsak.bitcoin2": "Coinbase", "com.wordfeud.free": "WordFeud", "com.zhiliaoapp.musically": "TikTok", "net.whatsapp.WhatsApp": "WhatsApp", "nl.ah.Appie": "Albert Heijn", "nl.postnl.TrackNTrace": "PostNL", "ph.telegra.Telegraph": "Telegram", + "tv.twitch": "Twitch", // could also use NRF.ancsGetAppInfo(msg.appId) here }; @@ -104,7 +110,7 @@ E.on('notify',msg=>{ '2019':"'" }; var replacer = ""; //(n)=>print('Unknown unicode '+n.toString(16)); - if (appNames[msg.appId]) msg.a + //if (appNames[msg.appId]) msg.a require("messages").pushMessage({ t : msg.event, id : msg.uid, @@ -122,9 +128,10 @@ E.on('AMS',a=>{ function push(m) { var msg = { t : "modify", id : "music", title:"Music" }; if (a.id=="artist") msg.artist = m; - else if (a.id=="album") msg.artist = m; - else if (a.id=="title") msg.tracl = m; - else return; // duration? need to reformat + else if (a.id=="album") msg.album = m; + else if (a.id=="title") msg.track = m; + else if (a.id=="duration") msg.dur = 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/ChangeLog b/apps/messages/ChangeLog index a3a4f377c..6109daf7a 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -13,4 +13,8 @@ 0.09: Message now disappears after 60s if no action taken and clock loads (fix 922) Fix phone icon (#1014) 0.10: Respect the 'new' attribute if it was set from iOS integrations -0.11: Open app when touching the widget (Bangle.js 2 only) \ No newline at end of file +0.11: Open app when touching the widget (Bangle.js 2 only) +0.12: Extra app-specific notification icons + New animated notifcationicon (instead of large blinking 'MESSAGES') + Added screenshots + diff --git a/apps/messages/README.md b/apps/messages/README.md index e9aa128d1..4952b1877 100644 --- a/apps/messages/README.md +++ b/apps/messages/README.md @@ -1,7 +1,5 @@ # Messages app -**THIS APP IS CURRENTLY BETA** - This app handles the display of messages and message notifications. It stores a list of currently received messages and allows them to be listed, viewed, and responded to. @@ -17,7 +15,17 @@ and `Messages`: * `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. +to the clock where a ringing bell will be shown in the Widget bar. + +## Images +_1. Screenshot of a notification_ + +![](screenshot.png) + +_2. What the notify icon looks like (it's touchable on Bangle.js2!)_ + +![](screenshot-notify.gif) + ## Requests @@ -27,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.js b/apps/messages/app.js index c609acb4b..965c50b85 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -65,6 +65,12 @@ function saveMessages() { function getBackImage() { return atob("FhYBAAAAEAAAwAAHAAA//wH//wf//g///BwB+DAB4EAHwAAPAAA8AADwAAPAAB4AAHgAB+AH/wA/+AD/wAH8AA=="); } +function getNotificationImage() { + return atob("HBKBAD///8H///iP//8cf//j4//8f5//j/x/8//j/H//H4//4PB//EYj/44HH/Hw+P4//8fH//44///xH///g////A=="); +} +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=="); +} function getPosImage() { return atob("GRSBAAAAAYAAAcAAAeAAAfAAAfAAAfAAAfAAAfAAAfBgAfA4AfAeAfAPgfAD4fAA+fAAP/AAD/AAA/AAAPAAADAAAA=="); } @@ -74,18 +80,28 @@ function getNegImage() { function getMessageImage(msg) { if (msg.img) return atob(msg.img); var s = (msg.src||"").toLowerCase(); + if (s=="calendar") return atob("GBiBAAAAAAAAAAAAAA//8B//+BgAGBgAGBgAGB//+B//+B//+B9m2B//+B//+Btm2B//+B//+Btm+B//+B//+A//8AAAAAAAAAAAAA=="); + if (s=="facebook") return getFBIcon(); + if (s=="hangouts") return atob("FBaBAAH4AH/gD/8B//g//8P//H5n58Y+fGPnxj5+d+fmfj//4//8H//B//gH/4A/8AA+AAHAABgAAAA="); + if (s=="instagram") return atob("GBiBAf////////////////wAP/n/n/P/z/f/b/eB7/c87/d+7/d+7/d+7/d+7/c87/eB7/f/7/P/z/n/n/wAP////////////////w=="); + if (s=="gmail") return getNotificationImage(); + if (s=="google home") return atob("GBiCAAAAAAAAAAAAAAAAAAAAAoAAAAAACqAAAAAAKqwAAAAAqroAAAACquqAAAAKq+qgAAAqr/qoAACqv/6qAAKq//+qgA6r///qsAqr///6sAqv///6sAqv///6sAqv///6sA6v///6sA6v///qsA6qqqqqsA6qqqqqsA6qqqqqsAP7///vwAAAAAAAAAAAAAAAAA=="); + if (s=="mail") return getNotificationImage(); + if (s=="messenger") return getFBIcon(); + if (s=="outlook mail") return getNotificationImage(); 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=="); - 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=="slack") return atob("GBiBAAAAAAAAAABAAAHvAAHvAADvAAAPAB/PMB/veD/veB/mcAAAABzH8B3v+B3v+B3n8AHgAAHuAAHvAAHvAADGAAAAAAAAAAAAAA=="); + if (s=="sms message") return getNotificationImage(); 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("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 atob("HBKBAD///8H///iP//8cf//j4//8f5//j/x/8//j/H//H4//4PB//EYj/44HH/Hw+P4//8fH//44///xH///g////A=="); + return getNotificationImage(); } - function showMapMessage(msg) { var m; var distance, street, target, eta; @@ -127,7 +143,7 @@ function showMapMessage(msg) { function showMusicMessage(msg) { function fmtTime(s) { var m = Math.floor(s/60); - s = (s%60).toString().padStart(2,0); + s = (parseInt(s%60)).toString().padStart(2,0); return m+":"+s; } @@ -141,7 +157,7 @@ function showMusicMessage(msg) { {type:"h", fillx:1, bgCol:colBg, c: [ { type:"btn", src:getBackImage, cb:back }, { type:"v", fillx:1, c: [ - { type:"txt", font:fontLarge, label:msg.artist, pad:2 }, + { type:"txt", font:fontMedium, label:msg.artist, pad:2 }, { type:"txt", font:fontMedium, label:msg.album, pad:2 } ]} ]}, @@ -223,7 +239,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); }}, diff --git a/apps/messages/screenshot-notify.gif b/apps/messages/screenshot-notify.gif new file mode 100644 index 000000000..3d0ed0b32 Binary files /dev/null and b/apps/messages/screenshot-notify.gif differ diff --git a/apps/messages/screenshot.png b/apps/messages/screenshot.png new file mode 100644 index 000000000..a95045400 Binary files /dev/null and b/apps/messages/screenshot.png differ diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 6403c6b8d..f01d22ec7 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -2,9 +2,8 @@ WIDGETS["messages"]={area:"tl",width:0,draw:function() { Bangle.removeListener('touch', this.touch); if (!this.width) return; var c = (Date.now()-this.t)/1000; - g.reset().setBgColor((c&1) ? "#0f0" : "#030").setColor((c&1) ? "#000" : "#fff"); - g.clearRect(this.x,this.y,this.x+this.width,this.y+23); - g.setFont("6x8:1x2").setFontAlign(0,0).drawString("MESSAGES", this.x+this.width/2, this.y+12); + g.reset().clearRect(this.x,this.y,this.x+this.width,this.y+23); + g.drawImage((c&1) ? atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA==") : atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA=="), this.x, this.y); //if (c<60) Bangle.setLCDPower(1); // keep LCD on for 1 minute let settings = require('Storage').readJSON("messages.settings.json", true) || {}; if (settings.repeat===undefined) settings.repeat = 4;