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.
reviewable/pr11163/r1
NiLuJe 6 months ago committed by Frans de Jonge
parent 2554aee7a3
commit 9af3e95d9d

@ -60,7 +60,7 @@ function AndroidPowerD:turnOffFrontlightHW()
android.setScreenBrightness(self.fl_min) android.setScreenBrightness(self.fl_min)
end end
function AndroidPowerD:turnOnFrontlightHW() function AndroidPowerD:turnOnFrontlightHW(done_callback)
if self:isFrontlightOn() and self:isFrontlightOnHW() then if self:isFrontlightOn() and self:isFrontlightOnHW() then
return return
end end
@ -68,6 +68,8 @@ function AndroidPowerD:turnOnFrontlightHW()
android.enableFrontlightSwitch() android.enableFrontlightSwitch()
android.setScreenBrightness(math.floor(self.fl_intensity * self.bright_diff / self.fl_max)) android.setScreenBrightness(math.floor(self.fl_intensity * self.bright_diff / self.fl_max))
return false
end end
return AndroidPowerD return AndroidPowerD

@ -187,7 +187,7 @@ if Device:hasFrontlight() then
function DeviceListener:onToggleFrontlight() function DeviceListener:onToggleFrontlight()
local powerd = Device:getPowerDevice() local powerd = Device:getPowerDevice()
local new_text local new_text
if powerd.is_fl_on then if powerd:isFrontlightOn() then
new_text = _("Frontlight disabled.") new_text = _("Frontlight disabled.")
else else
new_text = _("Frontlight enabled.") new_text = _("Frontlight enabled.")

@ -43,7 +43,10 @@ function BasePowerD:new(o)
end end
function BasePowerD:init() end function BasePowerD:init() end
function BasePowerD:setIntensityHW(intensity) end --- @note: This should *always* call self:_decideFrontlightState() in its coda (unless you have a custom isFrontlightOn implementation)!
function BasePowerD:setIntensityHW(intensity)
self:_decideFrontlightState()
end
--- @note: Unlike the "public" setWarmth, this one takes a value in the *native* scale! --- @note: Unlike the "public" setWarmth, this one takes a value in the *native* scale!
function BasePowerD:setWarmthHW(warmth) end function BasePowerD:setWarmthHW(warmth) end
function BasePowerD:getCapacityHW() return 0 end function BasePowerD:getCapacityHW() return 0 end
@ -207,7 +210,6 @@ function BasePowerD:setIntensity(intensity)
if not self.device:hasFrontlight() then return false end if not self.device:hasFrontlight() then return false end
if intensity == self:frontlightIntensity() then return false end if intensity == self:frontlightIntensity() then return false end
self.fl_intensity = self:normalizeIntensity(intensity) self.fl_intensity = self:normalizeIntensity(intensity)
self:_decideFrontlightState()
logger.dbg("set light intensity", self.fl_intensity) logger.dbg("set light intensity", self.fl_intensity)
self:setIntensityHW(self.fl_intensity) self:setIntensityHW(self.fl_intensity)
self:stateChanged() self:stateChanged()

