Add restart koreader function and ensure FlushSettings event can be delivered to all widgets (#2772)

pull/2901/head
Hzj_jie 7 years ago committed by Qingping Hou
parent 3492b8b117
commit 30378eb2a8

@ -325,7 +325,6 @@ function FileManager:init()
table.insert(self, ReaderDictionary:new{ ui = self }) table.insert(self, ReaderDictionary:new{ ui = self })
table.insert(self, ReaderWikipedia:new{ ui = self }) table.insert(self, ReaderWikipedia:new{ ui = self })
self.loaded_modules = {}
-- koreader plugins -- koreader plugins
for _,plugin_module in ipairs(PluginLoader:loadPlugins()) do for _,plugin_module in ipairs(PluginLoader:loadPlugins()) do
if not plugin_module.is_doc_only then if not plugin_module.is_doc_only then
@ -333,7 +332,7 @@ function FileManager:init()
plugin_module, { ui = self, }) plugin_module, { ui = self, })
-- Keep references to the modules which do not register into menu. -- Keep references to the modules which do not register into menu.
if ok then if ok then
table.insert(self.loaded_modules, plugin_or_err) table.insert(self, plugin_or_err)
logger.info("FM loaded plugin", plugin_module.name, logger.info("FM loaded plugin", plugin_module.name,
"at", plugin_module.path) "at", plugin_module.path)
end end

@ -269,18 +269,13 @@ function FileManagerMenu:setUpdateItemTable()
self.menu_items.exit = { self.menu_items.exit = {
text = _("Exit"), text = _("Exit"),
callback = function() callback = function()
if SetDefaults.settings_changed then self:exitOrRestart()
SetDefaults.settings_changed = false end,
UIManager:show(ConfirmBox:new{ }
text = _("You have unsaved default settings. Save them now?"), self.menu_items.restart_koreader = {
ok_callback = function() text = _("Restart KOReader"),
SetDefaults:saveSettings() callback = function()
end, self:exitOrRestart(function() UIManager:restartKOReader() end)
})
else
UIManager:close(self.menu_container)
self.ui:onClose()
end
end, end,
} }
@ -298,6 +293,34 @@ dbg:guard(FileManagerMenu, 'setUpdateItemTable',
end end
end) end)
function FileManagerMenu:exitOrRestart(callback)
if SetDefaults.settings_changed then
UIManager:show(ConfirmBox:new{
text = _("You have unsaved default settings. Save them now?\nTap \"Cancel\" to return to KOReader."),
ok_text = _("Save"),
ok_callback = function()
SetDefaults.settings_changed = false
SetDefaults:saveSettings()
self:exitOrRestart(callback)
end,
cancel_text = _("Don't save"),
cancel_callback = function()
SetDefaults.settings_changed = false
self:exitOrRestart(callback)
end,
other_buttons = {{
text = _("Cancel"),
}}
})
else
UIManager:close(self.menu_container)
self.ui:onClose()
if callback then
callback()
end
end
end
function FileManagerMenu:onShowMenu() function FileManagerMenu:onShowMenu()
local tab_index = G_reader_settings:readSetting("filemanagermenu_tab_index") or 1 local tab_index = G_reader_settings:readSetting("filemanagermenu_tab_index") or 1
if self.tab_item_table == nil then if self.tab_item_table == nil then

@ -186,12 +186,14 @@ function ReaderMenu:setUpdateItemTable()
self.menu_items.exit = { self.menu_items.exit = {
text = _("Exit"), text = _("Exit"),
callback = function() callback = function()
self:onTapCloseMenu() self:exitOrRestart()
UIManager:scheduleIn(0.1, function() self.ui:onClose() end) end,
local FileManager = require("apps/filemanager/filemanager") }
if FileManager.instance then
FileManager.instance:onClose() self.menu_items.restart_koreader = {
end text = _("Restart KOReader"),
callback = function()
self:exitOrRestart(function() UIManager:restartKOReader() end)
end, end,
} }
@ -209,6 +211,20 @@ dbg:guard(ReaderMenu, 'setUpdateItemTable',
end end
end) end)
function ReaderMenu:exitOrRestart(callback)
self:onTapCloseMenu()
UIManager:nextTick(function()
self.ui:onClose()
if callback ~= nil then
callback()
end
end)
local FileManager = require("apps/filemanager/filemanager")
if FileManager.instance then
FileManager.instance:onClose()
end
end
function ReaderMenu:onShowReaderMenu() function ReaderMenu:onShowReaderMenu()
if self.tab_item_table == nil then if self.tab_item_table == nil then
self:setUpdateItemTable() self:setUpdateItemTable()

@ -481,7 +481,6 @@ end
function ReaderUI:onFlushSettings() function ReaderUI:onFlushSettings()
self:saveSettings() self:saveSettings()
return true
end end
function ReaderUI:closeDocument() function ReaderUI:closeDocument()
@ -530,7 +529,6 @@ function ReaderUI:onClose()
if _running_instance == self then if _running_instance == self then
_running_instance = nil _running_instance = nil
end end
return true
end end
return ReaderUI return ReaderUI

