mirror of
https://github.com/koreader/koreader
synced 2024-11-04 12:00:25 +00:00
9af3e95d9d
* afterResume had *two* different implementations, so the historical one that handled frontlight fixups no longer ran (regression since #10426) * isFrontlightOn was completely broken, for a couple of reasons: * There was no is isFrontlightOnHW implementation, so when it ran, it mostly always thought the frontlight was on, because self.fl_intensity doesn't change on toggle off. * _decideFrontlightState was never called on Kindle, so isFrontlightOnHW was never really called, making isFrontlightOn completely useless. Call it in setIntensityHW's coda, as it ought to be. And properly document that. Generic *was* calling _decideFrontlightState is setIntensity, but *before* actually setting the frontlight, which makes no goddamn sense, so get rid of that, too. * Also fix frontlight toggle notifications (regression since #10305) TL;DR: The PowerD API being a mess strikes again.
92 lines
2.6 KiB
Lua
92 lines
2.6 KiB
Lua
local BasePowerD = require("device/generic/powerd")
|
|
local ffi = require("ffi")
|
|
local inkview = ffi.load("inkview")
|
|
|
|
local PocketBookPowerD = BasePowerD:new{
|
|
is_charging = nil,
|
|
|
|
fl_min = 0,
|
|
fl_max = 100,
|
|
fl_warmth_min = 0,
|
|
fl_warmth_max = 100,
|
|
}
|
|
|
|
function PocketBookPowerD:frontlightIntensityHW()
|
|
-- Always update fl_intensity (and perhaps fl_warmth) from the OS value whenever queried (it's fast).
|
|
-- This way koreader settings can stay in sync even if the value is changed behind its back.
|
|
self.fl_intensity = math.max(0, inkview.GetFrontlightState())
|
|
if self.device:hasNaturalLight() then
|
|
self.fl_warmth = math.max(0, inkview.GetFrontlightColor())
|
|
end
|
|
return self.fl_intensity
|
|
end
|
|
|
|
function PocketBookPowerD:frontlightIntensity()
|
|
if not self.device:hasFrontlight() then return 0 end
|
|
if self:isFrontlightOff() then return 0 end
|
|
--- @note: We actually have a working frontlightIntensityHW implementation,
|
|
--- use it instead of returning a cached self.fl_intensity like BasePowerD.
|
|
return self:frontlightIntensityHW()
|
|
end
|
|
|
|
function PocketBookPowerD:setIntensityHW(intensity)
|
|
local v2api = pcall(function()
|
|
inkview.SetFrontlightEnabled(intensity == 0 and 0 or 1)
|
|
end)
|
|
if intensity == 0 then
|
|
-- -1 is valid only for the old api, on newer firmwares that's just a bogus brightness level
|
|
if not v2api then
|
|
inkview.SetFrontlightState(-1)
|
|
end
|
|
else
|
|
inkview.SetFrontlightState(intensity)
|
|
end
|
|
|
|
-- We have a custom isFrontlightOn implementation, so this is redundant
|
|
self:_decideFrontlightState()
|
|
end
|
|
|
|
function PocketBookPowerD:isFrontlightOn()
|
|
if not self.device:hasFrontlight() then return false end
|
|
-- Query directly instead of assuming from cached value.
|
|
local enabled = inkview.GetFrontlightState() >= 0
|
|
pcall(function()
|
|
enabled = inkview.GetFrontlightEnabled() > 0
|
|
end)
|
|
return enabled
|
|
end
|
|
|
|
function PocketBookPowerD:setWarmthHW(level)
|
|
return inkview.SetFrontlightColor(level)
|
|
end
|
|
|
|
function PocketBookPowerD:frontlightWarmthHW()
|
|
return inkview.GetFrontlightColor()
|
|
end
|
|
|
|
function PocketBookPowerD:getCapacityHW()
|
|
return inkview.GetBatteryPower()
|
|
end
|
|
|
|
function PocketBookPowerD:isChargingHW()
|
|
if inkview.IsCharging() > 0 then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
function PocketBookPowerD:beforeSuspend()
|
|
-- Inhibit user input and emit the Suspend event.
|
|
self.device:_beforeSuspend()
|
|
end
|
|
|
|
function PocketBookPowerD:afterResume()
|
|
self:invalidateCapacityCache()
|
|
|
|
-- Restore user input and emit the Resume event.
|
|
self.device:_afterResume()
|
|
end
|
|
|
|
return PocketBookPowerD
|