From 5ddd38e5d7224bd7ce1c4f0c57703fe6e55ee688 Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Tue, 21 Oct 2025 23:35:11 +0200 Subject: [PATCH] remove notifications --- .../backend-esp/src/esp_backend.cpp | 17 +++++++++++++++++ .../apps/lockscreen/src/lockscreen_app.cpp | 19 +++++++++++++++++++ .../include/cardboy/sdk/services.hpp | 1 + .../cardboy/backend/desktop_backend.hpp | 1 + .../backends/desktop/src/desktop_backend.cpp | 17 +++++++++++++++++ 5 files changed, 55 insertions(+) diff --git a/Firmware/components/backend-esp/src/esp_backend.cpp b/Firmware/components/backend-esp/src/esp_backend.cpp index e69b02a..f2c6000 100644 --- a/Firmware/components/backend-esp/src/esp_backend.cpp +++ b/Firmware/components/backend-esp/src/esp_backend.cpp @@ -195,6 +195,23 @@ public: ++revisionCounter; } + void removeById(std::uint64_t id) override { + if (id == 0) + return; + std::lock_guard lock(mutex); + bool removed = false; + for (auto it = entries.begin(); it != entries.end();) { + if (it->id == id) { + it = entries.erase(it); + removed = true; + } else { + ++it; + } + } + if (removed) + ++revisionCounter; + } + void removeByExternalId(std::uint64_t externalId) override { if (externalId == 0) return; diff --git a/Firmware/sdk/apps/lockscreen/src/lockscreen_app.cpp b/Firmware/sdk/apps/lockscreen/src/lockscreen_app.cpp index 76abf27..78b7adf 100644 --- a/Firmware/sdk/apps/lockscreen/src/lockscreen_app.cpp +++ b/Firmware/sdk/apps/lockscreen/src/lockscreen_app.cpp @@ -130,6 +130,25 @@ private: } } + const bool deletePressed = button.current.b && !button.previous.b; + if (deletePressed && notificationCenter && !notifications.empty()) { + const std::size_t index = std::min(selectedNotification, notifications.size() - 1); + const auto& note = notifications[index]; + std::size_t preferredIndex = index; + if (index + 1 < notifications.size()) + preferredIndex = index + 1; + else if (index > 0) + preferredIndex = index - 1; + if (note.externalId != 0) + notificationCenter->removeByExternalId(note.externalId); + else + notificationCenter->removeById(note.id); + selectedNotification = preferredIndex; + lastNotificationInteractionMs = clock.millis(); + dirty = true; + refreshNotifications(); + } + const bool comboNow = comboPressed(button.current); updateHoldState(comboNow); if (navPressed) diff --git a/Firmware/sdk/backend_interface/include/cardboy/sdk/services.hpp b/Firmware/sdk/backend_interface/include/cardboy/sdk/services.hpp index d2acbca..a435eec 100644 --- a/Firmware/sdk/backend_interface/include/cardboy/sdk/services.hpp +++ b/Firmware/sdk/backend_interface/include/cardboy/sdk/services.hpp @@ -88,6 +88,7 @@ public: [[nodiscard]] virtual std::vector recent(std::size_t limit) const = 0; virtual void markAllRead() = 0; virtual void clear() = 0; + virtual void removeById(std::uint64_t id) = 0; virtual void removeByExternalId(std::uint64_t externalId) = 0; }; diff --git a/Firmware/sdk/backends/desktop/include/cardboy/backend/desktop_backend.hpp b/Firmware/sdk/backends/desktop/include/cardboy/backend/desktop_backend.hpp index 1db3c59..73d8d4c 100644 --- a/Firmware/sdk/backends/desktop/include/cardboy/backend/desktop_backend.hpp +++ b/Firmware/sdk/backends/desktop/include/cardboy/backend/desktop_backend.hpp @@ -93,6 +93,7 @@ public: [[nodiscard]] std::vector recent(std::size_t limit) const override; void markAllRead() override; void clear() override; + void removeById(std::uint64_t id) override; void removeByExternalId(std::uint64_t externalId) override; private: diff --git a/Firmware/sdk/backends/desktop/src/desktop_backend.cpp b/Firmware/sdk/backends/desktop/src/desktop_backend.cpp index f7ee181..cffa411 100644 --- a/Firmware/sdk/backends/desktop/src/desktop_backend.cpp +++ b/Firmware/sdk/backends/desktop/src/desktop_backend.cpp @@ -212,6 +212,23 @@ void DesktopNotificationCenter::clear() { ++revisionCounter; } +void DesktopNotificationCenter::removeById(std::uint64_t id) { + if (id == 0) + return; + std::lock_guard lock(mutex); + bool removed = false; + for (auto it = entries.begin(); it != entries.end();) { + if (it->id == id) { + it = entries.erase(it); + removed = true; + } else { + ++it; + } + } + if (removed) + ++revisionCounter; +} + void DesktopNotificationCenter::removeByExternalId(std::uint64_t externalId) { if (externalId == 0) return;