Files
koreader/frontend/device/android/powerd.lua
NiLuJe 9af3e95d9d Kindle: Fix a smattering of frontlight bugs
* 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.
2023-11-25 20:53:36 +01:00

76 lines
2.1 KiB
Lua

local BasePowerD = require("device/generic/powerd")
local _, android = pcall(require, "android")
local AndroidPowerD = BasePowerD:new{
fl_min = 0,
fl_max = 100,
}
function AndroidPowerD:frontlightIntensityHW()
return math.floor(android.getScreenBrightness() / self.bright_diff * self.fl_max)
end
function AndroidPowerD:setIntensityHW(intensity)
-- if frontlight switch was toggled of, turn it on
android.enableFrontlightSwitch()
self.fl_intensity = intensity
android.setScreenBrightness(math.floor(intensity * self.bright_diff / self.fl_max))
self:_decideFrontlightState()
end
function AndroidPowerD:init()
local min_bright = android.getScreenMinBrightness()
self.bright_diff = android.getScreenMaxBrightness() - min_bright
-- if necessary scale fl_min:
-- do not use fl_min==0 if getScreenMinBrightness!=0,
-- because intenstiy==0 would mean to use system intensity
if min_bright ~= self.fl_min then
self.fl_min = math.ceil(min_bright * self.bright_diff / self.fl_max)
end
if self.device:hasNaturalLight() then
self.fl_warmth_min = android.getScreenMinWarmth()
self.fl_warmth_max = android.getScreenMaxWarmth()
self.warm_diff = self.fl_warmth_max - self.fl_warmth_min
end
end
function AndroidPowerD:setWarmthHW(warmth)
android.setScreenWarmth(warmth)
end
function AndroidPowerD:frontlightWarmthHW()
return android.getScreenWarmth() * self.warm_diff
end
function AndroidPowerD:getCapacityHW()
return android.getBatteryLevel()
end
function AndroidPowerD:isChargingHW()
return android.isCharging()
end
function AndroidPowerD:turnOffFrontlightHW()
if not self:isFrontlightOnHW() then
return
end
android.setScreenBrightness(self.fl_min)
end
function AndroidPowerD:turnOnFrontlightHW(done_callback)
if self:isFrontlightOn() and self:isFrontlightOnHW() then
return
end
-- on devices with a software frontlight switch (e.g Tolinos), enable it
android.enableFrontlightSwitch()
android.setScreenBrightness(math.floor(self.fl_intensity * self.bright_diff / self.fl_max))
return false
end
return AndroidPowerD