2
0
mirror of https://github.com/koreader/koreader synced 2024-11-18 03:25:46 +00:00
koreader/plugins/autofrontlight.koplugin/main.lua
poire-z 962fd02c98
Tame BackgroundRunner: stop running when no more job (#6605)
A BackgroundRunner plugin instance will stop running
(rescheduling a check every 2 seconds) when there is no
(or no more) job to run.
Clients of this service now have to emit an event after
adding a job into PluginShare.backgroundJobs, so an
already loaded but stopped BackgroundRunner can notice
it and start running again.
2020-08-31 16:48:29 +02:00

135 lines
4.3 KiB
Lua

local Device = require("device")
if not Device:isKindle() or
(Device.model ~= "KindleVoyage" and Device.model ~= "KindleOasis") then
return { disabled = true, }
end
local ConfirmBox = require("ui/widget/confirmbox")
local DataStorage = require("datastorage")
local LuaSettings = require("luasettings")
local PluginShare = require("pluginshare")
local UIManager = require("ui/uimanager")
local WidgetContainer = require("ui/widget/container/widgetcontainer")
local logger = require("logger")
local _ = require("gettext")
local T = require("ffi/util").template
local AutoFrontlight = {
settings = LuaSettings:open(DataStorage:getSettingsDir() .. "/autofrontlight.lua"),
settings_id = 0,
enabled = false,
last_brightness = -1,
}
function AutoFrontlight:_schedule(settings_id)
local enabled = function()
if not self.enabled then
logger.dbg("AutoFrontlight:_schedule() is disabled")
return false
end
if settings_id ~= self.settings_id then
logger.dbg("AutoFrontlight:_schedule(): registered settings_id ",
settings_id,
" does not equal to current one ",
self.settings_id)
return false
end
return true
end
table.insert(PluginShare.backgroundJobs, {
when = 2,
repeated = enabled,
executable = function()
if enabled() then
self:_action()
end
end
})
local Event = require("ui/event")
UIManager:broadcastEvent(Event:new("BackgroundJobsUpdated"))
end
function AutoFrontlight:_action()
logger.dbg("AutoFrontlight:_action() @ ", os.time())
local current_level = Device:ambientBrightnessLevel()
logger.dbg("AutoFrontlight:_action(): Retrieved ambient brightness level: ", current_level)
if self.last_brightness == current_level then
logger.dbg("AutoFrontlight:_action(): recorded brightness is same as current level ",
self.last_brightness)
return
end
if current_level <= 1 then
logger.dbg("AutoFrontlight: going to turn on frontlight")
Device:getPowerDevice():turnOnFrontlight()
elseif current_level >= 3 then
logger.dbg("AutoFrontlight: going to turn off frontlight")
Device:getPowerDevice():turnOffFrontlight()
end
self.last_brightness = current_level
end
function AutoFrontlight:init()
self.enabled = self.settings:nilOrTrue("enable")
self.settings_id = self.settings_id + 1
logger.dbg("AutoFrontlight:init() self.enabled: ", self.enabled, " with id ", self.settings_id)
self:_schedule(self.settings_id)
end
function AutoFrontlight:flipSetting()
self.settings:flipNilOrTrue("enable")
self:init()
end
function AutoFrontlight:onFlushSettings()
self.settings:flush()
end
AutoFrontlight:init()
local AutoFrontlightWidget = WidgetContainer:new{
name = "autofrontlight",
}
function AutoFrontlightWidget:init()
-- self.ui and self.ui.menu are nil in unittests.
if self.ui ~= nil and self.ui.menu ~= nil then
self.ui.menu:registerToMainMenu(self)
end
end
function AutoFrontlightWidget:flipSetting()
AutoFrontlight:flipSetting()
end
-- For test only.
function AutoFrontlightWidget:deprecateLastTask()
logger.dbg("AutoFrontlightWidget:deprecateLastTask() @ ", AutoFrontlight.settings_id)
AutoFrontlight.settings_id = AutoFrontlight.settings_id + 1
end
function AutoFrontlightWidget:addToMainMenu(menu_items)
menu_items.auto_frontlight = {
text = _("Auto frontlight"),
callback = function()
UIManager:show(ConfirmBox:new{
text = T(_("Auto frontlight detects the brightness of the environment and automatically turn on and off the frontlight.\nFrontlight will be turned off to save battery in bright environment, and turned on in dark environment.\nDo you want to %1 it?"),
AutoFrontlight.enabled and _("disable") or _("enable")),
ok_text = AutoFrontlight.enabled and _("Disable") or _("Enable"),
ok_callback = function()
self:flipSetting()
end
})
end,
checked_func = function() return AutoFrontlight.enabled end,
}
end
function AutoFrontlightWidget:onFlushSettings()
AutoFrontlight:onFlushSettings()
end
return AutoFrontlightWidget