@ -47,6 +47,7 @@ function Dbg:turnOn()
return unpack(values) return unpack(values)
end end
end end
Dbg.dassert = function(check, msg) assert(check, msg) end
-- TODO: close ev.log fd for children -- TODO: close ev.log fd for children
-- create or clear ev log file -- create or clear ev log file
@ -59,6 +60,7 @@ function Dbg:turnOff()
logger:setLevel(logger.levels.info) logger:setLevel(logger.levels.info)
function Dbg_mt.__call() end function Dbg_mt.__call() end
function Dbg.guard() end function Dbg.guard() end
function Dbg.dassert() end
if self.ev_log then if self.ev_log then
io.close(self.ev_log) io.close(self.ev_log)
self.ev_log = nil self.ev_log = nil

@ -1,4 +1,3 @@
local Event = require("ui/event")
local logger = require("logger") local logger = require("logger")
local _ = require("gettext") local _ = require("gettext")
@ -125,9 +124,6 @@ function Device:onPowerEvent(ev)
elseif ev == "Power" or ev == "Suspend" then elseif ev == "Power" or ev == "Suspend" then
self.powerd:beforeSuspend() self.powerd:beforeSuspend()
local UIManager = require("ui/uimanager") local UIManager = require("ui/uimanager")
-- flushing settings first in case the screensaver takes too long time
-- that flushing has no chance to run
UIManager:broadcastEvent(Event:new("FlushSettings"))
logger.dbg("Suspending...") logger.dbg("Suspending...")
-- always suspend in portrait mode -- always suspend in portrait mode
self.orig_rotation_mode = self.screen:getRotationMode() self.orig_rotation_mode = self.screen:getRotationMode()

@ -1,6 +1,5 @@
local Generic = require("device/generic/device") local Generic = require("device/generic/device")
local util = require("ffi/util") local util = require("ffi/util")
local Event = require("ui/event")
local logger = require("logger") local logger = require("logger")
local function yes() return true end local function yes() return true end
@ -93,7 +92,6 @@ function Kindle:intoScreenSaver()
os.execute("killall -cont awesome") os.execute("killall -cont awesome")
end end
end end
require("ui/uimanager"):broadcastEvent(Event:new("FlushSettings"))
end end
function Kindle:outofScreenSaver() function Kindle:outofScreenSaver()