@ -29,17 +29,22 @@ end
-- If we start with the light off (fl_intensity is fl_min), ensure a toggle will set it to the lowest "on" step, -- If we start with the light off (fl_intensity is fl_min), ensure a toggle will set it to the lowest "on" step,
-- and that we update fl_intensity (by using setIntensity and not setIntensityHW). -- and that we update fl_intensity (by using setIntensity and not setIntensityHW).
function KindlePowerD:turnOnFrontlightHW() function KindlePowerD:turnOnFrontlightHW(done_callback)
self:setIntensity(self.fl_intensity == self.fl_min and self.fl_min + 1 or self.fl_intensity) self:setIntensity(self.fl_intensity == self.fl_min and self.fl_min + 1 or self.fl_intensity)
return false
end end
-- Which means we need to get rid of the insane fl_intensity == fl_min shortcut in turnOnFrontlight, too... -- Which means we need to get rid of the insane fl_intensity == fl_min shortcut in turnOnFrontlight, too...
-- That dates back to #2941, and I have no idea what it's supposed to help with. -- That dates back to #2941, and I have no idea what it's supposed to help with.
function BasePowerD:turnOnFrontlight() function KindlePowerD:turnOnFrontlight(done_callback)
if not self.device:hasFrontlight() then return end if not self.device:hasFrontlight() then return end
if self:isFrontlightOn() then return false end if self:isFrontlightOn() then return false end
self:turnOnFrontlightHW() local cb_handled = self:turnOnFrontlightHW(done_callback)
self.is_fl_on = true self.is_fl_on = true
self:stateChanged() self:stateChanged()
if not cb_handled and done_callback then
done_callback()
end
return true return true
end end
@ -79,6 +84,14 @@ function KindlePowerD:frontlightIntensityHW()
end end
end end
-- Make sure isFrontlightOn reflects the actual HW state,
-- as self.fl_intensity is kept as-is when toggling the light off,
-- in order to be able to toggle it back on at the right intensity.
function KindlePowerD:isFrontlightOnHW()
local hw_intensity = self:frontlightIntensityHW()
return hw_intensity > self.fl_min
end
function KindlePowerD:setIntensityHW(intensity) function KindlePowerD:setIntensityHW(intensity)
-- Handle the synthetic step switcheroo on ! canTurnFrontlightOff devices... -- Handle the synthetic step switcheroo on ! canTurnFrontlightOff devices...
local turn_it_off = false local turn_it_off = false
@ -108,6 +121,9 @@ function KindlePowerD:setIntensityHW(intensity)
ffiUtil.writeToSysfs(intensity, self.warmth_intensity_file) ffiUtil.writeToSysfs(intensity, self.warmth_intensity_file)
end end
end end
-- The state might have changed, make sure we don't break isFrontlightOn
self:_decideFrontlightState()
end end
function KindlePowerD:frontlightWarmthHW() function KindlePowerD:frontlightWarmthHW()
@ -182,22 +198,6 @@ function KindlePowerD:_readFLIntensity()
return self:read_int_file(self.fl_intensity_file) return self:read_int_file(self.fl_intensity_file)
end end
function KindlePowerD:afterResume()
if not self.device:hasFrontlight() then
return
end
if self:isFrontlightOn() then
-- The Kindle framework should turn the front light back on automatically.
-- The following statement ensures consistency of intensity, but should basically always be redundant,
-- since we set intensity via lipc and not sysfs ;).
-- NOTE: This is race-y, and we want to *lose* the race, hence the use of the scheduler (c.f., #4392)
UIManager:tickAfterNext(function() self:turnOnFrontlightHW() end)
else
-- But in the off case, we *do* use sysfs, so this one actually matters.
UIManager:tickAfterNext(function() self:turnOffFrontlightHW() end)
end
end
function KindlePowerD:toggleSuspend() function KindlePowerD:toggleSuspend()
if self.lipc_handle then if self.lipc_handle then
self.lipc_handle:set_int_property("com.lab126.powerd", "powerButton", 1) self.lipc_handle:set_int_property("com.lab126.powerd", "powerButton", 1)
@ -293,6 +293,20 @@ function KindlePowerD:afterResume()
-- Restore user input and emit the Resume event. -- Restore user input and emit the Resume event.
self.device:_afterResume() self.device:_afterResume()
if not self.device:hasFrontlight() then
return
end
if self:isFrontlightOn() then
-- The Kindle framework should turn the front light back on automatically.
-- The following statement ensures consistency of intensity, but should basically always be redundant,
-- since we set intensity via lipc and not sysfs ;).
-- NOTE: This is race-y, and we want to *lose* the race, hence the use of the scheduler (c.f., #4392)
UIManager:tickAfterNext(function() self:turnOnFrontlightHW() end)
else
-- But in the off case, we *do* use sysfs, so this one actually matters.
UIManager:tickAfterNext(function() self:turnOffFrontlightHW() end)
end
end end
function KindlePowerD:UIManagerReadyHW(uimgr) function KindlePowerD:UIManagerReadyHW(uimgr)

@ -41,6 +41,9 @@ function PocketBookPowerD:setIntensityHW(intensity)
else else
inkview.SetFrontlightState(intensity) inkview.SetFrontlightState(intensity)
end end
-- We have a custom isFrontlightOn implementation, so this is redundant
self:_decideFrontlightState()
end end
function PocketBookPowerD:isFrontlightOn() function PocketBookPowerD:isFrontlightOn()

@ -18,6 +18,7 @@ end
function SDLPowerD:setIntensityHW(intensity) function SDLPowerD:setIntensityHW(intensity)
require("logger").info("set brightness to", intensity) require("logger").info("set brightness to", intensity)
self.hw_intensity = intensity or self.hw_intensity self.hw_intensity = intensity or self.hw_intensity
self:_decideFrontlightState()
end end
function SDLPowerD:frontlightWarmthHW() function SDLPowerD:frontlightWarmthHW()

@ -23,6 +23,7 @@ describe("Frontlight function in PowerD", function()
end end
PowerD.setIntensityHW = function(self, intensity) PowerD.setIntensityHW = function(self, intensity)
self.frontlight = intensity self.frontlight = intensity
self:_decideFrontlightState()
end end
end) end)

Loading…
Cancel
Save