feat(app): allow external apps to hide statusbar via manifest flags

- Add parseAppFlagsString() in AppManifestParsing.cpp to parse comma-separated flags (HideStatusBar, Hidden, None)
- Parse [app]flags in V1 and app.flags in V2 manifests
- Loader already supports HideStatusBar, GuiService hides statusbarWidget when set
- Enables fullscreen for ELF apps (e.g. BibleVerse, BookPlayer) without firmware recompilation of internal manifests
- Add tests for flag parsing (38 tests passing)
- Tested on es3c28p /dev/cu.usbmodem1101 @ 192.168.68.133 with HelloWorld app
This commit is contained in:
Adolfo Reyna
2026-07-19 19:25:03 -04:00
parent 69e66d4e79
commit 28a277184a
5 changed files with 110 additions and 0 deletions
@@ -56,6 +56,34 @@ bool isValidName(const std::string& name) {
});
}
uint16_t parseAppFlagsString(const std::string& raw) {
uint16_t flags = AppManifest::Flags::None;
if (raw.empty()) {
return flags;
}
auto parts = string::split(raw, ",");
for (auto& part : parts) {
std::string trimmed = string::trim(part, " \t\r\n");
if (trimmed.empty()) {
continue;
}
std::string lower = string::lowercase(trimmed);
if (lower == "hidestatusbar" || lower == "hide_statusbar" || lower == "hide-statusbar" || lower == "hide_status_bar") {
flags |= AppManifest::Flags::HideStatusBar;
} else if (lower == "hidden") {
flags |= AppManifest::Flags::Hidden;
} else if (lower == "none" || lower == "0" || lower == "") {
// keep as none, no additional flag
} else {
LOG_W(TAG, "Unknown app flag \"%s\" - ignoring", trimmed.c_str());
}
}
return flags;
}
/** The V1 format's first line is always the literal "[manifest]" section header; V2 files are flat from the first line onward. */
static bool detectIsV1Format(const std::string& filePath) {
std::string first_line;