@ -63,6 +63,7 @@ local order = {
"help", "help",
"system_statistics", "system_statistics",
"----------------------------", "----------------------------",
"restart_koreader",
"poweroff", -- if Device:isKobo() "poweroff", -- if Device:isKobo()
"reboot", -- if Device:isKobo() "reboot", -- if Device:isKobo()
"----------------------------", "----------------------------",

@ -81,6 +81,7 @@ local order = {
"help", "help",
"system_statistics", "system_statistics",
"----------------------------", "----------------------------",
"restart_koreader",
"poweroff", -- if Device:isKobo() "poweroff", -- if Device:isKobo()
"reboot", -- if Device:isKobo() "reboot", -- if Device:isKobo()
"----------------------------", "----------------------------",

@ -33,6 +33,7 @@ local UIManager = {
_refresh_stack = {}, _refresh_stack = {},
_refresh_func_stack = {}, _refresh_func_stack = {},
_entered_poweroff_stage = false, _entered_poweroff_stage = false,
_exit_code = nil,
} }
function UIManager:init() function UIManager:init()
@ -41,7 +42,7 @@ function UIManager:init()
self:sendEvent(input_event) self:sendEvent(input_event)
end, end,
SaveState = function() SaveState = function()
self:broadcastEvent(Event:new("FlushSettings")) self:flushSettings()
end, end,
Power = function(input_event) Power = function(input_event)
Device:onPowerEvent(input_event) Device:onPowerEvent(input_event)
@ -73,6 +74,7 @@ function UIManager:init()
-- resume. -- resume.
self:_initAutoSuspend() self:_initAutoSuspend()
self.event_handlers["Suspend"] = function() self.event_handlers["Suspend"] = function()
self:_beforeSuspend()
if self._stopAutoSuspend then if self._stopAutoSuspend then
-- TODO(Hzj-jie): Why _stopAutoSuspend could be nil in test cases. -- TODO(Hzj-jie): Why _stopAutoSuspend could be nil in test cases.
--[[ --[[
@ -87,13 +89,12 @@ function UIManager:init()
--]] --]]
self:_stopAutoSuspend() self:_stopAutoSuspend()
end end
self:broadcastEvent(Event:new("Suspend"))
Device:onPowerEvent("Suspend") Device:onPowerEvent("Suspend")
end end
self.event_handlers["Resume"] = function() self.event_handlers["Resume"] = function()
Device:onPowerEvent("Resume") Device:onPowerEvent("Resume")
self:broadcastEvent(Event:new("Resume"))
self:_startAutoSuspend() self:_startAutoSuspend()
self:_afterResume()
end end
self.event_handlers["PowerPress"] = function() self.event_handlers["PowerPress"] = function()
UIManager:scheduleIn(2, self.poweroff_action) UIManager:scheduleIn(2, self.poweroff_action)
@ -101,24 +102,24 @@ function UIManager:init()
self.event_handlers["PowerRelease"] = function() self.event_handlers["PowerRelease"] = function()
if not self._entered_poweroff_stage then if not self._entered_poweroff_stage then
UIManager:unschedule(self.poweroff_action) UIManager:unschedule(self.poweroff_action)
self.event_handlers["Suspend"]() self:suspend()
end end
end end
if not G_reader_settings:readSetting("ignore_power_sleepcover") then if not G_reader_settings:readSetting("ignore_power_sleepcover") then
self.event_handlers["SleepCoverClosed"] = function() self.event_handlers["SleepCoverClosed"] = function()
Device.is_cover_closed = true Device.is_cover_closed = true
self.event_handlers["Suspend"]() self:suspend()
end end
self.event_handlers["SleepCoverOpened"] = function() self.event_handlers["SleepCoverOpened"] = function()
Device.is_cover_closed = false Device.is_cover_closed = false
self.event_handlers["Resume"]() self:resume()
end end
else else
-- Closing/opening the cover will still wake up the device, so we -- Closing/opening the cover will still wake up the device, so we
-- need to put it back to sleep if we are in screen saver mode -- need to put it back to sleep if we are in screen saver mode
self.event_handlers["SleepCoverClosed"] = function() self.event_handlers["SleepCoverClosed"] = function()
if Device.screen_saver_mode then if Device.screen_saver_mode then
self.event_handlers["Suspend"]() self:suspend()
end end
end end
self.event_handlers["SleepCoverOpened"] = self.event_handlers["SleepCoverClosed"] self.event_handlers["SleepCoverOpened"] = self.event_handlers["SleepCoverClosed"]
@ -127,15 +128,16 @@ function UIManager:init()
Device:getPowerDevice():toggleFrontlight() Device:getPowerDevice():toggleFrontlight()
end end
self.event_handlers["Charging"] = function() self.event_handlers["Charging"] = function()
self:broadcastEvent(Event:new("Charging")) self:_beforeCharging()
if Device.screen_saver_mode then if Device.screen_saver_mode then
self.event_handlers["Suspend"]() self:suspend()
end end
end end
self.event_handlers["NotCharging"] = function() self.event_handlers["NotCharging"] = function()
self:broadcastEvent(Event:new("NotCharging")) -- We need to put the device into suspension, other things need to be done before it.
self:_afterNotCharging()
if Device.screen_saver_mode then if Device.screen_saver_mode then
self.event_handlers["Suspend"]() self:suspend()
end end
end end
self.event_handlers["__default__"] = function(input_event) self.event_handlers["__default__"] = function(input_event)
@ -143,27 +145,27 @@ function UIManager:init()
-- Suspension in Kobo can be interrupted by screen updates. We -- Suspension in Kobo can be interrupted by screen updates. We
-- ignore user touch input here so screen udpate won't be -- ignore user touch input here so screen udpate won't be
-- triggered in suspend mode -- triggered in suspend mode
self.event_handlers["Suspend"]() self:suspend()
else else
self:sendEvent(input_event) self:sendEvent(input_event)
end end
end end
elseif Device:isKindle() then elseif Device:isKindle() then
self.event_handlers["IntoSS"] = function() self.event_handlers["IntoSS"] = function()
self:broadcastEvent(Event:new("Suspend")) self:_beforeSuspend()
Device:intoScreenSaver() Device:intoScreenSaver()
end end
self.event_handlers["OutOfSS"] = function() self.event_handlers["OutOfSS"] = function()
Device:outofScreenSaver() Device:outofScreenSaver()
self:broadcastEvent(Event:new("Resume")) self:_afterResume();
end end
self.event_handlers["Charging"] = function() self.event_handlers["Charging"] = function()
self:broadcastEvent(Event:new("Charging")) self:_beforeCharging()
Device:usbPlugIn() Device:usbPlugIn()
end end
self.event_handlers["NotCharging"] = function() self.event_handlers["NotCharging"] = function()
Device:usbPlugOut() Device:usbPlugOut()
self:broadcastEvent(Event:new("NotCharging")) self:_afterNotCharging()
end end
end end
end end
@ -226,6 +228,8 @@ function UIManager:close(widget, refreshtype, refreshregion)
end end
logger.dbg("close widget", widget.id or widget.name) logger.dbg("close widget", widget.id or widget.name)
local dirty = false local dirty = false
-- Ensure all the widgets can get onFlushSettings event.
widget:handleEvent(Event:new("FlushSettings"))
-- first send close event to widget -- first send close event to widget
widget:handleEvent(Event:new("CloseWidget")) widget:handleEvent(Event:new("CloseWidget"))
-- make it disabled by default and check any widget that enables it -- make it disabled by default and check any widget that enables it
@ -412,6 +416,7 @@ end
--- Signals to quit. --- Signals to quit.
function UIManager:quit() function UIManager:quit()
if not self._running then return end
logger.info("quitting uimanager") logger.info("quitting uimanager")
self._task_queue_dirty = false self._task_queue_dirty = false
self._running = false self._running = false
@ -765,12 +770,14 @@ function UIManager:run()
self.looper:add_callback(function() self:handleInput() end) self.looper:add_callback(function() self:handleInput() end)
self.looper:start() self.looper:start()
end end
return self._exit_code
end end
-- run uimanager forever for testing purpose -- run uimanager forever for testing purpose
function UIManager:runForever() function UIManager:runForever()
self._run_forever = true self._run_forever = true
self:run() return self:run()
end end
-- Kobo does not have an auto suspend function, so we implement it ourselves. -- Kobo does not have an auto suspend function, so we implement it ourselves.
@ -792,7 +799,7 @@ function UIManager:_initAutoSuspend()
local now = os.time() local now = os.time()
-- Do not repeat auto suspend procedure after suspend. -- Do not repeat auto suspend procedure after suspend.
if self.last_action_sec + self.auto_suspend_sec <= now then if self.last_action_sec + self.auto_suspend_sec <= now then
self.event_handlers["Suspend"]() self:suspend()
else else
self:scheduleIn( self:scheduleIn(
self.last_action_sec + self.auto_suspend_sec - now, self.last_action_sec + self.auto_suspend_sec - now,
@ -824,6 +831,54 @@ function UIManager:_initAutoSuspend()
end end
end end
-- The common operations should be performed before suspending the device. Ditto.
function UIManager:_beforeSuspend()
self:flushSettings()
self:broadcastEvent(Event:new("Suspend"))
end
-- The common operations should be performed after resuming the device. Ditto.
function UIManager:_afterResume()
self:broadcastEvent(Event:new("Resume"))
end
function UIManager:_beforeCharging()
self:broadcastEvent(Event:new("Charging"))
end
function UIManager:_afterNotCharging()
self:broadcastEvent(Event:new("NotCharging"))
end
-- Executes all the operations of a suspending request. This function usually puts the device into
-- suspension.
function UIManager:suspend()
if Device:isKobo() then
self.event_handlers["Suspend"]()
elseif Device:isKindle() then
self.event_handlers["IntoSS"]()
end
end
-- Executes all the operations of a resume request. This function usually wakes up the device.
function UIManager:resume()
if Device:isKobo() then
self.event_handlers["Resume"]()
elseif Device:isKindle() then
self.event_handlers["OutOfSS"]()
end
end
function UIManager:flushSettings()
self:broadcastEvent(Event:new("FlushSettings"))
end
function UIManager:restartKOReader()
self:quit()
-- This is just a magic number to indicate the restart request for shell scripts.
self._exit_code = 85
end
UIManager._resetAutoSuspendTimer = noop UIManager._resetAutoSuspendTimer = noop
UIManager:init() UIManager:init()

@ -44,6 +44,7 @@ local ConfirmBox = InputContainer:new{
cancel_text = _("Cancel"), cancel_text = _("Cancel"),
ok_callback = function() end, ok_callback = function() end,
cancel_callback = function() end, cancel_callback = function() end,
other_buttons = nil,
margin = 5, margin = 5,
padding = 5, padding = 5,
} }
@ -78,28 +79,42 @@ function ConfirmBox:init()
width = Screen:getWidth()*2/3, width = Screen:getWidth()*2/3,
} }
} }
local buttons = {{
text = self.cancel_text,
callback = function()
self.cancel_callback()
UIManager:close(self)
end,
}, {
text = self.ok_text,
callback = function()
self.ok_callback()
UIManager:close(self)
end,
},}
if self.other_buttons ~= nil then
for __, button in ipairs(self.other_buttons) do
assert(type(button.text) == "string")
assert(button.callback == nil or type(button.callback) == "function")
table.insert(buttons, {
text = button.text,
callback = function()
if button.callback ~= nil then
button.callback()
end
UIManager:close(self)
end,
})
end
end
local button_table = ButtonTable:new{ local button_table = ButtonTable:new{
width = content:getSize().w, width = content:getSize().w,
button_font_face = "cfont", button_font_face = "cfont",
button_font_size = 20, button_font_size = 20,
buttons = { buttons = { buttons },
{
{
text = self.cancel_text,
callback = function()
self.cancel_callback()
UIManager:close(self)
end,
},
{
text = self.ok_text,
callback = function()
self.ok_callback()
UIManager:close(self)
end,
},
},
},
zero_sep = true, zero_sep = true,
show_parent = self, show_parent = self,
} }

