From f5dee12646d33dfd0a026df7d38619a430fa4219 Mon Sep 17 00:00:00 2001 From: jpirnay Date: Sat, 23 May 2026 09:55:58 +0200 Subject: [PATCH] Ensure activitytracker updates get flushed to disk --- src/ReadingSessionTracker.cpp | 2 +- src/ReadingStats.cpp | 4 ++-- src/main.cpp | 5 +++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ReadingSessionTracker.cpp b/src/ReadingSessionTracker.cpp index f4f7770b..2e30921f 100644 --- a/src/ReadingSessionTracker.cpp +++ b/src/ReadingSessionTracker.cpp @@ -77,7 +77,7 @@ void ReadingSessionTracker::end() { LOG_DBG("RST", "Session end doc=%s secs=%u pages=%u prog=%u wall=%lld", docId.c_str(), seconds, pagesTurnedThisSession, lastKnownProgress, (long long)walltime); - if (seconds > 0 && !docId.empty()) { + if (!docId.empty()) { READING_STATS.recordSession(docId, title, author, seconds, pagesTurnedThisSession, lastKnownProgress, static_cast(walltime)); if (!READING_STATS.saveToFile()) { diff --git a/src/ReadingStats.cpp b/src/ReadingStats.cpp index 27444251..12327ee1 100644 --- a/src/ReadingStats.cpp +++ b/src/ReadingStats.cpp @@ -64,8 +64,8 @@ ReadingStatsStore ReadingStatsStore::instance; void ReadingStatsStore::recordSession(const std::string& docId, const std::string& title, const std::string& author, uint32_t sessionSeconds, uint32_t sessionPagesTurned, uint8_t progress, time_t walltimeEpoch) { - if (docId.empty() || sessionSeconds == 0) { - // Nothing to credit. Title-update-only flows go through a different path. + if (docId.empty()) { + // Title-update-only flows go through a different path. return; } diff --git a/src/main.cpp b/src/main.cpp index 01fc2934..eb550138 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,6 +28,7 @@ #include "KOReaderCredentialStore.h" #include "MappedInputManager.h" #include "OpdsServerStore.h" +#include "ReadingSessionTracker.h" #include "ReadingStats.h" #include "RecentBooksStore.h" #include "SdCardFontSystem.h" @@ -154,6 +155,9 @@ static bool deepSleepInProgress = false; void silentRestart() { if (deepSleepInProgress) return; // sleeping supersedes the heap-defrag reboot + // ESP.restart() bypasses activity onExit(), so flush any in-flight reading + // session manually — otherwise a heap-defrag reboot mid-read loses the session. + globalReadingSessionTracker().end(); silentRebootTarget = SILENT_REBOOT_TARGET_HOME; silentRebootMagic = SILENT_REBOOT_MAGIC; LOG_DBG("MAIN", "Silent restart (target=home)"); @@ -163,6 +167,7 @@ void silentRestart() { void silentRestartToReader() { if (deepSleepInProgress) return; // sleeping supersedes the heap-defrag reboot + globalReadingSessionTracker().end(); silentRebootTarget = SILENT_REBOOT_TARGET_READER; silentRebootMagic = SILENT_REBOOT_MAGIC; LOG_DBG("MAIN", "Silent restart (target=reader)");