diff --git a/android.html b/android.html
index 38e168372..1dc015468 100644
--- a/android.html
+++ b/android.html
@@ -85,6 +85,7 @@
+
diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog
index 15afa790b..c325b06cf 100644
--- a/apps/alarm/ChangeLog
+++ b/apps/alarm/ChangeLog
@@ -55,3 +55,4 @@
to select an alarm in the main menu.
0.50: Bangle.js 2: Long touch of alarm in main menu toggle it on/off. Touching the icon on
the right will do the same.
+0.51: Fix long-touch to enable alarm/timer not updating time (fix #3804)
diff --git a/apps/alarm/app.js b/apps/alarm/app.js
index 0318be6d3..df09737dc 100644
--- a/apps/alarm/app.js
+++ b/apps/alarm/app.js
@@ -87,11 +87,10 @@ function showMainMenu(scroll, group, scrollback) {
};
const getGroups = settings.showGroup && !group;
const groups = getGroups ? {} : undefined;
- var showAlarm;
const getIcon = (e)=>{return e.on ? (e.timer ? iconTimerOn : iconAlarmOn) : (e.timer ? iconTimerOff : iconAlarmOff);};
alarms.forEach((e, index) => {
- showAlarm = !settings.showGroup || (group ? e.group === group : !e.group);
+ const showAlarm = !settings.showGroup || (group ? e.group === group : !e.group);
if(showAlarm) {
const label = trimLabel(getLabel(e),40);
menu[label] = {
@@ -99,6 +98,7 @@ function showMainMenu(scroll, group, scrollback) {
onchange: (v, touch) => {
if (touch && (2==touch.type || 145
e.timer === undefined).forEach(a => a.dow = handleFirstDayOfWeek(a.dow));
@@ -574,13 +582,7 @@ function enableAll(on) {
if (confirm) {
alarms.forEach((alarm, i) => {
alarm.on = on;
- if (on) {
- if (alarm.timer) {
- prepareTimerForSave(alarm, i, require("time_utils").decodeTime(alarm.timer));
- } else {
- prepareAlarmForSave(alarm, i, require("time_utils").decodeTime(alarm.t));
- }
- }
+ if (on) prepareForSave(alarm, i);
});
saveAndReload();
showMainMenu();
diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json
index 17dd147e3..812822992 100644
--- a/apps/alarm/metadata.json
+++ b/apps/alarm/metadata.json
@@ -2,7 +2,7 @@
"id": "alarm",
"name": "Alarms & Timers",
"shortName": "Alarms",
- "version": "0.50",
+ "version": "0.51",
"description": "Set alarms and timers on your Bangle",
"icon": "app.png",
"tags": "tool,alarm",
diff --git a/apps/edgeclk/ChangeLog b/apps/edgeclk/ChangeLog
index 72bb39ab1..34caa2d6a 100644
--- a/apps/edgeclk/ChangeLog
+++ b/apps/edgeclk/ChangeLog
@@ -2,3 +2,5 @@
0.02: Fix reset of progress bars on midnight. Fix display of 100k+ steps.
0.03: Added option to display weather.
0.04: Added option to display live updates of step count.
+0.05: Reset graphics before initial clearing of the screen. Helps in some
+ situations if using fastload utils.
diff --git a/apps/edgeclk/app.js b/apps/edgeclk/app.js
index 79310c3da..b67018917 100644
--- a/apps/edgeclk/app.js
+++ b/apps/edgeclk/app.js
@@ -336,7 +336,7 @@
/* Startup Process
------------------------------------------------------------------------------*/
- g.clear();
+ g.clear(1);
drawAll();
startTimers();
registerEvents();
diff --git a/apps/edgeclk/metadata.json b/apps/edgeclk/metadata.json
index ef97b314b..f7af147da 100644
--- a/apps/edgeclk/metadata.json
+++ b/apps/edgeclk/metadata.json
@@ -2,7 +2,7 @@
"id": "edgeclk",
"name": "Edge Clock",
"shortName": "Edge Clock",
- "version": "0.04",
+ "version": "0.05",
"description": "Crisp clock with perfect readability.",
"readme": "README.md",
"icon": "app.png",
diff --git a/apps/folderlaunch/app.ts b/apps/folderlaunch/app.ts
index aff8e5c7e..5140919db 100644
--- a/apps/folderlaunch/app.ts
+++ b/apps/folderlaunch/app.ts
@@ -174,7 +174,7 @@
* @param _button 1 for left half, 2 for right half
* @param xy postion on screen
*/
- let onTouch = function (_button: number, xy: { x: number, y: number } | undefined) {
+ let onTouch = function (_button, xy) {
// Determine which grid cell was tapped
let x: number = Math.floor((xy!.x - 12) / ((g.getWidth() - 24) / config.display.rows));
if (x < 0) x = 0;
@@ -206,7 +206,7 @@
break;
}
}
- }
+ } satisfies TouchCallback;
let page: number = 0;
let nPages: number; // Set when setting folder
diff --git a/apps/jsonclock/ChangeLog b/apps/jsonclock/ChangeLog
index f8cb62040..a5b6cdc1e 100644
--- a/apps/jsonclock/ChangeLog
+++ b/apps/jsonclock/ChangeLog
@@ -1,2 +1,3 @@
0.01: first release
0.02: memory leak fix; color changes to better align with VSCode color scheme; logo is transparent
+0.03: Fixed redrawing of commas
diff --git a/apps/jsonclock/app.js b/apps/jsonclock/app.js
index 759b51793..3cdc72eb8 100644
--- a/apps/jsonclock/app.js
+++ b/apps/jsonclock/app.js
@@ -229,6 +229,7 @@ let redraw = function() {
if (!(key in valsArrs)) continue;
let valsArr = valsArrs[key];
if (value === valsArr.text) continue; // No need to update
+ if (valsArr.endComma) value = value.slice(0, -1);
valsArrs[key].text = value;
// Clear prev values
@@ -239,7 +240,7 @@ let redraw = function() {
g.drawString(value, valsArr.x, valsArr.y);
if (valsArr.endComma){
g.setColor(clrs.brackets);
- g.drawString(',', valsArr.Banglex + g.stringWidth(value), valsArr.y);
+ g.drawString(',', valsArr.x + g.stringWidth(value), valsArr.y);
}
}
};
diff --git a/apps/jsonclock/metadata.json b/apps/jsonclock/metadata.json
index d097d5b08..da1522207 100644
--- a/apps/jsonclock/metadata.json
+++ b/apps/jsonclock/metadata.json
@@ -1,6 +1,6 @@
{ "id": "jsonclock",
"name": "JsonClock",
- "version": "0.02",
+ "version": "0.03",
"description": "JSON view of the time, date, steps, battery, and sunrise and sunset times",
"icon": "app.png",
"screenshots": [{"url":"dark.png"}],
diff --git a/apps/lint_exemptions.js b/apps/lint_exemptions.js
index e4b489333..753e0a62a 100644
--- a/apps/lint_exemptions.js
+++ b/apps/lint_exemptions.js
@@ -475,12 +475,6 @@ module.exports = {
"no-undef"
]
},
- "apps/warpdrive/app.js": {
- "hash": "c2f9113c4d298a3021ec4bc0bc5f5d1bcd88267b4fa2acc03ae17d6447ed7d00",
- "rules": [
- "no-undef"
- ]
- },
"apps/usgs/settings.js": {
"hash": "00ee672a6920f5667bfbd2988fd2853cfd579895a843ae036a00028dcb13878d",
"rules": [
diff --git a/apps/pace/ChangeLog b/apps/pace/ChangeLog
index 66e01974e..35b746350 100644
--- a/apps/pace/ChangeLog
+++ b/apps/pace/ChangeLog
@@ -2,3 +2,5 @@
0.02: Show elapsed time on pause screen
0.03: Avoid initial GPS skew and allow reset of time/splits
0.04: Bump exstats module - show active time, not elapsed
+0.05: Fix menu display - don't draw over the menu and vice-versa. Require
+ double-tap for menu
diff --git a/apps/pace/README.md b/apps/pace/README.md
index 7a1ea7c06..f9096b289 100644
--- a/apps/pace/README.md
+++ b/apps/pace/README.md
@@ -5,7 +5,8 @@ A running pace app, useful for races. Will also record your splits and display t
Drag up/down on the pause menu to scroll through your splits.
Press the button to pause/resume - when resumed, pressing the button will pause instantly, regardless of whether the screen is locked.
+Double tap the pause screen to access a menu for finer control
+
# Todo
- Load splits on app start, button to reset (exs is always reset)
-- Show total time on pause screen
diff --git a/apps/pace/app.js b/apps/pace/app.js
index 5954ca541..62001ac0c 100644
--- a/apps/pace/app.js
+++ b/apps/pace/app.js
@@ -10,6 +10,7 @@
});
var S_1 = require("Storage");
var drawTimeout_1;
+ var menuShown_1 = false;
var splits_1 = [];
var splitOffset_1 = 0, splitOffsetPx_1 = 0;
var GPS_TIMEOUT_MS_1 = 30000;
@@ -113,12 +114,10 @@
};
var pauseRun_1 = function () {
exs_1.stop();
- Bangle.setGPSPower(0, "pace");
draw_1();
};
var resumeRun_1 = function () {
exs_1.resume();
- Bangle.setGPSPower(1, "pace");
g.clearRect(Bangle.appRect);
layout_1.forgetLazyState();
draw_1();
@@ -129,6 +128,12 @@
else
resumeRun_1();
};
+ var hideMenu_1 = function () {
+ if (!menuShown_1)
+ return;
+ Bangle.setUI();
+ menuShown_1 = false;
+ };
exs_1.start();
exs_1.stats.dist.on("notify", function (dist) {
var prev = { time: 0, dist: 0 };
@@ -156,7 +161,7 @@
});
setWatch(function () { return onButton_1(); }, BTN1, { repeat: true });
Bangle.on('drag', function (e) {
- if (exs_1.state.active || e.b === 0)
+ if (exs_1.state.active || e.b === 0 || menuShown_1)
return;
splitOffsetPx_1 -= e.dy;
if (splitOffsetPx_1 > 20) {
@@ -174,9 +179,10 @@
Bangle.on('twist', function () {
Bangle.setBacklight(1);
});
- Bangle.on('tap', function (_e) {
- if (exs_1.state.active)
+ Bangle.on('tap', function (e) {
+ if (exs_1.state.active || menuShown_1 || !e.double)
return;
+ menuShown_1 = true;
var menu = {
"": {
remove: function () {
@@ -184,22 +190,23 @@
},
},
"< Back": function () {
- Bangle.setUI();
+ hideMenu_1();
},
"Zero time": function () {
exs_1.start();
exs_1.stop();
- Bangle.setUI();
+ hideMenu_1();
},
"Clear splits": function () {
splits_1.splice(0, splits_1.length);
- Bangle.setUI();
+ hideMenu_1();
},
};
E.showMenu(menu);
});
Bangle.loadWidgets();
Bangle.drawWidgets();
+ Bangle.setGPSPower(1, "pace");
g.clearRect(Bangle.appRect);
draw_1();
}
diff --git a/apps/pace/app.ts b/apps/pace/app.ts
index 6d4fd5112..be9ac572b 100644
--- a/apps/pace/app.ts
+++ b/apps/pace/app.ts
@@ -14,6 +14,7 @@ const exs = require("exstats").getStats(
const S = require("Storage");
let drawTimeout: TimeoutId | undefined;
+let menuShown = false;
type Dist = number & { brand: 'dist' };
type Time = number & { brand: 'time' };
@@ -151,13 +152,11 @@ const drawSplit = (i: number, y: number, pace: number | string) =>
const pauseRun = () => {
exs.stop();
- Bangle.setGPSPower(0, "pace")
draw();
};
const resumeRun = () => {
exs.resume();
- Bangle.setGPSPower(1, "pace");
g.clearRect(Bangle.appRect); // splits -> layout, clear. layout -> splits, fine
layout.forgetLazyState();
@@ -171,6 +170,12 @@ const onButton = () => {
resumeRun();
};
+const hideMenu = () => {
+ if (!menuShown) return;
+ Bangle.setUI(); // calls `remove`, which handles redrawing
+ menuShown = false;
+}
+
exs.start(); // aka reset
exs.stats.dist.on("notify", (dist) => {
@@ -209,7 +214,7 @@ Bangle.on('lock', locked => {
setWatch(() => onButton(), BTN1, { repeat: true });
Bangle.on('drag', e => {
- if (exs.state.active || e.b === 0) return;
+ if (exs.state.active || e.b === 0 || menuShown) return;
splitOffsetPx -= e.dy;
if (splitOffsetPx > 20) {
@@ -226,9 +231,11 @@ Bangle.on('twist', () => {
Bangle.setBacklight(1);
});
-Bangle.on('tap', _e => {
- if(exs.state.active) return;
+Bangle.on('tap', e => {
+ // require a double tap, to avoid picking up menu "< Back" taps
+ if(exs.state.active || menuShown || !e.double) return;
+ menuShown = true;
const menu: Menu = {
"": {
remove: () => {
@@ -236,16 +243,16 @@ Bangle.on('tap', _e => {
},
},
"< Back": () => {
- Bangle.setUI(); // calls `remove`, which handles redrawing
+ hideMenu();
},
"Zero time": () => {
exs.start(); // calls reset
exs.stop(); // re-pauses
- Bangle.setUI();
+ hideMenu();
},
"Clear splits": () => {
splits.splice(0, splits.length);
- Bangle.setUI();
+ hideMenu();
},
};
@@ -254,6 +261,7 @@ Bangle.on('tap', _e => {
Bangle.loadWidgets();
Bangle.drawWidgets();
+Bangle.setGPSPower(1, "pace");
g.clearRect(Bangle.appRect);
draw();
diff --git a/apps/pace/metadata.json b/apps/pace/metadata.json
index 4a31a6802..0ae402b82 100644
--- a/apps/pace/metadata.json
+++ b/apps/pace/metadata.json
@@ -1,7 +1,7 @@
{
"id": "pace",
"name": "Pace",
- "version": "0.04",
+ "version": "0.05",
"description": "Show pace and time running splits",
"icon": "app.png",
"tags": "run,running,fitness,outdoors",
diff --git a/apps/promenu/ChangeLog b/apps/promenu/ChangeLog
index 4a0f538fb..6cf4b09b8 100644
--- a/apps/promenu/ChangeLog
+++ b/apps/promenu/ChangeLog
@@ -14,3 +14,5 @@
0.10: Trigger `remove` callbacks when ending the menu
0.11: Add options for natural scroll and disabling wrap-around
0.12: Fix bug where settings would behave as if all were set to false
+0.13: Update to new touch-event handling
+0.14: Fix bug in handling changes to `Bangle.appRect`
diff --git a/apps/promenu/bootb2.js b/apps/promenu/bootb2.js
index d9204c3ab..368bc623b 100644
--- a/apps/promenu/bootb2.js
+++ b/apps/promenu/bootb2.js
@@ -1,7 +1,7 @@
var _a, _b;
-var S = (require("Storage").readJSON("promenu.settings.json", true) || {});
-(_a = S.naturalScroll) !== null && _a !== void 0 ? _a : (S.naturalScroll = false);
-(_b = S.wrapAround) !== null && _b !== void 0 ? _b : (S.wrapAround = true);
+var prosettings = (require("Storage").readJSON("promenu.settings.json", true) || {});
+(_a = prosettings.naturalScroll) !== null && _a !== void 0 ? _a : (prosettings.naturalScroll = false);
+(_b = prosettings.wrapAround) !== null && _b !== void 0 ? _b : (prosettings.wrapAround = true);
E.showMenu = function (items) {
var RectRnd = function (x1, y1, x2, y2, r) {
var pp = [];
@@ -20,14 +20,7 @@ E.showMenu = function (items) {
var menuItems = Object.keys(items).filter(function (x) { return x.length; });
var fontHeight = options.fontHeight || 25;
var selected = options.scroll || options.selected || 0;
- var ar = Bangle.appRect;
- g.reset().clearRect(ar);
- var x = ar.x;
- var x2 = ar.x2;
- var y = ar.y;
- var y2 = ar.y2 - 12;
- if (options.title)
- y += 22;
+ g.reset().clearRect(Bangle.appRect);
var lastIdx = 0;
var selectEdit = undefined;
var scroller = {
@@ -36,6 +29,7 @@ E.showMenu = function (items) {
var nameScroller = null;
var drawLine = function (name, v, item, idx, x, y, nameScroll) {
if (nameScroll === void 0) { nameScroll = 0; }
+ var x2 = Bangle.appRect.x2;
var hl = (idx === selected && !selectEdit);
if (g.theme.dark) {
fillRectRnd(x, y, x2, y + fontHeight - 3, 7, hl ? g.theme.bgH : g.theme.bg + 40);
@@ -74,6 +68,12 @@ E.showMenu = function (items) {
};
var l = {
draw: function (rowmin, rowmax) {
+ var _a = Bangle.appRect, x = _a.x, x2 = _a.x2, y = _a.y, y2 = _a.y2;
+ if (y === 0)
+ y = 24;
+ if (options.title)
+ y += 22;
+ y2 -= 12;
if (nameScroller)
clearInterval(nameScroller), nameScroller = null;
var rows = 0 | Math.min((y2 - y) / fontHeight, menuItems.length);
@@ -133,10 +133,10 @@ E.showMenu = function (items) {
g.setColor((idx < menuItems.length) ? g.theme.fg : g.theme.bg).fillPoly([72, 166, 104, 166, 88, 174]);
g.flip();
},
- select: function () {
+ select: function (evt) {
var item = items[menuItems[selected]];
if (typeof item === "function") {
- item();
+ item(evt);
}
else if (typeof item === "object") {
if (typeof item.value === "number") {
@@ -146,12 +146,12 @@ E.showMenu = function (items) {
if (typeof item.value === "boolean")
item.value = !item.value;
if (item.onchange)
- item.onchange(item.value);
+ item.onchange(item.value, evt);
}
l.draw();
}
},
- move: function (dir) {
+ move: function (dir, evt) {
var item = selectEdit;
if (typeof item === "object" && typeof item.value === "number") {
var orig = item.value;
@@ -162,13 +162,13 @@ E.showMenu = function (items) {
item.value = item.wrap ? item.min : item.max;
if (item.value !== orig) {
if (item.onchange)
- item.onchange(item.value);
+ item.onchange(item.value, evt);
l.draw(selected, selected);
}
}
else {
var lastSelected = selected;
- if (S.wrapAround) {
+ if (prosettings.wrapAround) {
selected = (selected + dir + menuItems.length) % menuItems.length;
}
else {
@@ -198,6 +198,12 @@ E.showMenu = function (items) {
};
Bangle.on('swipe', onSwipe);
}
+ var cb = function (dir, evt) {
+ if (dir)
+ l.move(prosettings.naturalScroll ? -dir : dir, evt);
+ else
+ l.select(evt);
+ };
Bangle.setUI({
mode: "updown",
back: back,
@@ -208,11 +214,9 @@ E.showMenu = function (items) {
Bangle.removeListener("swipe", onSwipe);
(_a = options.remove) === null || _a === void 0 ? void 0 : _a.call(options);
},
- }, function (dir) {
- if (dir)
- l.move(S.naturalScroll ? -dir : dir);
- else
- l.select();
- });
+ touch: (function (_button, xy) {
+ cb(void 0, xy);
+ }),
+ }, cb);
return l;
};
diff --git a/apps/promenu/bootb2.ts b/apps/promenu/bootb2.ts
index 50121061c..ab5444113 100644
--- a/apps/promenu/bootb2.ts
+++ b/apps/promenu/bootb2.ts
@@ -9,9 +9,9 @@ const enum Consts {
NAME_SCROLL_PAD = 5,
}
-const S = (require("Storage").readJSON("promenu.settings.json", true) || {}) as PromenuSettings;
-S.naturalScroll ??= false;
-S.wrapAround ??= true;
+const prosettings = (require("Storage").readJSON("promenu.settings.json", true) || {}) as PromenuSettings;
+prosettings.naturalScroll ??= false;
+prosettings.wrapAround ??= true;
E.showMenu = (items?: Menu): MenuInstance => {
const RectRnd = (x1: number, y1: number, x2: number, y2: number, r: number) => {
@@ -34,15 +34,7 @@ E.showMenu = (items?: Menu): MenuInstance => {
let selected = options.scroll || options.selected || 0;
- const ar = Bangle.appRect;
- g.reset().clearRect(ar);
-
- const x = ar.x;
- const x2 = ar.x2;
- let y = ar.y;
- const y2 = ar.y2 - 12; // padding at end for arrow
- if (options.title)
- y += 22;
+ g.reset().clearRect(Bangle.appRect);
let lastIdx = 0;
let selectEdit: undefined | ActualMenuItem = undefined;
@@ -61,6 +53,7 @@ E.showMenu = (items?: Menu): MenuInstance => {
y: number,
nameScroll: number = 0,
) => {
+ const { x2 } = Bangle.appRect;
const hl = (idx === selected && !selectEdit);
if(g.theme.dark){
fillRectRnd(x, y, x2, y + fontHeight - 3, 7, hl ? g.theme.bgH : g.theme.bg + 40);
@@ -114,6 +107,13 @@ E.showMenu = (items?: Menu): MenuInstance => {
const l = {
draw: (rowmin?: number, rowmax?: number) => {
+ // always refresh appRect, a back button may have appeared
+ let { x, x2, y, y2 } = Bangle.appRect;
+ if(y === 0) y = 24; // always bump down for widgets/back button
+
+ if (options.title) y += 22;
+ y2 -= 12; // padding at end for arrow
+
if (nameScroller) clearInterval(nameScroller), nameScroller = null;
let rows = 0|Math.min((y2 - y) / fontHeight, menuItems.length);
let idx = E.clip(selected - (rows>>1), 0, menuItems.length - rows);
@@ -175,11 +175,11 @@ E.showMenu = (items?: Menu): MenuInstance => {
g.setColor((idx < menuItems.length)?g.theme.fg:g.theme.bg).fillPoly([72, 166, 104, 166, 88, 174]);
g.flip();
},
- select: () => {
+ select: (evt: TouchCallbackXY | undefined) => {
const item = items![menuItems[selected]] as ActualMenuItem;
if (typeof item === "function") {
- item();
+ item(evt);
} else if (typeof item === "object") {
if (typeof item.value === "number") {
selectEdit = selectEdit ? undefined : item;
@@ -188,12 +188,12 @@ E.showMenu = (items?: Menu): MenuInstance => {
item.value = !item.value;
if (item.onchange)
- item.onchange(item.value as boolean);
+ item.onchange(item.value as boolean, evt);
}
l.draw();
}
},
- move: (dir: number) => {
+ move: (dir: number, evt: TouchCallbackXY | undefined) => {
const item = selectEdit;
if (typeof item === "object" && typeof item.value === "number") {
@@ -209,14 +209,14 @@ E.showMenu = (items?: Menu): MenuInstance => {
if (item.value !== orig) {
if (item.onchange)
- item.onchange(item.value);
+ item.onchange(item.value, evt);
l.draw(selected, selected);
}
} else {
const lastSelected = selected;
- if (S.wrapAround) {
+ if (prosettings.wrapAround) {
selected = (selected + dir + /*keep +ve*/menuItems.length) % menuItems.length;
} else {
selected = E.clip(selected + dir, 0, menuItems.length - 1);
@@ -247,6 +247,11 @@ E.showMenu = (items?: Menu): MenuInstance => {
Bangle.on('swipe', onSwipe);
}
+ const cb = (dir?: 1 | -1, evt?: TouchCallbackXY) => {
+ if (dir) l.move(prosettings.naturalScroll ? -dir : dir, evt);
+ else l.select(evt);
+ };
+
Bangle.setUI({
mode: "updown",
back,
@@ -255,11 +260,13 @@ E.showMenu = (items?: Menu): MenuInstance => {
Bangle.removeListener("swipe", onSwipe);
options.remove?.();
},
- } as SetUIArg<"updown">,
- dir => {
- if (dir) l.move(S.naturalScroll ? -dir : dir);
- else l.select();
- });
+ touch: ((_button, xy) => {
+ // since we've specified options.touch,
+ // we need to pass through all taps since the default
+ // touchHandler isn't installed in setUI
+ cb(void 0, xy);
+ }) satisfies TouchCallback,
+ } as SetUIArg<"updown">, cb);
return l;
};
diff --git a/apps/promenu/metadata.json b/apps/promenu/metadata.json
index 05583e1fd..cd7e66e99 100644
--- a/apps/promenu/metadata.json
+++ b/apps/promenu/metadata.json
@@ -1,7 +1,7 @@
{
"id": "promenu",
"name": "Pro Menu",
- "version": "0.12",
+ "version": "0.14",
"description": "Replace the built in menu function. Supports Bangle.js 1 and Bangle.js 2.",
"icon": "icon.png",
"type": "bootloader",
diff --git a/apps/qrcode/ChangeLog b/apps/qrcode/ChangeLog
index 52eadbcf9..9b4526c10 100644
--- a/apps/qrcode/ChangeLog
+++ b/apps/qrcode/ChangeLog
@@ -4,3 +4,4 @@
0.04: Allow scanning of QR codes from camera or file
0.05: Change brightness on touch
0.06: Add ability to generate contact info (MeCard format) QR code
+0.07: Add custom appname (for storing multiple QR codes)
diff --git a/apps/qrcode/custom.html b/apps/qrcode/custom.html
index a3362f101..2ff1cd9db 100644
--- a/apps/qrcode/custom.html
+++ b/apps/qrcode/custom.html
@@ -17,61 +17,61 @@
-
-
-
-
-
-
-
-
-
-
- Detected QR code:
-
None
-
-
-
+
+
+
+
+
+
+
+
+
+
+ Detected QR code:
+
None
+
+
+
-
-
- Detected QR code:
- None
+
+
+ Detected QR code:
+ None
@@ -82,228 +82,229 @@
Additional options:
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+