{ /* Bluetooth.println(JSON.stringify({t:"intent", action:"", flags:["flag1", "flag2",...], categories:["category1","category2",...], mimetype:"", data:"", package:"", class:"", target:"", extra:{someKey:"someValueOrString"}})); Podcast Addict is developed by Xavier Guillemane and can be downloaded on Google Play Store: https://play.google.com/store/apps/details?id=com.bambuna.podcastaddict&hl=en_US&gl=US How to use intents to control Podcast Addict: https://podcastaddict.com/faq/130 */ let R; let widgetUtils = require("widget_utils"); let backToMenu = false; let dark = g.theme.dark; // bool // The main layout of the app let gfx = function() { widgetUtils.hide(); R = Bangle.appRect; const marigin = 8; // g.drawString(str, x, y, solid) g.clearRect(R); g.reset(); if (dark) {g.setColor(0xFD20);} else {g.setColor(0xF800);} // Orange on dark theme, RED on light theme. g.setFont("4x6:2"); g.setFontAlign(1, 0, 0); g.drawString("->", R.x2 - marigin, R.y + R.h/2); g.setFontAlign(-1, 0, 0); g.drawString("<-", R.x + marigin, R.y + R.h/2); g.setFontAlign(-1, 0, 1); g.drawString("<-", R.x + R.w/2, R.y + marigin); g.setFontAlign(1, 0, 1); g.drawString("->", R.x + R.w/2, R.y2 - marigin); g.setFontAlign(0, 0, 0); g.drawString("Play\nPause", R.x + R.w/2, R.y + R.h/2); g.setFontAlign(-1, -1, 0); g.drawString("Menu", R.x + 2*marigin, R.y + 2*marigin); g.setFontAlign(-1, 1, 0); g.drawString("Wake", R.x + 2*marigin, R.y + R.h - 2*marigin); g.setFontAlign(1, -1, 0); g.drawString("Srch", R.x + R.w - 2*marigin, R.y + 2*marigin); g.setFontAlign(1, 1, 0); g.drawString("Speed", R.x + R.w - 2*marigin, R.y + R.h - 2*marigin); }; // Touch handler for main layout let touchHandler = function(_, xy) { let x = xy.x; let y = xy.y; let len = (R.wb-1 instead of a>=b. if ((R.x-1{ Bangle.removeListener("touch", touchHandler); Bangle.removeListener("swipe", swipeHandler); clearWatch(buttonHandler); widgetUtils.show(); } }, ud => { if (ud) Bangle.musicControl(ud>0 ? "volumedown" : "volumeup"); } ); Bangle.on("touch", touchHandler); Bangle.on("swipe", swipeHandler); let buttonHandler = setWatch(()=>{load();}, BTN, {edge:'falling'}); }; /* The functions for interacting with Android and the Podcast Addict app */ let pkg = "com.bambuna.podcastaddict"; let standardCls = pkg + ".receiver.PodcastAddictPlayerReceiver"; let updateCls = pkg + ".receiver.PodcastAddictBroadcastReceiver"; let speed = 1.0; let simpleSearch = ""; let simpleSearchTerm = function() { // input a simple search term without tags, overrides search with tags (artist and track) require("textinput").input({ text: simpleSearch }).then(result => { simpleSearch = result; }).then(() => { E.showMenu(searchMenu); }); }; let searchPlayWOTags = function() { //make a search and play using entered terms const searchString = simpleSearch; Bluetooth.println(""); Bluetooth.println(JSON.stringify({ t: "intent", action: "android.media.action.MEDIA_PLAY_FROM_SEARCH", package: pkg, target: "activity", extra: { query: searchString }, flags: ["FLAG_ACTIVITY_NEW_TASK"] })); }; let gadgetbridgeWake = function() { Bluetooth.println(""); Bluetooth.println(JSON.stringify({ t: "intent", target: "activity", flags: ["FLAG_ACTIVITY_NEW_TASK", "FLAG_ACTIVITY_CLEAR_TASK", "FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS", "FLAG_ACTIVITY_NO_ANIMATION"], package: "gadgetbridge", class: "nodomain.freeyourgadget.gadgetbridge.activities.WakeActivity" })); }; // For stringing together the action for Podcast Addict to perform let actFn = function(actName, activOrServ) { return "com.bambuna.podcastaddict." + (activOrServ == "service" ? "service." : "") + actName; }; // Send the intent message to Gadgetbridge let btMsg = function(activOrServ, cls, actName, xtra) { Bluetooth.println(""); Bluetooth.println(JSON.stringify({ t: "intent", action: actFn(actName, activOrServ), package: pkg, class: cls, target: "broadcastreceiver", extra: xtra })); }; // Get back to the main layout let backToGfx = function() { E.showMenu(); g.clear(); g.reset(); setUI(); gfx(); backToMenu = false; }; // Podcast Addict Menu let paMenu = { "": { title: " ", back: backToGfx }, "Controls": () => { E.showMenu(controlMenu); }, "Speed Controls": () => { E.showMenu(speedMenu); }, "Search and play": () => { E.showMenu(searchMenu); }, "Navigate and play": () => { E.showMenu(navigationMenu); }, "Wake the android": () => { gadgetbridgeWake(); gadgetbridgeWake(); }, "Exit PA Remote": ()=>{load();} }; let controlMenu = { "": { title: " ", back: () => {if (backToMenu) E.showMenu(paMenu); if (!backToMenu) backToGfx(); } }, "Toggle Play/Pause": () => { btMsg("service", standardCls, "player.toggle"); }, "Jump Backward": () => { btMsg("service", standardCls, "player.jumpbackward"); }, "Jump Forward": () => { btMsg("service", standardCls, "player.jumpforward"); }, "Previous": () => { btMsg("service", standardCls, "player.previoustrack"); }, "Next": () => { btMsg("service", standardCls, "player.nexttrack"); }, "Play": () => { btMsg("service", standardCls, "player.play"); }, "Pause": () => { btMsg("service", standardCls, "player.pause"); }, "Stop": () => { btMsg("service", standardCls, "player.stop"); }, "Update": () => { btMsg("service", updateCls, "update"); }, "Messages Music Controls": () => { load("messagesmusic.app.js"); }, }; let speedMenu = { "": { title: " ", back: () => {if (backToMenu) E.showMenu(paMenu); if (!backToMenu) backToGfx(); } }, "Regular Speed": () => { speed = 1.0; btMsg("service", standardCls, "player.1xspeed"); }, "1.5x Regular Speed": () => { speed = 1.5; btMsg("service", standardCls, "player.1.5xspeed"); }, "2x Regular Speed": () => { speed = 2.0; btMsg("service", standardCls, "player.2xspeed"); }, //"Faster" : ()=>{speed+=0.1; speed=((speed>5.0)?5.0:speed); btMsg("service",standardCls,"player.customspeed",{arg1:speed});}, //"Slower" : ()=>{speed-=0.1; speed=((speed<0.1)?0.1:speed); btMsg("service",standardCls,"player.customspeed",{arg1:speed});}, }; let searchMenu = { "": { title: " ", back: () => {if (backToMenu) E.showMenu(paMenu); if (!backToMenu) backToGfx();} }, "Search term": () => { simpleSearchTerm(); }, "Execute search and play": () => { btMsg("service", standardCls, "player.play"); setTimeout(() => { searchPlayWOTags(); setTimeout(() => { btMsg("service", standardCls, "player.play"); }, 200); }, 1500); }, "Simpler search and play" : searchPlayWOTags, }; let navigationMenu = { "": { title: " ", back: () => {if (backToMenu) E.showMenu(paMenu); if (!backToMenu) backToGfx();} }, "Open Main Screen": () => { btMsg("activity", standardCls, "openmainscreen"); }, "Open Player Screen": () => { btMsg("activity", standardCls, "openplayer"); }, }; Bangle.loadWidgets(); setUI(); widgetUtils.hide(); gfx(); }