mirror of
https://github.com/koreader/koreader
synced 2024-11-11 19:11:14 +00:00
633d43b322
On devices where the event time is the uptime (time since boot), we don't need to trash it and use TimeVal:now() and lose precision. We can still use these times for relative delays and durations computations, which is mostly all we use them for. We just need a real clock time in GestureDetector for two timers (long-press and double tap), where we do the event time type detection on the first event, on all devices.
303 lines
11 KiB
Lua
303 lines
11 KiB
Lua
describe("device module", function()
|
|
-- luacheck: push ignore
|
|
local mock_fb, mock_input
|
|
local iopen = io.open
|
|
local osgetenv = os.getenv
|
|
|
|
setup(function()
|
|
mock_fb = {
|
|
new = function()
|
|
return {
|
|
getSize = function() return {w = 600, h = 800} end,
|
|
getWidth = function() return 600 end,
|
|
getDPI = function() return 72 end,
|
|
setViewport = function() end,
|
|
getRotationMode = function() return 0 end,
|
|
getScreenMode = function() return "portrait" end,
|
|
setRotationMode = function() end,
|
|
}
|
|
end
|
|
}
|
|
require("commonrequire")
|
|
package.unloadAll()
|
|
require("document/canvascontext"):init(require("device"))
|
|
end)
|
|
|
|
before_each(function()
|
|
package.loaded['ffi/framebuffer_mxcfb'] = mock_fb
|
|
mock_input = require('device/input')
|
|
stub(mock_input, "open")
|
|
stub(os, "getenv")
|
|
stub(os, "execute")
|
|
end)
|
|
|
|
after_each(function()
|
|
mock_input.open:revert()
|
|
os.getenv:revert()
|
|
os.execute:revert()
|
|
|
|
os.getenv = osgetenv
|
|
io.open = iopen
|
|
end)
|
|
|
|
describe("kobo", function()
|
|
local TimeVal
|
|
local NickelConf
|
|
setup(function()
|
|
TimeVal = require("ui/timeval")
|
|
NickelConf = require("device/kobo/nickel_conf")
|
|
end)
|
|
|
|
before_each(function()
|
|
stub(NickelConf.frontLightLevel, "get")
|
|
NickelConf.frontLightLevel.get.returns(0)
|
|
stub(NickelConf.frontLightState, "get")
|
|
end)
|
|
|
|
after_each(function()
|
|
NickelConf.frontLightLevel.get:revert()
|
|
NickelConf.frontLightState.get:revert()
|
|
end)
|
|
|
|
it("should initialize properly on Kobo dahlia", function()
|
|
os.getenv.returns("dahlia")
|
|
local kobo_dev = require("device/kobo/device")
|
|
|
|
kobo_dev:init()
|
|
assert.is.same("Kobo_dahlia", kobo_dev.model)
|
|
end)
|
|
|
|
it("should setup eventAdjustHooks properly for input in trilogy", function()
|
|
os.getenv.invokes(function(key)
|
|
if key == "PRODUCT" then
|
|
return "trilogy"
|
|
else
|
|
return osgetenv(key)
|
|
end
|
|
end)
|
|
|
|
package.loaded['device/kobo/device'] = nil
|
|
local kobo_dev = require("device/kobo/device")
|
|
kobo_dev:init()
|
|
local Screen = kobo_dev.screen
|
|
|
|
assert.is.same("Kobo_trilogy", kobo_dev.model)
|
|
assert.truthy(kobo_dev:needsTouchScreenProbe())
|
|
G_reader_settings:saveSetting("kobo_touch_switch_xy", true)
|
|
kobo_dev:touchScreenProbe()
|
|
local x, y = Screen:getWidth()-5, 10
|
|
local EV_ABS = 3
|
|
local ABS_X = 00
|
|
local ABS_Y = 01
|
|
-- mirror x, then switch_xy
|
|
local ev_x = {
|
|
type = EV_ABS,
|
|
code = ABS_X,
|
|
value = y,
|
|
time = TimeVal:now(),
|
|
}
|
|
local ev_y = {
|
|
type = EV_ABS,
|
|
code = ABS_Y,
|
|
value = Screen:getWidth()-x,
|
|
time = TimeVal:now(),
|
|
}
|
|
|
|
kobo_dev.input:eventAdjustHook(ev_x)
|
|
kobo_dev.input:eventAdjustHook(ev_y)
|
|
assert.is.same(x, ev_y.value)
|
|
assert.is.same(ABS_X, ev_y.code)
|
|
assert.is.same(y, ev_x.value)
|
|
assert.is.same(ABS_Y, ev_x.code)
|
|
|
|
-- reset eventAdjustHook
|
|
kobo_dev.input.eventAdjustHook = function() end
|
|
end)
|
|
|
|
it("should setup eventAdjustHooks properly for trilogy with non-epoch ev time", function()
|
|
-- This has no more value since #6798 as ev time can now stay
|
|
-- non-epoch. Adjustments are made on first event handled, and
|
|
-- have only effects when handling long-press (so, the long-press
|
|
-- for dict lookup tests with test this).
|
|
-- We just check here it still works with non-epoch ev time, as previous test
|
|
os.getenv.invokes(function(key)
|
|
if key == "PRODUCT" then
|
|
return "trilogy"
|
|
else
|
|
return osgetenv(key)
|
|
end
|
|
end)
|
|
|
|
package.loaded['device/kobo/device'] = nil
|
|
local kobo_dev = require("device/kobo/device")
|
|
kobo_dev:init()
|
|
local Screen = kobo_dev.screen
|
|
|
|
assert.is.same("Kobo_trilogy", kobo_dev.model)
|
|
assert.truthy(kobo_dev:needsTouchScreenProbe())
|
|
kobo_dev:touchScreenProbe()
|
|
local x, y = Screen:getWidth()-5, 10
|
|
local EV_ABS = 3
|
|
local ABS_X = 00
|
|
local ABS_Y = 01
|
|
local ev_x = {
|
|
type = EV_ABS,
|
|
code = ABS_X,
|
|
value = y,
|
|
time = {sec = 1000}
|
|
}
|
|
local ev_y = {
|
|
type = EV_ABS,
|
|
code = ABS_Y,
|
|
value = Screen:getWidth()-x,
|
|
time = {sec = 1000}
|
|
}
|
|
|
|
kobo_dev.input:eventAdjustHook(ev_x)
|
|
kobo_dev.input:eventAdjustHook(ev_y)
|
|
assert.is.same(x, ev_y.value)
|
|
assert.is.same(ABS_X, ev_y.code)
|
|
assert.is.same(y, ev_x.value)
|
|
assert.is.same(ABS_Y, ev_x.code)
|
|
|
|
-- reset eventAdjustHook
|
|
kobo_dev.input.eventAdjustHook = function() end
|
|
end)
|
|
|
|
it("should flush book settings before suspend", function()
|
|
local sample_pdf = "spec/front/unit/data/tall.pdf"
|
|
local ReaderUI = require("apps/reader/readerui")
|
|
local Device = require("device")
|
|
|
|
NickelConf.frontLightLevel.get.returns(1)
|
|
NickelConf.frontLightState.get.returns(0)
|
|
|
|
local UIManager = require("ui/uimanager")
|
|
stub(Device, "suspend")
|
|
stub(Device.powerd, "beforeSuspend")
|
|
stub(Device, "isKobo")
|
|
|
|
Device.isKobo.returns(true)
|
|
UIManager:init()
|
|
|
|
ReaderUI:doShowReader(sample_pdf)
|
|
local readerui = ReaderUI._getRunningInstance()
|
|
stub(readerui, "onFlushSettings")
|
|
UIManager.event_handlers["PowerPress"]()
|
|
UIManager.event_handlers["PowerRelease"]()
|
|
assert.stub(readerui.onFlushSettings).was_called()
|
|
|
|
Device.suspend:revert()
|
|
Device.powerd.beforeSuspend:revert()
|
|
Device.isKobo:revert()
|
|
readerui.onFlushSettings:revert()
|
|
readerui:onClose()
|
|
end)
|
|
end)
|
|
|
|
describe("kindle", function()
|
|
it("should initialize voyage without error", function()
|
|
io.open = function(filename, mode)
|
|
if filename == "/proc/usid" then
|
|
return {
|
|
read = function() return "B013XX" end,
|
|
close = function() end
|
|
}
|
|
else
|
|
return iopen(filename, mode)
|
|
end
|
|
end
|
|
|
|
local kindle_dev = require('device/kindle/device')
|
|
assert.is.same(kindle_dev.model, "KindleVoyage")
|
|
kindle_dev:init()
|
|
assert.is.same(kindle_dev.input.event_map[104], "LPgBack")
|
|
assert.is.same(kindle_dev.input.event_map[109], "LPgFwd")
|
|
assert.is.same(kindle_dev.powerd.fl_min, 0)
|
|
-- NOTE: fl_max + 1 since #5989
|
|
assert.is.same(kindle_dev.powerd.fl_max, 25)
|
|
end)
|
|
|
|
it("should toggle frontlight", function()
|
|
io.open = function(filename, mode)
|
|
if filename == "/proc/usid" then
|
|
return {
|
|
read = function() return "B013XX" end,
|
|
close = function() end
|
|
}
|
|
elseif filename == "/sys/class/backlight/max77696-bl/brightness" then
|
|
return {
|
|
read = function() return "12" end,
|
|
close = function() end
|
|
}
|
|
else
|
|
return iopen(filename, mode)
|
|
end
|
|
end
|
|
|
|
local kindle_dev = require("device/kindle/device")
|
|
kindle_dev:init()
|
|
|
|
assert.is.same(kindle_dev.powerd.fl_intensity, 12)
|
|
kindle_dev.powerd:setIntensity(5)
|
|
assert.is.same(kindle_dev.powerd.fl_intensity, 5)
|
|
|
|
kindle_dev.powerd:toggleFrontlight()
|
|
assert.stub(os.execute).was_called_with(
|
|
"echo -n 0 > /sys/class/backlight/max77696-bl/brightness")
|
|
-- Here be shenanigans: we don't override powerd's fl_intensity when we turn the light off,
|
|
-- so that we can properly turn it back on at the previous intensity ;)
|
|
assert.is.same(kindle_dev.powerd.fl_intensity, 5)
|
|
-- But if we were to cat /sys/class/backlight/max77696-bl/brightness, it should now be 0.
|
|
|
|
kindle_dev.powerd:toggleFrontlight()
|
|
assert.is.same(kindle_dev.powerd.fl_intensity, 5)
|
|
-- And /sys/class/backlight/max77696-bl/brightness is now !0
|
|
-- (exact value is HW-dependent, each model has a different curve, we let lipc do the work for us).
|
|
end)
|
|
|
|
it("oasis should interpret orientation event", function()
|
|
package.unload('device/kindle/device')
|
|
io.open = function(filename, mode)
|
|
if filename == "/proc/usid" then
|
|
return {
|
|
read = function()
|
|
return "G0B0GCXXX"
|
|
end,
|
|
close = function() end
|
|
}
|
|
else
|
|
return iopen(filename, mode)
|
|
end
|
|
end
|
|
|
|
mock_ffi_input = require('ffi/input')
|
|
stub(mock_ffi_input, "waitForEvent")
|
|
mock_ffi_input.waitForEvent.returns({
|
|
type = 3,
|
|
time = {
|
|
usec = 450565,
|
|
sec = 1471081881
|
|
},
|
|
code = 24,
|
|
value = 16
|
|
})
|
|
|
|
local UIManager = require("ui/uimanager")
|
|
stub(UIManager, "onRotation")
|
|
|
|
local kindle_dev = require('device/kindle/device')
|
|
assert.is.same("KindleOasis", kindle_dev.model)
|
|
kindle_dev:init()
|
|
kindle_dev:lockGSensor(true)
|
|
|
|
kindle_dev.input:waitEvent()
|
|
assert.stub(UIManager.onRotation).was_called()
|
|
|
|
mock_ffi_input.waitForEvent:revert()
|
|
UIManager.onRotation:revert()
|
|
end)
|
|
end)
|
|
-- luacheck: pop
|
|
end)
|