@ -8,7 +8,6 @@ will call a method "onEventName" for an event with name
]] ]]
local EventListener = {} local EventListener = {}
local DEBUG = require("dbg")
function EventListener:new(new_o) function EventListener:new(new_o)
local o = new_o or {} local o = new_o or {}
@ -29,9 +28,6 @@ By default, it's `"on"..Event.name`.
]] ]]
function EventListener:handleEvent(event) function EventListener:handleEvent(event)
if self[event.handler] then if self[event.handler] then
if self.id or self.name then
DEBUG:v(self.id or self.name, "handling event", event)
end
return self[event.handler](self, unpack(event.args)) return self[event.handler](self, unpack(event.args))
end end
end end

@ -366,8 +366,12 @@ OPTIONS:
[[ $args != /* ]] && args="${CURDIR}/${args}" [[ $args != /* ]] && args="${CURDIR}/${args}"
fi fi
EMULATE_READER_W=${screen_width} EMULATE_READER_H=${screen_height} \ RETURN_VALUE=85
./reader.lua -d "$args" while [ $RETURN_VALUE -eq 85 ]; do
EMULATE_READER_W=${screen_width} EMULATE_READER_H=${screen_height} \
./reader.lua -d "$args"
RETURN_VALUE=$?
done
} || exit } || exit
popd popd
} }
@ -417,6 +421,7 @@ OPTIONS:
make "${EMU_DIR}/.busted" make "${EMU_DIR}/.busted"
pushd "${EMU_DIR}" && { pushd "${EMU_DIR}" && {
test_path="./spec/$1/unit" test_path="./spec/$1/unit"
rm -rf "${test_path}"/data/*.sdr
if [ ! -z "$2" ]; then if [ ! -z "$2" ]; then
test_path="${test_path}/$2" test_path="${test_path}/$2"

@ -255,7 +255,12 @@ if [ -e crash.log ]; then
tail -c 500000 crash.log >crash.log.new tail -c 500000 crash.log >crash.log.new
mv -f crash.log.new crash.log mv -f crash.log.new crash.log
fi fi
./reader.lua "$@" >>crash.log 2>&1
RETURN_VALUE=85
while [ $RETURN_VALUE -eq 85 ]; do
./reader.lua "$@" >>crash.log 2>&1
RETURN_VALUE=$?
done
# clean up our own process tree in case the reader crashed (if needed, to avoid flooding KUAL's log) # clean up our own process tree in case the reader crashed (if needed, to avoid flooding KUAL's log)
if pidof reader.lua >/dev/null 2>&1; then if pidof reader.lua >/dev/null 2>&1; then
@ -345,3 +350,5 @@ if [ "${PASSCODE_DISABLED}" = "yes" ]; then
logmsg "Restoring system passcode . . ." logmsg "Restoring system passcode . . ."
touch "/var/local/system/userpasswdenabled" touch "/var/local/system/userpasswdenabled"
fi fi
exit $RETURN_VALUE

@ -119,8 +119,11 @@ if [ -e crash.log ]; then
mv -f crash.log.new crash.log mv -f crash.log.new crash.log
fi fi
./reader.lua "${args}" >>crash.log 2>&1 RETURN_VALUE=85
RESULT=$? while [ $RETURN_VALUE -eq 85 ]; do
./reader.lua "${args}" >>crash.log 2>&1
RETURN_VALUE=$?
done
if [ "${FROM_NICKEL}" = "true" ]; then if [ "${FROM_NICKEL}" = "true" ]; then
if [ "${FROM_KFMON}" != "true" ]; then if [ "${FROM_KFMON}" != "true" ]; then
@ -145,4 +148,4 @@ else
fi fi
fi fi
return ${RESULT} exit $RETURN_VALUE

@ -42,8 +42,14 @@ if [ -e crash.log ]; then
mv -f crash.log.new crash.log mv -f crash.log.new crash.log
fi fi
./reader.lua "${args}" >>crash.log 2>&1 RETURN_VALUE=85
while [ $RETURN_VALUE -eq 85 ]; do
./reader.lua "${args}" >>crash.log 2>&1
RETURN_VALUE=$?
done
if pidof reader.lua >/dev/null 2>&1; then if pidof reader.lua >/dev/null 2>&1; then
killall -TERM reader.lua killall -TERM reader.lua
fi fi
exit $RETURN_VALUE

@ -29,4 +29,11 @@ export EXT_FONT_DIR="${HOME}/fonts"
# set fullscreen mode # set fullscreen mode
export SDL_FULLSCREEN=1 export SDL_FULLSCREEN=1
./reader.lua -d ~/Documents RETURN_VALUE=85
while [ $RETURN_VALUE -eq 85 ]; do
./reader.lua -d ~/Documents
RETURN_VALUE=$?
done
exit $RETURN_VALUE

@ -6,6 +6,7 @@ local PowerD = require("device"):getPowerDevice()
local UIManager = require("ui/uimanager") local UIManager = require("ui/uimanager")
local WidgetContainer = require("ui/widget/container/widgetcontainer") local WidgetContainer = require("ui/widget/container/widgetcontainer")
local T = require("ffi/util").template local T = require("ffi/util").template
local dbg = require("dbg")
local logger = require("logger") local logger = require("logger")
local util = require("ffi/util") local util = require("ffi/util")
local _ = require("gettext") local _ = require("gettext")
@ -94,11 +95,12 @@ local BatteryStat = {
settings = LuaSettings:open(DataStorage:getSettingsDir() .. "/batterstat.lua"), settings = LuaSettings:open(DataStorage:getSettingsDir() .. "/batterstat.lua"),
dump_file = util.realpath(DataStorage:getDataDir()) .. "/batterystat.log", dump_file = util.realpath(DataStorage:getDataDir()) .. "/batterystat.log",
debugging = false, debugging = false,
kv_page = nil,
} }
function BatteryStat:init() function BatteryStat:init()
self.charging = Usage:new(self.settings:readSetting("charging")) self.charging = Usage:new(self.settings:readSetting("charging"))
self.decharging = Usage:new(self.settings:readSetting("decharging")) self.discharging = Usage:new(self.settings:readSetting("discharging"))
self.awake = Usage:new(self.settings:readSetting("awake")) self.awake = Usage:new(self.settings:readSetting("awake"))
self.sleeping = Usage:new(self.settings:readSetting("sleeping")) self.sleeping = Usage:new(self.settings:readSetting("sleeping"))
@ -125,7 +127,7 @@ end
function BatteryStat:onFlushSettings() function BatteryStat:onFlushSettings()
self.settings:reset({ self.settings:reset({
charging = self.charging, charging = self.charging,
decharging = self.decharging, discharging = self.discharging,
awake = self.awake, awake = self.awake,
sleeping = self.sleeping, sleeping = self.sleeping,
charging_state = self.charging_state, charging_state = self.charging_state,
@ -146,7 +148,7 @@ function BatteryStat:accumulate()
-- Decharging to charging. -- Decharging to charging.
self.charging:append(self.charging_state) self.charging:append(self.charging_state)
else else
self.decharging:append(self.charging_state) self.discharging:append(self.charging_state)
end end
self.awake_state = State:new() self.awake_state = State:new()
self.charging_state = State:new() self.charging_state = State:new()
@ -183,20 +185,14 @@ end
function BatteryStat:onCharging() function BatteryStat:onCharging()
self:debugOutput("onCharging") self:debugOutput("onCharging")
self.was_charging = false self.was_charging = false
self:dumpToText() self:reset(true, false)
self.charging = Usage:new()
self.awake = Usage:new()
self.sleeping = Usage:new()
self:accumulate() self:accumulate()
end end
function BatteryStat:onNotCharging() function BatteryStat:onNotCharging()
self:debugOutput("onNotCharging") self:debugOutput("onNotCharging")
self.was_charging = true self.was_charging = true
self:dumpToText() self:rest(false, true)
self.decharging = Usage:new()
self.awake = Usage:new()
self.sleeping = Usage:new()
self:accumulate() self:accumulate()
end end
@ -207,10 +203,47 @@ function BatteryStat:showStatistics()
table.insert(kv_pairs, "----------") table.insert(kv_pairs, "----------")
table.insert(kv_pairs, {_("Historical records are dumped to"), ""}) table.insert(kv_pairs, {_("Historical records are dumped to"), ""})
table.insert(kv_pairs, {self.dump_file, ""}) table.insert(kv_pairs, {self.dump_file, ""})
UIManager:show(KeyValuePage:new{ table.insert(kv_pairs, "----------")
table.insert(kv_pairs, {_("If you would like to reset the data,"), "",
callback = function()
self:resetAll()
self:restart()
end})
table.insert(kv_pairs, {_("please tap here."), "",
callback = function()
self:resetAll()
self:restart()
end})
self.kv_page = KeyValuePage:new{
title = _("Battery statistics"), title = _("Battery statistics"),
kv_pairs = kv_pairs, kv_pairs = kv_pairs,
}) }
UIManager:show(self.kv_page)
end
function BatteryStat:reset(withCharging, withDischarging)
self:dumpToText()
self.awake = Usage:new()
self.sleeping = Usage:new()
if withCharging then
self.charging = Usage:new()
end
if withDischarging then
self.discharging = Usage:new()
end
end
function BatteryStat:resetAll()
self:reset(true, true)
self.charging_state = State:new()
self.awake_state = State:new()
end
function BatteryStat:restart()
dbg.dassert(self.kv_page ~= nil)
UIManager:close(self.kv_page)
self:showStatistics()
end end
function BatteryStat:dumpToText() function BatteryStat:dumpToText()
@ -237,8 +270,8 @@ function BatteryStat:dump()
self.charging:dump(kv_pairs) self.charging:dump(kv_pairs)
self.charging:dumpCharging(kv_pairs) self.charging:dumpCharging(kv_pairs)
table.insert(kv_pairs, {_("Since last charge"), ""}) table.insert(kv_pairs, {_("Since last charge"), ""})
self.decharging:dump(kv_pairs) self.discharging:dump(kv_pairs)
self.decharging:dumpRemaining(kv_pairs) self.discharging:dumpRemaining(kv_pairs)
return kv_pairs return kv_pairs
end end

@ -223,7 +223,7 @@ end
function KOSync:setCustomServer(server) function KOSync:setCustomServer(server)
DEBUG("set custom server", server) DEBUG("set custom server", server)
self.kosync_custom_server = server ~= "" and server or nil self.kosync_custom_server = server ~= "" and server or nil
self:onSaveSettings() self:saveSettings()
end end
function KOSync:login() function KOSync:login()
@ -324,7 +324,7 @@ function KOSync:doRegister(username, password)
}) })
end end
self:onSaveSettings() self:saveSettings()
end end
function KOSync:doLogin(username, password) function KOSync:doLogin(username, password)
@ -359,13 +359,13 @@ function KOSync:doLogin(username, password)
}) })
end end
self:onSaveSettings() self:saveSettings()
end end
function KOSync:logout() function KOSync:logout()
self.kosync_userkey = nil self.kosync_userkey = nil
self.kosync_auto_sync = true self.kosync_auto_sync = true
self:onSaveSettings() self:saveSettings()
end end
function KOSync:getLastPercent() function KOSync:getLastPercent()
@ -555,7 +555,7 @@ function KOSync:getProgress(manual)
end end
end end
function KOSync:onSaveSettings() function KOSync:saveSettings()
local settings = { local settings = {
custom_server = self.kosync_custom_server, custom_server = self.kosync_custom_server,
username = self.kosync_username, username = self.kosync_username,

@ -11,7 +11,6 @@ io.stdout:write([[
[*] Current time: ]], os.date("%x-%X"), "\n\n") [*] Current time: ]], os.date("%x-%X"), "\n\n")
io.stdout:flush() io.stdout:flush()
-- load default settings -- load default settings
require("defaults") require("defaults")
local DataStorage = require("datastorage") local DataStorage = require("datastorage")
@ -165,6 +164,8 @@ if Device:needsTouchScreenProbe() then
Device:touchScreenProbe() Device:touchScreenProbe()
end end
local exit_code = nil
if ARGV[argidx] and ARGV[argidx] ~= "" then if ARGV[argidx] and ARGV[argidx] ~= "" then
local file = nil local file = nil
if lfs.attributes(ARGV[argidx], "mode") == "file" then if lfs.attributes(ARGV[argidx], "mode") == "file" then
@ -189,13 +190,13 @@ if ARGV[argidx] and ARGV[argidx] ~= "" then
FileManager:showFiles(home_dir) FileManager:showFiles(home_dir)
end) end)
end end
UIManager:run() exit_code = UIManager:run()
elseif last_file then elseif last_file then
local ReaderUI = require("apps/reader/readerui") local ReaderUI = require("apps/reader/readerui")
UIManager:nextTick(function() UIManager:nextTick(function()
ReaderUI:showReader(last_file) ReaderUI:showReader(last_file)
end) end)
UIManager:run() exit_code = UIManager:run()
else else
return showusage() return showusage()
end end
@ -213,7 +214,12 @@ local function exitReader()
Device:exit() Device:exit()
if Profiler then Profiler.stop() end if Profiler then Profiler.stop() end
os.exit(0)
if type(exit_code) == "number" then
os.exit(exit_code)
else
os.exit(0)
end
end end
exitReader() exitReader()

@ -43,6 +43,7 @@ describe("Readerfooter module", function()
book_time_to_read = true, book_time_to_read = true,
chapter_time_to_read = true, chapter_time_to_read = true,
}) })
UIManager:run()
end) end)
it("should setup footer as visible in all_at_once mode", function() it("should setup footer as visible in all_at_once mode", function()

@ -18,6 +18,7 @@ describe("Readerhighlight module", function()
UIManager:scheduleIn(1, function() UIManager:scheduleIn(1, function()
UIManager:close(readerui.dictionary.dict_window) UIManager:close(readerui.dictionary.dict_window)
UIManager:close(readerui) UIManager:close(readerui)
UIManager:quit()
end) end)
UIManager:run() UIManager:run()
end end
@ -57,6 +58,7 @@ describe("Readerhighlight module", function()
UIManager:nextTick(function() UIManager:nextTick(function()
UIManager:close(readerui.highlight.edit_highlight_dialog) UIManager:close(readerui.highlight.edit_highlight_dialog)
UIManager:close(readerui) UIManager:close(readerui)
UIManager:quit()
end) end)
UIManager:run() UIManager:run()
end end
@ -169,6 +171,7 @@ describe("Readerhighlight module", function()
after_each(function() after_each(function()
readerui.highlight:clear() readerui.highlight:clear()
readerui.document.configurable.text_wrap = 0 readerui.document.configurable.text_wrap = 0
UIManager:close(readerui) -- close to flush settings
end) end)
it("should highlight single word", function() it("should highlight single word", function()
highlight_single_word(readerui, Geom:new{ x = 260, y = 70 }) highlight_single_word(readerui, Geom:new{ x = 260, y = 70 })
@ -253,6 +256,7 @@ describe("Readerhighlight module", function()
after_each(function() after_each(function()
readerui.highlight:clear() readerui.highlight:clear()
readerui.document.configurable.text_wrap = 0 readerui.document.configurable.text_wrap = 0
UIManager:close(readerui) -- close to flush settings
end) end)
it("should highlight single word", function() it("should highlight single word", function()
highlight_single_word(readerui, Geom:new{ x = 260, y = 70 }) highlight_single_word(readerui, Geom:new{ x = 260, y = 70 })

@ -22,7 +22,7 @@ describe("Readerpaging module", function()
it("should emit EndOfBook event at the end", function() it("should emit EndOfBook event at the end", function()
UIManager:quit() UIManager:quit()
UIManager:show(readerui) UIManager:show(readerui)
UIManager:scheduleIn(1, function() UIManager:close(readerui) end) UIManager:nextTick(function() UIManager:close(readerui) end)
UIManager:run() UIManager:run()
readerui:handleEvent(Event:new("SetScrollMode", false)) readerui:handleEvent(Event:new("SetScrollMode", false))
readerui.zooming:setZoomMode("pageheight") readerui.zooming:setZoomMode("pageheight")
@ -54,7 +54,7 @@ describe("Readerpaging module", function()
it("should emit EndOfBook event at the end", function() it("should emit EndOfBook event at the end", function()
UIManager:quit() UIManager:quit()
UIManager:show(readerui) UIManager:show(readerui)
UIManager:scheduleIn(1, function() UIManager:close(readerui) end) UIManager:nextTick(function() UIManager:close(readerui) end)
UIManager:run() UIManager:run()
paging.page_positions = {} paging.page_positions = {}
readerui:handleEvent(Event:new("SetScrollMode", true)) readerui:handleEvent(Event:new("SetScrollMode", true))
@ -71,7 +71,7 @@ describe("Readerpaging module", function()
UIManager:quit() UIManager:quit()
end) end)
it("should scroll withtout crash backward on the first page", function() it("should scroll backward on the first page without crash", function()
local sample_djvu = "spec/front/unit/data/djvu3spec.djvu" local sample_djvu = "spec/front/unit/data/djvu3spec.djvu"
local tmp_readerui = ReaderUI:new{ local tmp_readerui = ReaderUI:new{
document = DocumentRegistry:openDocument(sample_djvu), document = DocumentRegistry:openDocument(sample_djvu),
@ -79,7 +79,7 @@ describe("Readerpaging module", function()
tmp_readerui.paging:onScrollPanRel(-100) tmp_readerui.paging:onScrollPanRel(-100)
end) end)
it("should scroll withtout crash forward on the last page", function() it("should scroll forward on the last page without crash", function()
local sample_djvu = "spec/front/unit/data/djvu3spec.djvu" local sample_djvu = "spec/front/unit/data/djvu3spec.djvu"
local tmp_readerui = ReaderUI:new{ local tmp_readerui = ReaderUI:new{
document = DocumentRegistry:openDocument(sample_djvu), document = DocumentRegistry:openDocument(sample_djvu),

@ -12,6 +12,8 @@ describe("Readertoc module", function()
readerui = ReaderUI:new{ readerui = ReaderUI:new{
document = DocumentRegistry:openDocument(sample_epub), document = DocumentRegistry:openDocument(sample_epub),
} }
-- reset book to first page
readerui.rolling:onGotoPage(0)
toc = readerui.toc toc = readerui.toc
end) end)

@ -172,6 +172,7 @@ describe("UIManager spec", function()
assert.truthy(old_reset_timer) assert.truthy(old_reset_timer)
G_reader_settings:saveSetting("auto_suspend_timeout_seconds", 3600) G_reader_settings:saveSetting("auto_suspend_timeout_seconds", 3600)
UIManager:run()
UIManager:quit() UIManager:quit()
-- should skip on non-kobo devices -- should skip on non-kobo devices
UIManager:_initAutoSuspend() UIManager:_initAutoSuspend()

Loading…
Cancel
Save