mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
Move kobo auto-suspension logic out of UIManager (#2933)
This commit is contained in:
121
plugins/autosuspend.koplugin/main.lua
Normal file
121
plugins/autosuspend.koplugin/main.lua
Normal file
@@ -0,0 +1,121 @@
|
||||
local Device = require("device")
|
||||
|
||||
if not Device:isKobo() and not Device:isSDL() then return { disabled = true, } end
|
||||
|
||||
local DataStorage = require("datastorage")
|
||||
local LuaSettings = require("luasettings")
|
||||
local UIManager = require("ui/uimanager")
|
||||
local WidgetContainer = require("ui/widget/container/widgetcontainer")
|
||||
local logger = require("logger")
|
||||
local _ = require("gettext")
|
||||
|
||||
local AutoSuspend = {
|
||||
settings = LuaSettings:open(DataStorage:getSettingsDir() .. "/koboautosuspend.lua"),
|
||||
settings_id = 0,
|
||||
last_action_sec = os.time(),
|
||||
}
|
||||
|
||||
function AutoSuspend:_readTimeoutSecFrom(settings)
|
||||
local sec = settings:readSetting("auto_suspend_timeout_seconds")
|
||||
if type(sec) == "number" then
|
||||
return sec
|
||||
end
|
||||
return -1
|
||||
end
|
||||
|
||||
function AutoSuspend:_readTimeoutSec()
|
||||
local candidates = { self.settings, G_reader_settings }
|
||||
for _, candidate in ipairs(candidates) do
|
||||
local sec = self:_readTimeoutSecFrom(candidate)
|
||||
if sec ~= -1 then
|
||||
return sec
|
||||
end
|
||||
end
|
||||
|
||||
-- default setting is 60 minutes
|
||||
return 60 * 60
|
||||
end
|
||||
|
||||
function AutoSuspend:_enabled()
|
||||
return self.auto_suspend_sec > 0
|
||||
end
|
||||
|
||||
function AutoSuspend:_schedule(settings_id)
|
||||
if not self:_enabled() then
|
||||
logger.dbg("AutoSuspend:_schedule is disabled")
|
||||
return
|
||||
end
|
||||
if self.settings_id ~= settings_id then
|
||||
logger.dbg("AutoSuspend:_schedule registered settings_id ",
|
||||
settings_id,
|
||||
" does not equal to current one ",
|
||||
self.settings_id)
|
||||
return
|
||||
end
|
||||
|
||||
local delay = self.last_action_sec + self.auto_suspend_sec - os.time()
|
||||
if delay <= 0 then
|
||||
logger.dbg("AutoSuspend: will suspend the device")
|
||||
UIManager:suspend()
|
||||
else
|
||||
logger.dbg("AutoSuspend: schedule at ", os.time() + delay)
|
||||
UIManager:scheduleIn(delay, function() self:_schedule(settings_id) end)
|
||||
end
|
||||
end
|
||||
|
||||
function AutoSuspend:_deprecateLastTask()
|
||||
self.settings_id = self.settings_id + 1
|
||||
logger.dbg("AutoSuspend: deprecateLastTask ", self.settings_id)
|
||||
end
|
||||
|
||||
function AutoSuspend:_start()
|
||||
if self:_enabled() then
|
||||
logger.dbg("AutoSuspend: start at ", os.time())
|
||||
self.last_action_sec = os.time()
|
||||
self:_schedule(self.settings_id)
|
||||
end
|
||||
end
|
||||
|
||||
function AutoSuspend:init()
|
||||
UIManager.event_hook:registerWidget("InputEvent", self)
|
||||
self.auto_suspend_sec = self:_readTimeoutSec()
|
||||
self:_deprecateLastTask()
|
||||
self:_start()
|
||||
end
|
||||
|
||||
function AutoSuspend:onInputEvent()
|
||||
logger.dbg("AutoSuspend: onInputEvent")
|
||||
self.last_action_sec = os.time()
|
||||
end
|
||||
|
||||
-- We do not want auto suspend procedure to waste battery during suspend. So let's unschedule it
|
||||
-- when suspending and restart it after resume.
|
||||
function AutoSuspend:onSuspend()
|
||||
logger.dbg("AutoSuspend: onSuspend")
|
||||
self:_deprecateLastTask()
|
||||
end
|
||||
|
||||
function AutoSuspend:onResume()
|
||||
logger.dbg("AutoSuspend: onResume")
|
||||
self:_start()
|
||||
end
|
||||
|
||||
AutoSuspend:init()
|
||||
|
||||
local AutoSuspendWidget = WidgetContainer:new{
|
||||
name = "AutoSuspend",
|
||||
}
|
||||
|
||||
function AutoSuspendWidget:onInputEvent()
|
||||
AutoSuspend:onInputEvent()
|
||||
end
|
||||
|
||||
function AutoSuspendWidget:onSuspend()
|
||||
AutoSuspend:onSuspend()
|
||||
end
|
||||
|
||||
function AutoSuspendWidget:onResume()
|
||||
AutoSuspend:onResume()
|
||||
end
|
||||
|
||||
return AutoSuspendWidget
|
||||
Reference in New Issue
Block a user