diff --git a/App/Source/HelloWorld/HelloWorld.cpp b/App/Source/HelloWorld/HelloWorld.cpp index f02e3fc4..ddd7d1c2 100644 --- a/App/Source/HelloWorld/HelloWorld.cpp +++ b/App/Source/HelloWorld/HelloWorld.cpp @@ -17,7 +17,7 @@ class HelloWorldApp : public App { }; extern const AppManifest hello_world_app = { - .id = "HelloWorld", - .name = "Hello World", + .appId = "HelloWorld", + .appName = "Hello World", .createApp = create }; diff --git a/ExternalApps/Calculator/manifest.properties b/ExternalApps/Calculator/manifest.properties index 574ae7ed..83001b50 100644 --- a/ExternalApps/Calculator/manifest.properties +++ b/ExternalApps/Calculator/manifest.properties @@ -5,9 +5,6 @@ sdk=0.6.0-SNAPSHOT1 platforms=esp32,esp32s3 [app] id=one.tactility.calculator -version=0.1.0 +versionName=0.1.0 +versionCode=1 name=Calculator -description=Math is cool -[author] -name=Tactility -website=https://tactility.one diff --git a/ExternalApps/Calculator/tactility.py b/ExternalApps/Calculator/tactility.py index 292e61e9..faa4dfba 100644 --- a/ExternalApps/Calculator/tactility.py +++ b/ExternalApps/Calculator/tactility.py @@ -14,7 +14,7 @@ import shutil import configparser ttbuild_path = ".tactility" -ttbuild_version = "2.1.1" +ttbuild_version = "2.2.0" ttbuild_cdn = "https://cdn.tactility.one" ttbuild_sdk_json_validity = 3600 # seconds ttport = 6666 @@ -242,19 +242,12 @@ def validate_manifest(manifest): exit_with_error("Invalid manifest format: [app] not found") if not "id" in manifest["app"]: exit_with_error("Invalid manifest format: [app] id not found") - if not "version" in manifest["app"]: - exit_with_error("Invalid manifest format: [app] version not found") + if not "versionName" in manifest["app"]: + exit_with_error("Invalid manifest format: [app] versionName not found") + if not "versionCode" in manifest["app"]: + exit_with_error("Invalid manifest format: [app] versionCode not found") if not "name" in manifest["app"]: exit_with_error("Invalid manifest format: [app] name not found") - if not "description" in manifest["app"]: - exit_with_error("Invalid manifest format: [app] description not found") - # [author] - if not "author" in manifest: - exit_with_error("Invalid manifest format: [author] not found") - if not "name" in manifest["author"]: - exit_with_error("Invalid manifest format: [author] name not found") - if not "website" in manifest["author"]: - exit_with_error("Invalid manifest format: [author] website not found") def is_valid_manifest_platform(manifest, platform): manifest_platforms = manifest["target"]["platforms"].split(",") diff --git a/ExternalApps/GraphicsDemo/manifest.properties b/ExternalApps/GraphicsDemo/manifest.properties index 7caa4c54..dc797514 100644 --- a/ExternalApps/GraphicsDemo/manifest.properties +++ b/ExternalApps/GraphicsDemo/manifest.properties @@ -5,9 +5,6 @@ sdk=0.6.0-SNAPSHOT1 platforms=esp32,esp32s3 [app] id=one.tactility.graphicsdemo -version=0.1.0 +versionName=0.1.0 +versionCode=1 name=Graphics Demo -description=A graphics and touch driver demonstration -[author] -name=Tactility -website=https://tactility.one diff --git a/ExternalApps/GraphicsDemo/tactility.py b/ExternalApps/GraphicsDemo/tactility.py index 292e61e9..faa4dfba 100644 --- a/ExternalApps/GraphicsDemo/tactility.py +++ b/ExternalApps/GraphicsDemo/tactility.py @@ -14,7 +14,7 @@ import shutil import configparser ttbuild_path = ".tactility" -ttbuild_version = "2.1.1" +ttbuild_version = "2.2.0" ttbuild_cdn = "https://cdn.tactility.one" ttbuild_sdk_json_validity = 3600 # seconds ttport = 6666 @@ -242,19 +242,12 @@ def validate_manifest(manifest): exit_with_error("Invalid manifest format: [app] not found") if not "id" in manifest["app"]: exit_with_error("Invalid manifest format: [app] id not found") - if not "version" in manifest["app"]: - exit_with_error("Invalid manifest format: [app] version not found") + if not "versionName" in manifest["app"]: + exit_with_error("Invalid manifest format: [app] versionName not found") + if not "versionCode" in manifest["app"]: + exit_with_error("Invalid manifest format: [app] versionCode not found") if not "name" in manifest["app"]: exit_with_error("Invalid manifest format: [app] name not found") - if not "description" in manifest["app"]: - exit_with_error("Invalid manifest format: [app] description not found") - # [author] - if not "author" in manifest: - exit_with_error("Invalid manifest format: [author] not found") - if not "name" in manifest["author"]: - exit_with_error("Invalid manifest format: [author] name not found") - if not "website" in manifest["author"]: - exit_with_error("Invalid manifest format: [author] website not found") def is_valid_manifest_platform(manifest, platform): manifest_platforms = manifest["target"]["platforms"].split(",") diff --git a/ExternalApps/HelloWorld/manifest.properties b/ExternalApps/HelloWorld/manifest.properties index 7754140b..ba386934 100644 --- a/ExternalApps/HelloWorld/manifest.properties +++ b/ExternalApps/HelloWorld/manifest.properties @@ -5,9 +5,6 @@ sdk=0.6.0-SNAPSHOT1 platforms=esp32,esp32s3 [app] id=one.tactility.helloworld -version=0.1.0 -name=Hello World -description=A demonstration app that says hi -[author] -name=Tactility -website=https://tactility.one \ No newline at end of file +versionName=0.1.0 +versionCode=1 +name=Hello World \ No newline at end of file diff --git a/ExternalApps/HelloWorld/tactility.py b/ExternalApps/HelloWorld/tactility.py index 292e61e9..faa4dfba 100644 --- a/ExternalApps/HelloWorld/tactility.py +++ b/ExternalApps/HelloWorld/tactility.py @@ -14,7 +14,7 @@ import shutil import configparser ttbuild_path = ".tactility" -ttbuild_version = "2.1.1" +ttbuild_version = "2.2.0" ttbuild_cdn = "https://cdn.tactility.one" ttbuild_sdk_json_validity = 3600 # seconds ttport = 6666 @@ -242,19 +242,12 @@ def validate_manifest(manifest): exit_with_error("Invalid manifest format: [app] not found") if not "id" in manifest["app"]: exit_with_error("Invalid manifest format: [app] id not found") - if not "version" in manifest["app"]: - exit_with_error("Invalid manifest format: [app] version not found") + if not "versionName" in manifest["app"]: + exit_with_error("Invalid manifest format: [app] versionName not found") + if not "versionCode" in manifest["app"]: + exit_with_error("Invalid manifest format: [app] versionCode not found") if not "name" in manifest["app"]: exit_with_error("Invalid manifest format: [app] name not found") - if not "description" in manifest["app"]: - exit_with_error("Invalid manifest format: [app] description not found") - # [author] - if not "author" in manifest: - exit_with_error("Invalid manifest format: [author] not found") - if not "name" in manifest["author"]: - exit_with_error("Invalid manifest format: [author] name not found") - if not "website" in manifest["author"]: - exit_with_error("Invalid manifest format: [author] website not found") def is_valid_manifest_platform(manifest, platform): manifest_platforms = manifest["target"]["platforms"].split(",") diff --git a/Tactility/Include/Tactility/app/App.h b/Tactility/Include/Tactility/app/App.h index d38ad473..f0d14807 100644 --- a/Tactility/Include/Tactility/app/App.h +++ b/Tactility/Include/Tactility/app/App.h @@ -94,8 +94,6 @@ std::shared_ptr _Nullable getCurrentAppContext(); /** @return the currently running app (it is only ever null before the splash screen is shown) */ std::shared_ptr _Nullable getCurrentApp(); -bool isValidId(const std::string& id); - bool install(const std::string& path); bool uninstall(const std::string& appId); diff --git a/Tactility/Include/Tactility/app/AppManifest.h b/Tactility/Include/Tactility/app/AppManifest.h index 17892dba..c774e33d 100644 --- a/Tactility/Include/Tactility/app/AppManifest.h +++ b/Tactility/Include/Tactility/app/AppManifest.h @@ -63,39 +63,45 @@ struct AppManifest { constexpr static uint32_t Hidden = 1 << 1; }; + /** The version of the manifest file format */ + std::string manifestVersion = {}; + + /** The SDK version that was used to compile this app. (e.g. "0.6.0") */ + std::string targetSdk = {}; + + /** Comma-separated list of platforms, e.g. "esp32,esp32s3" */ + std::string targetPlatforms = {}; + /** The identifier by which the app is launched by the system and other apps. */ - std::string id = {}; + std::string appId = {}; /** The user-readable name of the app. Used in UI. */ - std::string name = {}; + std::string appName = {}; /** Optional icon. */ - std::string icon = {}; + std::string appIcon = {}; - /** Optional description */ - std::string description = {}; + /** The version as it is displayed to the user (e.g. "1.2.0") */ + std::string appVersionName = {}; - /** Optional author name */ - std::string authorName = {}; - - /** Optional author website */ - std::string authorWebsite = {}; + /** The technical version (must be incremented with new releases of the app */ + uint64_t appVersionCode = {}; /** App category helps with listing apps in Launcher, app list or settings apps. */ - Category category = Category::User; + Category appCategory = Category::User; /** Where the app is located */ - Location location = Location::internal(); + Location appLocation = Location::internal(); /** Controls various settings */ - uint32_t flags = Flags::None; + uint32_t appFlags = Flags::None; /** Create the instance of the app */ CreateApp createApp = nullptr; }; struct { - bool operator()(const std::shared_ptr& left, const std::shared_ptr& right) const { return left->name < right->name; } + bool operator()(const std::shared_ptr& left, const std::shared_ptr& right) const { return left->appName < right->appName; } } SortAppManifestByName; } // namespace diff --git a/Tactility/Private/Tactility/app/AppInstance.h b/Tactility/Private/Tactility/app/AppInstance.h index 7b1ce70d..033cd80c 100644 --- a/Tactility/Private/Tactility/app/AppInstance.h +++ b/Tactility/Private/Tactility/app/AppInstance.h @@ -41,10 +41,10 @@ class AppInstance : public AppContext { static std::shared_ptr createApp( const std::shared_ptr& manifest ) { - if (manifest->location.isInternal()) { + if (manifest->appLocation.isInternal()) { assert(manifest->createApp != nullptr); return manifest->createApp(); - } else if (manifest->location.isExternal()) { + } else if (manifest->appLocation.isExternal()) { if (manifest->createApp != nullptr) { TT_LOG_W("", "Manifest specifies createApp, but this is not used with external apps"); } diff --git a/Tactility/Private/Tactility/app/AppManifestParsing.h b/Tactility/Private/Tactility/app/AppManifestParsing.h new file mode 100644 index 00000000..c2fc902b --- /dev/null +++ b/Tactility/Private/Tactility/app/AppManifestParsing.h @@ -0,0 +1,14 @@ +#pragma once + +#include + +#include +#include + +namespace tt::app { + +bool isValidId(const std::string& id); + +bool parseManifest(const std::map& map, AppManifest& manifest); + +} diff --git a/Tactility/Source/Paths.cpp b/Tactility/Source/Paths.cpp index de7aee0a..b35a847b 100644 --- a/Tactility/Source/Paths.cpp +++ b/Tactility/Source/Paths.cpp @@ -1,9 +1,11 @@ #include -#include +#include #include #include +#include + namespace tt { bool findFirstMountedSdCardPath(std::string& path) { diff --git a/Tactility/Source/Tactility.cpp b/Tactility/Source/Tactility.cpp index 9c7dd4be..b2b944e5 100644 --- a/Tactility/Source/Tactility.cpp +++ b/Tactility/Source/Tactility.cpp @@ -176,10 +176,10 @@ static void registerInstalledApp(std::string path) { } app::addApp({ - .id = app_id_entry->second, - .name = app_name_entry->second, - .category = app::Category::User, - .location = app::Location::external(path) + .appId = app_id_entry->second, + .appName = app_name_entry->second, + .appCategory = app::Category::User, + .appLocation = app::Location::external(path) }); } @@ -289,7 +289,7 @@ void run(const Configuration& config) { TT_LOG_I(TAG, "Starting boot app"); // The boot app takes care of registering system apps, user services and user apps addApp(app::boot::manifest); - service::loader::startApp(app::boot::manifest.id); + service::loader::startApp(app::boot::manifest.appId); TT_LOG_I(TAG, "Main dispatcher ready"); while (true) { diff --git a/Tactility/Source/app/App.cpp b/Tactility/Source/app/App.cpp index 0d929bf2..806b2be5 100644 --- a/Tactility/Source/app/App.cpp +++ b/Tactility/Source/app/App.cpp @@ -1,4 +1,3 @@ -#include #include #include @@ -20,9 +19,4 @@ std::shared_ptr _Nullable getCurrentApp() { return service::loader::getCurrentApp(); } -bool isValidId(const std::string& id) { - const auto pattern = std::regex("^[a-zA-Z0-9_-\\.]+$"); - return std::regex_match(id, pattern); -} - } diff --git a/Tactility/Source/app/AppInstall.cpp b/Tactility/Source/app/AppInstall.cpp index db660843..d3e55ade 100644 --- a/Tactility/Source/app/AppInstall.cpp +++ b/Tactility/Source/app/AppInstall.cpp @@ -1,8 +1,8 @@ #include "Tactility/Paths.h" #include +#include -#include #include #include #include @@ -105,92 +105,103 @@ static bool untar(const std::string& tarPath, const std::string& destinationPath return success; } -bool install(const std::string& path) { - // TODO: Make better: lock for each path type properly (source vs target) +void cleanupInstallDirectory(const std::string& path) { + const auto lock = file::getLock(path); + lock->lock(); + if (!file::deleteRecursively(path)) { + TT_LOG_W(TAG, "Failed to delete existing installation at %s", path.c_str()); + } + lock->unlock(); +} +bool install(const std::string& path) { // We lock and unlock frequently because SPI SD card devices share // the lock with the display. We don't want to lock the display for very long. auto app_parent_path = getAppInstallPath(); TT_LOG_I(TAG, "Installing app %s to %s", path.c_str(), app_parent_path.c_str()); - auto lock = file::getLock(app_parent_path)->asScopedLock(); + auto target_path_lock = file::getLock(app_parent_path)->asScopedLock(); - lock.lock(); + target_path_lock.lock(); auto filename = file::getLastPathSegment(path); const std::string app_target_path = std::format("{}/{}", app_parent_path, filename); if (file::isDirectory(app_target_path) && !file::deleteRecursively(app_target_path)) { TT_LOG_W(TAG, "Failed to delete %s", app_target_path.c_str()); } - lock.unlock(); + target_path_lock.unlock(); - lock.lock(); + target_path_lock.lock(); if (!file::findOrCreateDirectory(app_target_path, 0777)) { TT_LOG_I(TAG, "Failed to create directory %s", app_target_path.c_str()); return false; } - lock.unlock(); + target_path_lock.unlock(); - lock.lock(); + auto source_path_lock = file::getLock(path)->asScopedLock(); + target_path_lock.lock(); + source_path_lock.lock(); TT_LOG_I(TAG, "Extracting app from %s to %s", path.c_str(), app_target_path.c_str()); if (!untar(path, app_target_path)) { TT_LOG_E(TAG, "Failed to extract"); return false; } - lock.unlock(); + source_path_lock.unlock(); + target_path_lock.unlock(); - lock.lock(); + target_path_lock.lock(); auto manifest_path = app_target_path + "/manifest.properties"; if (!file::isFile(manifest_path)) { TT_LOG_E(TAG, "Manifest not found at %s", manifest_path.c_str()); + cleanupInstallDirectory(app_target_path); return false; } - lock.unlock(); + target_path_lock.unlock(); - lock.lock(); + target_path_lock.lock(); std::map properties; if (!file::loadPropertiesFile(manifest_path, properties)) { TT_LOG_E(TAG, "Failed to load manifest at %s", manifest_path.c_str()); + cleanupInstallDirectory(app_target_path); return false; } - lock.unlock(); + target_path_lock.unlock(); - auto app_id_iterator = properties.find("[app]id"); - if (app_id_iterator == properties.end()) { - TT_LOG_E(TAG, "Failed to find app id in manifest"); + AppManifest manifest; + if (!parseManifest(properties, manifest)) { + TT_LOG_W(TAG, "Invalid manifest"); + cleanupInstallDirectory(app_target_path); return false; } - auto app_name_entry = properties.find("[app]name"); - if (app_name_entry == properties.end()) { - TT_LOG_E(TAG, "Failed to find app name in manifest"); - return false; - } + TT_LOG_I(TAG, "1"); - lock.lock(); - const std::string renamed_target_path = std::format("{}/{}", app_parent_path, app_id_iterator->second); + target_path_lock.lock(); + const std::string renamed_target_path = std::format("{}/{}", app_parent_path, manifest.appId); if (file::isDirectory(renamed_target_path)) { if (!file::deleteRecursively(renamed_target_path)) { TT_LOG_W(TAG, "Failed to delete existing installation at %s", renamed_target_path.c_str()); + cleanupInstallDirectory(app_target_path); return false; } } - lock.unlock(); + target_path_lock.unlock(); - lock.lock(); + TT_LOG_I(TAG, "2"); + target_path_lock.lock(); if (rename(app_target_path.c_str(), renamed_target_path.c_str()) != 0) { - TT_LOG_E(TAG, "Failed to rename %s to %s", app_target_path.c_str(), app_id_iterator->second.c_str()); + TT_LOG_E(TAG, "Failed to rename \"%s\" to \"%s\"", app_target_path.c_str(), manifest.appId.c_str()); + cleanupInstallDirectory(app_target_path); return false; } - lock.unlock(); + target_path_lock.unlock(); - addApp({ - .id = app_id_iterator->second, - .name = app_name_entry->second, - .category = Category::User, - .location = Location::external(renamed_target_path) - }); + manifest.appLocation = Location::external(renamed_target_path); + TT_LOG_I(TAG, "3"); + addApp(manifest); + + TT_LOG_I(TAG, "4"); return true; } diff --git a/Tactility/Source/app/AppInstancePaths.cpp b/Tactility/Source/app/AppInstancePaths.cpp index 26c073e2..5d57f336 100644 --- a/Tactility/Source/app/AppInstancePaths.cpp +++ b/Tactility/Source/app/AppInstancePaths.cpp @@ -12,38 +12,38 @@ namespace tt::app { std::string AppInstancePaths::getDataDirectory() const { - return PARTITION_PREFIX + file::DATA_PARTITION_NAME + "/app/" + manifest.id; + return PARTITION_PREFIX + file::DATA_PARTITION_NAME + "/app/" + manifest.appId; } std::string AppInstancePaths::getDataDirectoryLvgl() const { - return LVGL_PATH_PREFIX + file::DATA_PARTITION_NAME + "/app/" + manifest.id; + return LVGL_PATH_PREFIX + file::DATA_PARTITION_NAME + "/app/" + manifest.appId; } std::string AppInstancePaths::getDataPath(const std::string& childPath) const { assert(!childPath.starts_with('/')); - return PARTITION_PREFIX + file::DATA_PARTITION_NAME + "/app/" + manifest.id + '/' + childPath; + return PARTITION_PREFIX + file::DATA_PARTITION_NAME + "/app/" + manifest.appId + '/' + childPath; } std::string AppInstancePaths::getDataPathLvgl(const std::string& childPath) const { assert(!childPath.starts_with('/')); - return LVGL_PATH_PREFIX + file::DATA_PARTITION_NAME + "/app/" + manifest.id + '/' + childPath; + return LVGL_PATH_PREFIX + file::DATA_PARTITION_NAME + "/app/" + manifest.appId + '/' + childPath; } std::string AppInstancePaths::getSystemDirectory() const { - return PARTITION_PREFIX + file::SYSTEM_PARTITION_NAME + "/app/" + manifest.id; + return PARTITION_PREFIX + file::SYSTEM_PARTITION_NAME + "/app/" + manifest.appId; } std::string AppInstancePaths::getSystemDirectoryLvgl() const { - return LVGL_PATH_PREFIX + file::SYSTEM_PARTITION_NAME + "/app/" + manifest.id; + return LVGL_PATH_PREFIX + file::SYSTEM_PARTITION_NAME + "/app/" + manifest.appId; } std::string AppInstancePaths::getSystemPath(const std::string& childPath) const { assert(!childPath.starts_with('/')); - return PARTITION_PREFIX + file::SYSTEM_PARTITION_NAME + "/app/" + manifest.id + '/' + childPath; + return PARTITION_PREFIX + file::SYSTEM_PARTITION_NAME + "/app/" + manifest.appId + '/' + childPath; } std::string AppInstancePaths::getSystemPathLvgl(const std::string& childPath) const { - return LVGL_PATH_PREFIX + file::SYSTEM_PARTITION_NAME + "/app/" + manifest.id + '/' + childPath; + return LVGL_PATH_PREFIX + file::SYSTEM_PARTITION_NAME + "/app/" + manifest.appId + '/' + childPath; } } diff --git a/Tactility/Source/app/AppManifestParsing.cpp b/Tactility/Source/app/AppManifestParsing.cpp new file mode 100644 index 00000000..3cc7c230 --- /dev/null +++ b/Tactility/Source/app/AppManifestParsing.cpp @@ -0,0 +1,144 @@ +#include + +#include + +namespace tt::app { + +constexpr auto* TAG = "App"; + +static bool validateString(const std::string& value, const std::function& isValidChar) { + for (const auto& c : value) { + if (!isValidChar(c)) { + return false; + } + } + return true; +} + +static bool getValueFromManifest(const std::map& map, const std::string& key, std::string& output) { + const auto iterator = map.find(key); + if (iterator == map.end()) { + TT_LOG_E(TAG, "Failed to find %s in manifest", key.c_str()); + return false; + } + output = iterator->second; + return true; +} + +bool isValidId(const std::string& id) { + return id.size() >= 5 && validateString(id, [](const char c) { + return std::isalnum(c) != 0 || c == '.'; + }); +} + +static bool isValidManifestVersion(const std::string& version) { + return version.size() > 0 && validateString(version, [](const char c) { + return std::isalnum(c) != 0 || c == '.'; + }); +} + +static bool isValidAppVersionName(const std::string& version) { + return version.size() > 0 && validateString(version, [](const char c) { + return std::isalnum(c) != 0 || c == '.' || c == '-' || c == '_'; + }); +} + +static bool isValidAppVersionCode(const std::string& version) { + return version.size() > 0 && validateString(version, [](const char c) { + return std::isdigit(c) != 0; + }); +} + +static bool isValidName(const std::string& name) { + return name.size() >= 2 && validateString(name, [](const char c) { + return std::isalnum(c) != 0 || c == ' ' || c == '-'; + }); +} + +bool parseManifest(const std::map& map, AppManifest& manifest) { + TT_LOG_I(TAG, "Parsing manifest"); + + // [manifest] + + if (!getValueFromManifest(map, "[manifest]version", manifest.manifestVersion)) { + return false; + } + + TT_LOG_I(TAG, "a"); + + if (!isValidManifestVersion(manifest.manifestVersion)) { + TT_LOG_E(TAG, "Invalid version"); + return false; + } + + TT_LOG_I(TAG, "b"); + // [app] + + if (!getValueFromManifest(map, "[app]id", manifest.appId)) { + return false; + } + + TT_LOG_I(TAG, "c"); + if (!isValidId(manifest.appId)) { + TT_LOG_E(TAG, "Invalid app id"); + return false; + } + + TT_LOG_I(TAG, "d"); + if (!getValueFromManifest(map, "[app]name", manifest.appName)) { + return false; + } + + TT_LOG_I(TAG, "e"); + if (!isValidName(manifest.appName)) { + TT_LOG_I(TAG, "Invalid app name"); + return false; + } + + TT_LOG_I(TAG, "f"); + if (!getValueFromManifest(map, "[app]versionName", manifest.appVersionName)) { + return false; + } + + TT_LOG_I(TAG, "g"); + if (!isValidAppVersionName(manifest.appVersionName)) { + TT_LOG_E(TAG, "Invalid app version name"); + return false; + } + + TT_LOG_I(TAG, "h"); + std::string version_code_string; + if (!getValueFromManifest(map, "[app]versionCode", version_code_string)) { + return false; + } + + TT_LOG_I(TAG, "i"); + if (!isValidAppVersionCode(version_code_string)) { + TT_LOG_E(TAG, "Invalid app version code"); + return false; + } + + manifest.appVersionCode = std::stoull(version_code_string); + + // [target] + + TT_LOG_I(TAG, "j"); + if (!getValueFromManifest(map, "[target]sdk", manifest.targetSdk)) { + return false; + } + TT_LOG_I(TAG, "k"); + + if (!getValueFromManifest(map, "[target]platforms", manifest.targetPlatforms)) { + return false; + } + + TT_LOG_I(TAG, "l"); + // Defaults + + manifest.appCategory = Category::User; + manifest.appLocation = Location::external(""); + + return true; +} + +} diff --git a/Tactility/Source/app/AppRegistration.cpp b/Tactility/Source/app/AppRegistration.cpp index 697dfa7d..44baf640 100644 --- a/Tactility/Source/app/AppRegistration.cpp +++ b/Tactility/Source/app/AppRegistration.cpp @@ -16,15 +16,15 @@ static AppManifestMap app_manifest_map; static Mutex hash_mutex(Mutex::Type::Normal); void addApp(const AppManifest& manifest) { - TT_LOG_I(TAG, "Registering manifest %s", manifest.id.c_str()); + TT_LOG_I(TAG, "Registering manifest %s", manifest.appId.c_str()); hash_mutex.lock(); - if (app_manifest_map.contains(manifest.id)) { - TT_LOG_W(TAG, "Overwriting existing manifest for %s", manifest.id.c_str()); + if (app_manifest_map.contains(manifest.appId)) { + TT_LOG_W(TAG, "Overwriting existing manifest for %s", manifest.appId.c_str()); } - app_manifest_map[manifest.id] = std::make_shared(manifest); + app_manifest_map[manifest.appId] = std::make_shared(manifest); hash_mutex.unlock(); } diff --git a/Tactility/Source/app/ElfApp.cpp b/Tactility/Source/app/ElfApp.cpp index 4f32e60d..cae0cf4a 100644 --- a/Tactility/Source/app/ElfApp.cpp +++ b/Tactility/Source/app/ElfApp.cpp @@ -223,8 +223,8 @@ void setElfAppParameters( std::shared_ptr createElfApp(const std::shared_ptr& manifest) { TT_LOG_I(TAG, "createElfApp"); assert(manifest != nullptr); - assert(manifest->location.isExternal()); - return std::make_shared(manifest->location.getPath()); + assert(manifest->appLocation.isExternal()); + return std::make_shared(manifest->appLocation.getPath()); } } // namespace diff --git a/Tactility/Source/app/addgps/AddGps.cpp b/Tactility/Source/app/addgps/AddGps.cpp index 235bfb64..bd165f22 100644 --- a/Tactility/Source/app/addgps/AddGps.cpp +++ b/Tactility/Source/app/addgps/AddGps.cpp @@ -172,16 +172,16 @@ public: }; extern const AppManifest manifest = { - .id = "AddGps", - .name = "Add GPS", - .icon = LV_SYMBOL_GPS, - .category = Category::System, - .flags = AppManifest::Flags::Hidden, + .appId = "AddGps", + .appName = "Add GPS", + .appIcon = LV_SYMBOL_GPS, + .appCategory = Category::System, + .appFlags = AppManifest::Flags::Hidden, .createApp = create }; void start() { - app::start(manifest.id); + app::start(manifest.appId); } } // namespace diff --git a/Tactility/Source/app/alertdialog/AlertDialog.cpp b/Tactility/Source/app/alertdialog/AlertDialog.cpp index fabf86fa..42d92aac 100644 --- a/Tactility/Source/app/alertdialog/AlertDialog.cpp +++ b/Tactility/Source/app/alertdialog/AlertDialog.cpp @@ -28,7 +28,7 @@ LaunchId start(const std::string& title, const std::string& message, const std:: bundle->putString(PARAMETER_BUNDLE_KEY_TITLE, title); bundle->putString(PARAMETER_BUNDLE_KEY_MESSAGE, message); bundle->putString(PARAMETER_BUNDLE_KEY_BUTTON_LABELS, items_joined); - return service::loader::startApp(manifest.id, bundle); + return service::loader::startApp(manifest.appId, bundle); } LaunchId start(const std::string& title, const std::string& message) { @@ -36,7 +36,7 @@ LaunchId start(const std::string& title, const std::string& message) { bundle->putString(PARAMETER_BUNDLE_KEY_TITLE, title); bundle->putString(PARAMETER_BUNDLE_KEY_MESSAGE, message); bundle->putString(PARAMETER_BUNDLE_KEY_BUTTON_LABELS, "OK"); - return service::loader::startApp(manifest.id, bundle); + return service::loader::startApp(manifest.appId, bundle); } int32_t getResultIndex(const Bundle& bundle) { @@ -126,10 +126,10 @@ public: }; extern const AppManifest manifest = { - .id = "AlertDialog", - .name = "Alert Dialog", - .category = Category::System, - .flags = AppManifest::Flags::Hidden, + .appId = "AlertDialog", + .appName = "Alert Dialog", + .appCategory = Category::System, + .appFlags = AppManifest::Flags::Hidden, .createApp = create }; diff --git a/Tactility/Source/app/applist/AppList.cpp b/Tactility/Source/app/applist/AppList.cpp index 9c232bc6..9643db1d 100644 --- a/Tactility/Source/app/applist/AppList.cpp +++ b/Tactility/Source/app/applist/AppList.cpp @@ -13,12 +13,12 @@ class AppListApp : public App { static void onAppPressed(lv_event_t* e) { const auto* manifest = static_cast(lv_event_get_user_data(e)); - service::loader::startApp(manifest->id); + service::loader::startApp(manifest->appId); } static void createAppWidget(const std::shared_ptr& manifest, lv_obj_t* list) { - const void* icon = !manifest->icon.empty() ? manifest->icon.c_str() : TT_ASSETS_APP_ICON_FALLBACK; - lv_obj_t* btn = lv_list_add_button(list, icon, manifest->name.c_str()); + const void* icon = !manifest->appIcon.empty() ? manifest->appIcon.c_str() : TT_ASSETS_APP_ICON_FALLBACK; + lv_obj_t* btn = lv_list_add_button(list, icon, manifest->appName.c_str()); lv_obj_add_event_cb(btn, &onAppPressed, LV_EVENT_SHORT_CLICKED, manifest.get()); } @@ -40,8 +40,8 @@ public: std::ranges::sort(manifests, SortAppManifestByName); for (const auto& manifest: manifests) { - bool is_valid_category = (manifest->category == Category::User) || (manifest->category == Category::System); - bool is_visible = (manifest->flags & AppManifest::Flags::Hidden) == 0u; + bool is_valid_category = (manifest->appCategory == Category::User) || (manifest->appCategory == Category::System); + bool is_visible = (manifest->appFlags & AppManifest::Flags::Hidden) == 0u; if (is_valid_category && is_visible) { createAppWidget(manifest, list); } @@ -50,10 +50,10 @@ public: }; extern const AppManifest manifest = { - .id = "AppList", - .name = "Apps", - .category = Category::System, - .flags = AppManifest::Flags::Hidden, + .appId = "AppList", + .appName = "Apps", + .appCategory = Category::System, + .appFlags = AppManifest::Flags::Hidden, .createApp = create, }; diff --git a/Tactility/Source/app/boot/Boot.cpp b/Tactility/Source/app/boot/Boot.cpp index 0736f90b..b4c14212 100644 --- a/Tactility/Source/app/boot/Boot.cpp +++ b/Tactility/Source/app/boot/Boot.cpp @@ -174,10 +174,10 @@ public: }; extern const AppManifest manifest = { - .id = "Boot", - .name = "Boot", - .category = Category::System, - .flags = AppManifest::Flags::HideStatusBar | AppManifest::Flags::Hidden, + .appId = "Boot", + .appName = "Boot", + .appCategory = Category::System, + .appFlags = AppManifest::Flags::HideStatusBar | AppManifest::Flags::Hidden, .createApp = create }; diff --git a/Tactility/Source/app/calculator/Calculator.cpp b/Tactility/Source/app/calculator/Calculator.cpp index 431332d8..6324474e 100644 --- a/Tactility/Source/app/calculator/Calculator.cpp +++ b/Tactility/Source/app/calculator/Calculator.cpp @@ -224,9 +224,9 @@ class CalculatorApp : public App { }; extern const AppManifest manifest = { - .id = "Calculator", - .name = "Calculator", - .icon = TT_ASSETS_APP_ICON_CALCULATOR, + .appId = "Calculator", + .appName = "Calculator", + .appIcon = TT_ASSETS_APP_ICON_CALCULATOR, .createApp = create }; diff --git a/Tactility/Source/app/chat/ChatApp.cpp b/Tactility/Source/app/chat/ChatApp.cpp index 5bd2d1ed..7a5ca044 100644 --- a/Tactility/Source/app/chat/ChatApp.cpp +++ b/Tactility/Source/app/chat/ChatApp.cpp @@ -136,9 +136,9 @@ public: }; extern const AppManifest manifest = { - .id = "Chat", - .name = "Chat", - .icon = TT_ASSETS_APP_ICON_CHAT, + .appId = "Chat", + .appName = "Chat", + .appIcon = TT_ASSETS_APP_ICON_CHAT, .createApp = create }; diff --git a/Tactility/Source/app/crashdiagnostics/CrashDiagnostics.cpp b/Tactility/Source/app/crashdiagnostics/CrashDiagnostics.cpp index 30d84169..d487e700 100644 --- a/Tactility/Source/app/crashdiagnostics/CrashDiagnostics.cpp +++ b/Tactility/Source/app/crashdiagnostics/CrashDiagnostics.cpp @@ -122,15 +122,15 @@ public: }; extern const AppManifest manifest = { - .id = "CrashDiagnostics", - .name = "Crash Diagnostics", - .category = Category::System, - .flags = AppManifest::Flags::Hidden, + .appId = "CrashDiagnostics", + .appName = "Crash Diagnostics", + .appCategory = Category::System, + .appFlags = AppManifest::Flags::Hidden, .createApp = create }; void start() { - service::loader::startApp(manifest.id); + service::loader::startApp(manifest.appId); } } // namespace diff --git a/Tactility/Source/app/development/Development.cpp b/Tactility/Source/app/development/Development.cpp index 7914e58c..28e97cff 100644 --- a/Tactility/Source/app/development/Development.cpp +++ b/Tactility/Source/app/development/Development.cpp @@ -160,14 +160,14 @@ public: }; extern const AppManifest manifest = { - .id = "Development", - .name = "Development", - .category = Category::Settings, + .appId = "Development", + .appName = "Development", + .appCategory = Category::Settings, .createApp = create }; void start() { - app::start(manifest.id); + app::start(manifest.appId); } } // namespace diff --git a/Tactility/Source/app/display/Display.cpp b/Tactility/Source/app/display/Display.cpp index edf62f4f..21cd26f9 100644 --- a/Tactility/Source/app/display/Display.cpp +++ b/Tactility/Source/app/display/Display.cpp @@ -164,10 +164,10 @@ public: }; extern const AppManifest manifest = { - .id = "Display", - .name = "Display", - .icon = TT_ASSETS_APP_ICON_DISPLAY_SETTINGS, - .category = Category::Settings, + .appId = "Display", + .appName = "Display", + .appIcon = TT_ASSETS_APP_ICON_DISPLAY_SETTINGS, + .appCategory = Category::Settings, .createApp = create }; diff --git a/Tactility/Source/app/files/FilesApp.cpp b/Tactility/Source/app/files/FilesApp.cpp index f2dd3415..27fecd26 100644 --- a/Tactility/Source/app/files/FilesApp.cpp +++ b/Tactility/Source/app/files/FilesApp.cpp @@ -33,16 +33,16 @@ public: }; extern const AppManifest manifest = { - .id = "Files", - .name = "Files", - .icon = TT_ASSETS_APP_ICON_FILES, - .category = Category::System, - .flags = AppManifest::Flags::Hidden, + .appId = "Files", + .appName = "Files", + .appIcon = TT_ASSETS_APP_ICON_FILES, + .appCategory = Category::System, + .appFlags = AppManifest::Flags::Hidden, .createApp = create }; void start() { - service::loader::startApp(manifest.id); + service::loader::startApp(manifest.appId); } } // namespace diff --git a/Tactility/Source/app/fileselection/FileSelection.cpp b/Tactility/Source/app/fileselection/FileSelection.cpp index 3403a062..9f1d467d 100644 --- a/Tactility/Source/app/fileselection/FileSelection.cpp +++ b/Tactility/Source/app/fileselection/FileSelection.cpp @@ -56,24 +56,24 @@ public: }; extern const AppManifest manifest = { - .id = "FileSelection", - .name = "File Selection", - .icon = TT_ASSETS_APP_ICON_FILES, - .category = Category::System, - .flags = AppManifest::Flags::Hidden, + .appId = "FileSelection", + .appName = "File Selection", + .appIcon = TT_ASSETS_APP_ICON_FILES, + .appCategory = Category::System, + .appFlags = AppManifest::Flags::Hidden, .createApp = create }; LaunchId startForExistingFile() { auto bundle = std::make_shared(); setMode(*bundle, Mode::Existing); - return service::loader::startApp(manifest.id, bundle); + return service::loader::startApp(manifest.appId, bundle); } LaunchId startForExistingOrNewFile() { auto bundle = std::make_shared(); setMode(*bundle, Mode::ExistingOrNew); - return service::loader::startApp(manifest.id, bundle); + return service::loader::startApp(manifest.appId, bundle); } } // namespace diff --git a/Tactility/Source/app/gpio/Gpio.cpp b/Tactility/Source/app/gpio/Gpio.cpp index b27139e3..0cda0b9a 100644 --- a/Tactility/Source/app/gpio/Gpio.cpp +++ b/Tactility/Source/app/gpio/Gpio.cpp @@ -188,10 +188,10 @@ void GpioApp::onHide(AppContext& app) { } extern const AppManifest manifest = { - .id = "Gpio", - .name = "GPIO", - .icon = TT_ASSETS_APP_ICON_GPIO, - .category = Category::System, + .appId = "Gpio", + .appName = "GPIO", + .appIcon = TT_ASSETS_APP_ICON_GPIO, + .appCategory = Category::System, .createApp = create }; diff --git a/Tactility/Source/app/gpssettings/GpsSettings.cpp b/Tactility/Source/app/gpssettings/GpsSettings.cpp index b55be040..aadeff91 100644 --- a/Tactility/Source/app/gpssettings/GpsSettings.cpp +++ b/Tactility/Source/app/gpssettings/GpsSettings.cpp @@ -58,7 +58,7 @@ class GpsSettingsApp final : public App { } void onAddGps() { - app::start(addgps::manifest.id); + app::start(addgps::manifest.appId); } void startReceivingUpdates() { @@ -344,15 +344,15 @@ public: }; extern const AppManifest manifest = { - .id = "GpsSettings", - .name = "GPS", - .icon = LV_SYMBOL_GPS, - .category = Category::Settings, + .appId = "GpsSettings", + .appName = "GPS", + .appIcon = LV_SYMBOL_GPS, + .appCategory = Category::Settings, .createApp = create }; void start() { - app::start(manifest.id); + app::start(manifest.appId); } } // namespace diff --git a/Tactility/Source/app/i2cscanner/I2cScanner.cpp b/Tactility/Source/app/i2cscanner/I2cScanner.cpp index 28c47dbf..1063f6a3 100644 --- a/Tactility/Source/app/i2cscanner/I2cScanner.cpp +++ b/Tactility/Source/app/i2cscanner/I2cScanner.cpp @@ -69,7 +69,7 @@ public: /** Returns the app data if the app is active. Note that this could clash if the same app is started twice and a background thread is slow. */ std::shared_ptr _Nullable optApp() { auto appContext = getCurrentAppContext(); - if (appContext != nullptr && appContext->getManifest().id == manifest.id) { + if (appContext != nullptr && appContext->getManifest().appId == manifest.appId) { return std::static_pointer_cast(appContext->getApp()); } else { return nullptr; @@ -403,15 +403,15 @@ void I2cScannerApp::onScanTimerFinished() { } extern const AppManifest manifest = { - .id = "I2cScanner", - .name = "I2C Scanner", - .icon = TT_ASSETS_APP_ICON_I2C_SETTINGS, - .category = Category::System, + .appId = "I2cScanner", + .appName = "I2C Scanner", + .appIcon = TT_ASSETS_APP_ICON_I2C_SETTINGS, + .appCategory = Category::System, .createApp = create }; void start() { - service::loader::startApp(manifest.id); + service::loader::startApp(manifest.appId); } } // namespace diff --git a/Tactility/Source/app/i2csettings/I2cSettings.cpp b/Tactility/Source/app/i2csettings/I2cSettings.cpp index f83491fc..bd1690fb 100644 --- a/Tactility/Source/app/i2csettings/I2cSettings.cpp +++ b/Tactility/Source/app/i2csettings/I2cSettings.cpp @@ -93,10 +93,10 @@ class I2cSettingsApp : public App { }; extern const AppManifest manifest = { - .id = "I2cSettings", - .name = "I2C", - .icon = TT_ASSETS_APP_ICON_I2C_SETTINGS, - .category = Category::Settings, + .appId = "I2cSettings", + .appName = "I2C", + .appIcon = TT_ASSETS_APP_ICON_I2C_SETTINGS, + .appCategory = Category::Settings, .createApp = create }; diff --git a/Tactility/Source/app/imageviewer/ImageViewer.cpp b/Tactility/Source/app/imageviewer/ImageViewer.cpp index 511891db..6aca9c83 100644 --- a/Tactility/Source/app/imageviewer/ImageViewer.cpp +++ b/Tactility/Source/app/imageviewer/ImageViewer.cpp @@ -60,17 +60,17 @@ class ImageViewerApp : public App { }; extern const AppManifest manifest = { - .id = "ImageViewer", - .name = "Image Viewer", - .category = Category::System, - .flags = AppManifest::Flags::Hidden, + .appId = "ImageViewer", + .appName = "Image Viewer", + .appCategory = Category::System, + .appFlags = AppManifest::Flags::Hidden, .createApp = create }; void start(const std::string& file) { auto parameters = std::make_shared(); parameters->putString(IMAGE_VIEWER_FILE_ARGUMENT, file); - service::loader::startApp(manifest.id, parameters); + service::loader::startApp(manifest.appId, parameters); } } // namespace diff --git a/Tactility/Source/app/inputdialog/InputDialog.cpp b/Tactility/Source/app/inputdialog/InputDialog.cpp index 7f453120..7206fa62 100644 --- a/Tactility/Source/app/inputdialog/InputDialog.cpp +++ b/Tactility/Source/app/inputdialog/InputDialog.cpp @@ -26,7 +26,7 @@ void start(const std::string& title, const std::string& message, const std::stri bundle->putString(PARAMETER_BUNDLE_KEY_TITLE, title); bundle->putString(PARAMETER_BUNDLE_KEY_MESSAGE, message); bundle->putString(PARAMETER_BUNDLE_KEY_PREFILLED, prefilled); - service::loader::startApp(manifest.id, bundle); + service::loader::startApp(manifest.appId, bundle); } std::string getResult(const Bundle& bundle) { @@ -118,10 +118,10 @@ public: }; extern const AppManifest manifest = { - .id = "InputDialog", - .name = "Input Dialog", - .category = Category::System, - .flags = AppManifest::Flags::Hidden, + .appId = "InputDialog", + .appName = "Input Dialog", + .appCategory = Category::System, + .appFlags = AppManifest::Flags::Hidden, .createApp = create }; diff --git a/Tactility/Source/app/launcher/Launcher.cpp b/Tactility/Source/app/launcher/Launcher.cpp index b49e4505..730b4bb6 100644 --- a/Tactility/Source/app/launcher/Launcher.cpp +++ b/Tactility/Source/app/launcher/Launcher.cpp @@ -136,15 +136,15 @@ public: }; extern const AppManifest manifest = { - .id = "Launcher", - .name = "Launcher", - .category = Category::System, - .flags = AppManifest::Flags::Hidden, + .appId = "Launcher", + .appName = "Launcher", + .appCategory = Category::System, + .appFlags = AppManifest::Flags::Hidden, .createApp = create }; void start() { - service::loader::startApp(manifest.id); + service::loader::startApp(manifest.appId); } } // namespace diff --git a/Tactility/Source/app/localesettings/LocaleSettings.cpp b/Tactility/Source/app/localesettings/LocaleSettings.cpp index bbedddc7..6234e0de 100644 --- a/Tactility/Source/app/localesettings/LocaleSettings.cpp +++ b/Tactility/Source/app/localesettings/LocaleSettings.cpp @@ -162,15 +162,15 @@ public: }; extern const AppManifest manifest = { - .id = "LocaleSettings", - .name = "Region & Language", - .icon = TT_ASSETS_APP_ICON_TIME_DATE_SETTINGS, - .category = Category::Settings, + .appId = "LocaleSettings", + .appName = "Region & Language", + .appIcon = TT_ASSETS_APP_ICON_TIME_DATE_SETTINGS, + .appCategory = Category::Settings, .createApp = create }; void start() { - service::loader::startApp(manifest.id); + service::loader::startApp(manifest.appId); } } // namespace diff --git a/Tactility/Source/app/log/Log.cpp b/Tactility/Source/app/log/Log.cpp index d3815f08..14d666ab 100644 --- a/Tactility/Source/app/log/Log.cpp +++ b/Tactility/Source/app/log/Log.cpp @@ -120,10 +120,10 @@ public: }; extern const AppManifest manifest = { - .id = "Log", - .name = "Log", - .icon = LV_SYMBOL_LIST, - .category = Category::System, + .appId = "Log", + .appName = "Log", + .appIcon = LV_SYMBOL_LIST, + .appCategory = Category::System, .createApp = create }; diff --git a/Tactility/Source/app/notes/Notes.cpp b/Tactility/Source/app/notes/Notes.cpp index 949e7cd8..54fdd576 100644 --- a/Tactility/Source/app/notes/Notes.cpp +++ b/Tactility/Source/app/notes/Notes.cpp @@ -207,15 +207,15 @@ class NotesApp : public App { }; extern const AppManifest manifest = { - .id = "Notes", - .name = "Notes", - .icon = TT_ASSETS_APP_ICON_NOTES, + .appId = "Notes", + .appName = "Notes", + .appIcon = TT_ASSETS_APP_ICON_NOTES, .createApp = create }; void start(const std::string& filePath) { auto parameters = std::make_shared(); parameters->putString(NOTES_FILE_ARGUMENT, filePath); - service::loader::startApp(manifest.id, parameters); + service::loader::startApp(manifest.appId, parameters); } } // namespace tt::app::notes \ No newline at end of file diff --git a/Tactility/Source/app/power/Power.cpp b/Tactility/Source/app/power/Power.cpp index 7116da80..ea4d3eee 100644 --- a/Tactility/Source/app/power/Power.cpp +++ b/Tactility/Source/app/power/Power.cpp @@ -22,7 +22,7 @@ class PowerApp; /** Returns the app data if the app is active. Note that this could clash if the same app is started twice and a background thread is slow. */ std::shared_ptr _Nullable optApp() { auto appContext = getCurrentAppContext(); - if (appContext != nullptr && appContext->getManifest().id == manifest.id) { + if (appContext != nullptr && appContext->getManifest().appId == manifest.appId) { return std::static_pointer_cast(appContext->getApp()); } else { return nullptr; @@ -189,10 +189,10 @@ public: }; extern const AppManifest manifest = { - .id = "Power", - .name = "Power", - .icon = TT_ASSETS_APP_ICON_POWER_SETTINGS, - .category = Category::Settings, + .appId = "Power", + .appName = "Power", + .appIcon = TT_ASSETS_APP_ICON_POWER_SETTINGS, + .appCategory = Category::Settings, .createApp = create }; diff --git a/Tactility/Source/app/screenshot/Screenshot.cpp b/Tactility/Source/app/screenshot/Screenshot.cpp index b826ef07..a2068b2b 100644 --- a/Tactility/Source/app/screenshot/Screenshot.cpp +++ b/Tactility/Source/app/screenshot/Screenshot.cpp @@ -48,7 +48,7 @@ public: /** Returns the app data if the app is active. Note that this could clash if the same app is started twice and a background thread is slow. */ std::shared_ptr _Nullable optApp() { auto appContext = getCurrentAppContext(); - if (appContext != nullptr && appContext->getManifest().id == manifest.id) { + if (appContext != nullptr && appContext->getManifest().appId == manifest.appId) { return std::static_pointer_cast(appContext->getApp()); } else { return nullptr; @@ -278,10 +278,10 @@ void ScreenshotApp::onShow(AppContext& appContext, lv_obj_t* parent) { } extern const AppManifest manifest = { - .id = "Screenshot", - .name = "Screenshot", - .icon = LV_SYMBOL_IMAGE, - .category = Category::System, + .appId = "Screenshot", + .appName = "Screenshot", + .appIcon = LV_SYMBOL_IMAGE, + .appCategory = Category::System, .createApp = create }; diff --git a/Tactility/Source/app/selectiondialog/SelectionDialog.cpp b/Tactility/Source/app/selectiondialog/SelectionDialog.cpp index f23ceb10..d7251551 100644 --- a/Tactility/Source/app/selectiondialog/SelectionDialog.cpp +++ b/Tactility/Source/app/selectiondialog/SelectionDialog.cpp @@ -26,7 +26,7 @@ void start(const std::string& title, const std::vector& items) { auto bundle = std::make_shared(); bundle->putString(PARAMETER_BUNDLE_KEY_TITLE, title); bundle->putString(PARAMETER_BUNDLE_KEY_ITEMS, items_joined); - service::loader::startApp(manifest.id, bundle); + service::loader::startApp(manifest.appId, bundle); } int32_t getResultIndex(const Bundle& bundle) { @@ -112,10 +112,10 @@ public: }; extern const AppManifest manifest = { - .id = "SelectionDialog", - .name = "Selection Dialog", - .category = Category::System, - .flags = AppManifest::Flags::Hidden, + .appId = "SelectionDialog", + .appName = "Selection Dialog", + .appCategory = Category::System, + .appFlags = AppManifest::Flags::Hidden, .createApp = create }; diff --git a/Tactility/Source/app/serialconsole/SerialConsole.cpp b/Tactility/Source/app/serialconsole/SerialConsole.cpp index 60165577..d0ed2496 100644 --- a/Tactility/Source/app/serialconsole/SerialConsole.cpp +++ b/Tactility/Source/app/serialconsole/SerialConsole.cpp @@ -85,10 +85,10 @@ public: }; extern const AppManifest manifest = { - .id = "SerialConsole", - .name = "Serial Console", - .icon = LV_SYMBOL_LIST, - .category = Category::System, + .appId = "SerialConsole", + .appName = "Serial Console", + .appIcon = LV_SYMBOL_LIST, + .appCategory = Category::System, .createApp = create }; diff --git a/Tactility/Source/app/settings/Settings.cpp b/Tactility/Source/app/settings/Settings.cpp index 3c41dfcb..074f5a19 100644 --- a/Tactility/Source/app/settings/Settings.cpp +++ b/Tactility/Source/app/settings/Settings.cpp @@ -12,14 +12,14 @@ namespace tt::app::settings { static void onAppPressed(lv_event_t* e) { const auto* manifest = static_cast(lv_event_get_user_data(e)); - service::loader::startApp(manifest->id); + service::loader::startApp(manifest->appId); } static void createWidget(const std::shared_ptr& manifest, void* parent) { tt_check(parent); auto* list = (lv_obj_t*)parent; - const void* icon = !manifest->icon.empty() ? manifest->icon.c_str() : TT_ASSETS_APP_ICON_FALLBACK; - auto* btn = lv_list_add_button(list, icon, manifest->name.c_str()); + const void* icon = !manifest->appIcon.empty() ? manifest->appIcon.c_str() : TT_ASSETS_APP_ICON_FALLBACK; + auto* btn = lv_list_add_button(list, icon, manifest->appName.c_str()); lv_obj_add_event_cb(btn, &onAppPressed, LV_EVENT_SHORT_CLICKED, (void*)manifest.get()); } @@ -38,7 +38,7 @@ class SettingsApp : public App { auto manifests = getApps(); std::sort(manifests.begin(), manifests.end(), SortAppManifestByName); for (const auto& manifest: manifests) { - if (manifest->category == Category::Settings) { + if (manifest->appCategory == Category::Settings) { createWidget(manifest, list); } } @@ -46,11 +46,11 @@ class SettingsApp : public App { }; extern const AppManifest manifest = { - .id = "Settings", - .name = "Settings", - .icon = TT_ASSETS_APP_ICON_SETTINGS, - .category = Category::System, - .flags = AppManifest::Flags::Hidden, + .appId = "Settings", + .appName = "Settings", + .appIcon = TT_ASSETS_APP_ICON_SETTINGS, + .appCategory = Category::System, + .appFlags = AppManifest::Flags::Hidden, .createApp = create }; diff --git a/Tactility/Source/app/systeminfo/SystemInfo.cpp b/Tactility/Source/app/systeminfo/SystemInfo.cpp index 397790f1..e81e535b 100644 --- a/Tactility/Source/app/systeminfo/SystemInfo.cpp +++ b/Tactility/Source/app/systeminfo/SystemInfo.cpp @@ -292,10 +292,10 @@ class SystemInfoApp final : public App { }; extern const AppManifest manifest = { - .id = "SystemInfo", - .name = "System Info", - .icon = TT_ASSETS_APP_ICON_SYSTEM_INFO, - .category = Category::System, + .appId = "SystemInfo", + .appName = "System Info", + .appIcon = TT_ASSETS_APP_ICON_SYSTEM_INFO, + .appCategory = Category::System, .createApp = create }; diff --git a/Tactility/Source/app/timedatesettings/TimeDateSettings.cpp b/Tactility/Source/app/timedatesettings/TimeDateSettings.cpp index e61d5149..aa5be222 100644 --- a/Tactility/Source/app/timedatesettings/TimeDateSettings.cpp +++ b/Tactility/Source/app/timedatesettings/TimeDateSettings.cpp @@ -57,15 +57,15 @@ public: }; extern const AppManifest manifest = { - .id = "TimeDateSettings", - .name = "Time & Date", - .icon = TT_ASSETS_APP_ICON_TIME_DATE_SETTINGS, - .category = Category::Settings, + .appId = "TimeDateSettings", + .appName = "Time & Date", + .appIcon = TT_ASSETS_APP_ICON_TIME_DATE_SETTINGS, + .appCategory = Category::Settings, .createApp = create }; void start() { - service::loader::startApp(manifest.id); + service::loader::startApp(manifest.appId); } } // namespace diff --git a/Tactility/Source/app/timezone/TimeZone.cpp b/Tactility/Source/app/timezone/TimeZone.cpp index cad696fb..fee64710 100644 --- a/Tactility/Source/app/timezone/TimeZone.cpp +++ b/Tactility/Source/app/timezone/TimeZone.cpp @@ -226,15 +226,15 @@ public: }; extern const AppManifest manifest = { - .id = "TimeZone", - .name = "Select timezone", - .category = Category::System, - .flags = AppManifest::Flags::Hidden, + .appId = "TimeZone", + .appName = "Select timezone", + .appCategory = Category::System, + .appFlags = AppManifest::Flags::Hidden, .createApp = create }; void start() { - service::loader::startApp(manifest.id); + service::loader::startApp(manifest.appId); } } diff --git a/Tactility/Source/app/usbsettings/UsbSettings.cpp b/Tactility/Source/app/usbsettings/UsbSettings.cpp index 257b9d23..53c2fdd1 100644 --- a/Tactility/Source/app/usbsettings/UsbSettings.cpp +++ b/Tactility/Source/app/usbsettings/UsbSettings.cpp @@ -42,10 +42,10 @@ class UsbSettingsApp : public App { }; extern const AppManifest manifest = { - .id = "UsbSettings", - .name = "USB", - .icon = LV_SYMBOL_USB, - .category = Category::Settings, + .appId = "UsbSettings", + .appName = "USB", + .appIcon = LV_SYMBOL_USB, + .appCategory = Category::Settings, .createApp = create }; diff --git a/Tactility/Source/app/wifiapsettings/WifiApSettings.cpp b/Tactility/Source/app/wifiapsettings/WifiApSettings.cpp index 2dfd09c1..bb2e8f02 100644 --- a/Tactility/Source/app/wifiapsettings/WifiApSettings.cpp +++ b/Tactility/Source/app/wifiapsettings/WifiApSettings.cpp @@ -21,7 +21,7 @@ extern const AppManifest manifest; void start(const std::string& ssid) { auto bundle = std::make_shared(); bundle->putString("ssid", ssid); - app::start(manifest.id, bundle); + app::start(manifest.appId, bundle); } class WifiApSettings : public App { @@ -241,11 +241,11 @@ public: }; extern const AppManifest manifest = { - .id = "WifiApSettings", - .name = "Wi-Fi AP Settings", - .icon = LV_SYMBOL_WIFI, - .category = Category::System, - .flags = AppManifest::Flags::Hidden, + .appId = "WifiApSettings", + .appName = "Wi-Fi AP Settings", + .appIcon = LV_SYMBOL_WIFI, + .appCategory = Category::System, + .appFlags = AppManifest::Flags::Hidden, .createApp = create }; diff --git a/Tactility/Source/app/wificonnect/WifiConnect.cpp b/Tactility/Source/app/wificonnect/WifiConnect.cpp index 4fd8d1bb..196f3e88 100644 --- a/Tactility/Source/app/wificonnect/WifiConnect.cpp +++ b/Tactility/Source/app/wificonnect/WifiConnect.cpp @@ -94,11 +94,11 @@ void WifiConnect::onHide(TT_UNUSED AppContext& app) { } extern const AppManifest manifest = { - .id = "WifiConnect", - .name = "Wi-Fi Connect", - .icon = LV_SYMBOL_WIFI, - .category = Category::System, - .flags = AppManifest::Flags::Hidden, + .appId = "WifiConnect", + .appName = "Wi-Fi Connect", + .appIcon = LV_SYMBOL_WIFI, + .appCategory = Category::System, + .appFlags = AppManifest::Flags::Hidden, .createApp = create }; @@ -106,7 +106,7 @@ void start(const std::string& ssid, const std::string& password) { auto parameters = std::make_shared(); parameters->putString(WIFI_CONNECT_PARAM_SSID, ssid); parameters->putString(WIFI_CONNECT_PARAM_PASSWORD, password); - service::loader::startApp(manifest.id, parameters); + service::loader::startApp(manifest.appId, parameters); } bool optSsidParameter(const std::shared_ptr& bundle, std::string& ssid) { diff --git a/Tactility/Source/app/wifimanage/WifiManage.cpp b/Tactility/Source/app/wifimanage/WifiManage.cpp index a132c5fa..cd85ad85 100644 --- a/Tactility/Source/app/wifimanage/WifiManage.cpp +++ b/Tactility/Source/app/wifimanage/WifiManage.cpp @@ -133,15 +133,15 @@ void WifiManage::onHide(TT_UNUSED AppContext& app) { } extern const AppManifest manifest = { - .id = "WifiManage", - .name = "Wi-Fi", - .icon = LV_SYMBOL_WIFI, - .category = Category::Settings, + .appId = "WifiManage", + .appName = "Wi-Fi", + .appIcon = LV_SYMBOL_WIFI, + .appCategory = Category::Settings, .createApp = create }; void start() { - service::loader::startApp(manifest.id); + service::loader::startApp(manifest.appId); } } // namespace diff --git a/Tactility/Source/lvgl/Toolbar.cpp b/Tactility/Source/lvgl/Toolbar.cpp index db9e6967..8ef45540 100644 --- a/Tactility/Source/lvgl/Toolbar.cpp +++ b/Tactility/Source/lvgl/Toolbar.cpp @@ -144,7 +144,7 @@ lv_obj_t* toolbar_create(lv_obj_t* parent, const std::string& title) { } lv_obj_t* toolbar_create(lv_obj_t* parent, const app::AppContext& app) { - return toolbar_create(parent, app.getManifest().name); + return toolbar_create(parent, app.getManifest().appName); } void toolbar_set_title(lv_obj_t* obj, const std::string& title) { diff --git a/Tactility/Source/service/gui/GuiService.cpp b/Tactility/Source/service/gui/GuiService.cpp index e2c6ca4d..f5a4803d 100644 --- a/Tactility/Source/service/gui/GuiService.cpp +++ b/Tactility/Source/service/gui/GuiService.cpp @@ -193,7 +193,7 @@ void GuiService::requestDraw() { void GuiService::showApp(std::shared_ptr app) { lock(); if (!isStarted) { - TT_LOG_W(TAG, "Failed to show app %s: GUI not started", app->getManifest().id.c_str()); + TT_LOG_W(TAG, "Failed to show app %s: GUI not started", app->getManifest().appId.c_str()); } else { // Ensure previous app triggers onHide() logic if (appToRender != nullptr) { diff --git a/Tactility/Source/service/loader/Loader.cpp b/Tactility/Source/service/loader/Loader.cpp index 3318abe1..c2ad66f7 100644 --- a/Tactility/Source/service/loader/Loader.cpp +++ b/Tactility/Source/service/loader/Loader.cpp @@ -103,7 +103,7 @@ void LoaderService::onStartAppMessage(const std::string& id, app::LaunchId launc auto previous_app = !appStack.empty() ? appStack.top() : nullptr; auto new_app = std::make_shared(app_manifest, launchId, parameters); - new_app->mutableFlags().hideStatusbar = (app_manifest->flags & app::AppManifest::Flags::HideStatusBar); + new_app->mutableFlags().hideStatusbar = (app_manifest->appFlags & app::AppManifest::Flags::HideStatusBar); appStack.push(new_app); transitionAppToState(new_app, app::State::Initial); @@ -136,12 +136,12 @@ void LoaderService::onStopAppMessage(const std::string& id) { // Stop current app auto app_to_stop = appStack.top(); - if (app_to_stop->getManifest().id != id) { - TT_LOG_E(TAG, "Stop app: id mismatch (wanted %s but found %s on top of stack)", id.c_str(), app_to_stop->getManifest().id.c_str()); + if (app_to_stop->getManifest().appId != id) { + TT_LOG_E(TAG, "Stop app: id mismatch (wanted %s but found %s on top of stack)", id.c_str(), app_to_stop->getManifest().appId.c_str()); return; } - if (original_stack_size == 1 && app_to_stop->getManifest().name != "Boot") { + if (original_stack_size == 1 && app_to_stop->getManifest().appName != "Boot") { TT_LOG_E(TAG, "Stop app: can't stop root app"); return; } @@ -162,12 +162,12 @@ void LoaderService::onStopAppMessage(const std::string& id) { // We only expect the app to be referenced within the current scope if (app_to_stop.use_count() > 1) { - TT_LOG_W(TAG, "Memory leak: Stopped %s, but use count is %ld", app_to_stop->getManifest().id.c_str(), app_to_stop.use_count() - 1); + TT_LOG_W(TAG, "Memory leak: Stopped %s, but use count is %ld", app_to_stop->getManifest().appId.c_str(), app_to_stop.use_count() - 1); } // Refcount is expected to be 2: 1 within app_to_stop and 1 within the current scope if (app_to_stop->getApp().use_count() > 2) { - TT_LOG_W(TAG, "Memory leak: Stopped %s, but use count is %ld", app_to_stop->getManifest().id.c_str(), app_to_stop->getApp().use_count() - 2); + TT_LOG_W(TAG, "Memory leak: Stopped %s, but use count is %ld", app_to_stop->getManifest().appId.c_str(), app_to_stop->getApp().use_count() - 2); } #ifdef ESP_PLATFORM @@ -224,7 +224,7 @@ void LoaderService::transitionAppToState(const std::shared_ptr TT_LOG_I( TAG, "App \"%s\" state: %s -> %s", - app_manifest.id.c_str(), + app_manifest.appId.c_str(), appStateToString(old_state), appStateToString(state) ); @@ -263,7 +263,7 @@ app::LaunchId LoaderService::startApp(const std::string& id, std::shared_ptrgetManifest().id; + auto id = getCurrentAppContext()->getManifest().appId; dispatcherThread->dispatch([this, id]() { onStopAppMessage(id); }); diff --git a/Tactility/Source/service/screenshot/ScreenshotTask.cpp b/Tactility/Source/service/screenshot/ScreenshotTask.cpp index 4780c528..51cf728d 100644 --- a/Tactility/Source/service/screenshot/ScreenshotTask.cpp +++ b/Tactility/Source/service/screenshot/ScreenshotTask.cpp @@ -84,10 +84,10 @@ void ScreenshotTask::taskMain() { auto appContext = app::getCurrentAppContext(); if (appContext != nullptr) { const app::AppManifest& manifest = appContext->getManifest(); - if (manifest.id != last_app_id) { + if (manifest.appId != last_app_id) { kernel::delayMillis(100); - last_app_id = manifest.id; - auto filename = std::format("{}/screenshot-{}.png", work.path, manifest.id); + last_app_id = manifest.appId; + auto filename = std::format("{}/screenshot-{}.png", work.path, manifest.appId); makeScreenshot(filename); } }