Skip to content

Commit 2cd6c45

Browse files
committed
Improve status refresh timing
1 parent 99e4efc commit 2cd6c45

2 files changed

Lines changed: 150 additions & 5 deletions

File tree

main.lua

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@ end
9090

9191
function StatusStats:onResume()
9292
self:refreshStatusBars()
93+
self:startTicker()
94+
end
95+
96+
function StatusStats:onOutOfScreenSaver()
97+
self:refreshStatusBars()
98+
self:startTicker()
9399
end
94100

95101
function StatusStats:onCloseWidget()
@@ -331,10 +337,60 @@ function StatusStats:tickStatusBars()
331337
self:startTicker()
332338
end
333339

340+
function StatusStats:getNextDurationRefreshDelay(seconds)
341+
seconds = tonumber(seconds) or 0
342+
if seconds <= 0 then
343+
return 1
344+
end
345+
if seconds < 60 then
346+
return 60 - seconds
347+
end
348+
349+
local remainder = seconds % 60
350+
if remainder == 0 then
351+
return 60
352+
end
353+
return 60 - remainder
354+
end
355+
356+
function StatusStats:getNextStatusRefreshDelay()
357+
local delays = {}
358+
359+
if self.settings.session.time then
360+
local session = self:getSessionStats()
361+
if session then
362+
table.insert(delays, self:getNextDurationRefreshDelay(session.time))
363+
end
364+
end
365+
366+
if self.settings.today.time then
367+
local today = self:getTodayStats()
368+
if today then
369+
table.insert(delays, self:getNextDurationRefreshDelay(today.time))
370+
end
371+
end
372+
373+
if #delays == 0 then
374+
if self.settings.session.time or self.settings.today.time then
375+
return 60
376+
end
377+
return nil
378+
end
379+
380+
local next_delay = delays[1]
381+
for index = 2, #delays do
382+
next_delay = math.min(next_delay, delays[index])
383+
end
384+
return next_delay
385+
end
386+
334387
function StatusStats:startTicker()
335388
UIManager:unschedule(self.tickStatusBars, self)
336389
if self.settings.show_value_in_header or self.settings.show_value_in_footer then
337-
UIManager:scheduleIn(60, self.tickStatusBars, self)
390+
local next_delay = self:getNextStatusRefreshDelay()
391+
if next_delay then
392+
UIManager:scheduleIn(next_delay, self.tickStatusBars, self)
393+
end
338394
end
339395
end
340396

tests/statusstats_spec.lua

Lines changed: 93 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,20 @@ local function assertTrue(value, message)
1212
end
1313
end
1414

15+
local ui_manager_state = {
16+
shown = {},
17+
unscheduled = {},
18+
scheduled = {},
19+
broadcasted = {},
20+
}
21+
22+
local function resetUIManagerState()
23+
ui_manager_state.shown = {}
24+
ui_manager_state.unscheduled = {}
25+
ui_manager_state.scheduled = {}
26+
ui_manager_state.broadcasted = {}
27+
end
28+
1529
package.preload["ui/event"] = function()
1630
return {
1731
new = function(_, name)
@@ -30,10 +44,25 @@ end
3044

3145
package.preload["ui/uimanager"] = function()
3246
return {
33-
show = function() end,
34-
unschedule = function() end,
35-
scheduleIn = function() end,
36-
broadcastEvent = function() end,
47+
show = function(_, widget)
48+
table.insert(ui_manager_state.shown, widget)
49+
end,
50+
unschedule = function(_, callback, context)
51+
table.insert(ui_manager_state.unscheduled, {
52+
callback = callback,
53+
context = context,
54+
})
55+
end,
56+
scheduleIn = function(_, delay, callback, context)
57+
table.insert(ui_manager_state.scheduled, {
58+
delay = delay,
59+
callback = callback,
60+
context = context,
61+
})
62+
end,
63+
broadcastEvent = function(_, event)
64+
table.insert(ui_manager_state.broadcasted, event)
65+
end,
3766
}
3867
end
3968

@@ -85,6 +114,7 @@ local StatusStats = dofile("main.lua")
85114

86115
local function newPlugin(settings, stats)
87116
saved_settings = settings
117+
resetUIManagerState()
88118

89119
local footer = {
90120
settings = {
@@ -267,6 +297,65 @@ assertTrue(menu_text:find("Today", 1, true) ~= nil, "today menu should exist")
267297
assertTrue(menu_text:find("Label style", 1, true) == nil, "label style menu should be removed")
268298
assertTrue(menu_text:find("Book stats", 1, true) == nil, "book stats menu should be removed")
269299

300+
local time_refresh_plugin = newPlugin({
301+
show_value_in_footer = true,
302+
session = {
303+
time = true,
304+
pages = false,
305+
},
306+
}, {
307+
session = {
308+
time = 125,
309+
pages = 0,
310+
},
311+
today = {
312+
time = 0,
313+
pages = 0,
314+
},
315+
})
316+
317+
time_refresh_plugin:onReaderReady()
318+
319+
assertEquals(ui_manager_state.scheduled[#ui_manager_state.scheduled].delay, 55, "time-based footer refresh should align to the next minute boundary")
320+
321+
local pages_only_plugin = newPlugin({
322+
show_value_in_footer = true,
323+
session = {
324+
time = false,
325+
pages = true,
326+
},
327+
}, {
328+
session = {
329+
time = 125,
330+
pages = 3,
331+
},
332+
today = {
333+
time = 0,
334+
pages = 0,
335+
},
336+
})
337+
338+
pages_only_plugin:onReaderReady()
339+
340+
assertEquals(#ui_manager_state.scheduled, 0, "page-only status display should not start a periodic ticker")
341+
342+
local screensaver_plugin = newPlugin({
343+
show_value_in_footer = true,
344+
}, {
345+
session = {
346+
time = 0,
347+
pages = 0,
348+
},
349+
today = {
350+
time = 0,
351+
pages = 0,
352+
},
353+
})
354+
355+
screensaver_plugin:onOutOfScreenSaver()
356+
357+
assertEquals(ui_manager_state.broadcasted[#ui_manager_state.broadcasted].name, "RefreshAdditionalContent", "leaving the screensaver should refresh the footer content")
358+
270359
local startup_footer_plugin = newPlugin({
271360
show_value_in_footer = true,
272361
}, {

0 commit comments

Comments
 (0)