mirror of
https://github.com/koreader/koreader.git
synced 2025-12-13 20:36:53 +01:00
Add restart koreader function and ensure FlushSettings event can be delivered to all widgets (#2772)
This commit is contained in:
@@ -325,7 +325,6 @@ function FileManager:init()
|
||||
table.insert(self, ReaderDictionary:new{ ui = self })
|
||||
table.insert(self, ReaderWikipedia:new{ ui = self })
|
||||
|
||||
self.loaded_modules = {}
|
||||
-- koreader plugins
|
||||
for _,plugin_module in ipairs(PluginLoader:loadPlugins()) do
|
||||
if not plugin_module.is_doc_only then
|
||||
@@ -333,7 +332,7 @@ function FileManager:init()
|
||||
plugin_module, { ui = self, })
|
||||
-- Keep references to the modules which do not register into menu.
|
||||
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,
|
||||
"at", plugin_module.path)
|
||||
end
|
||||
|
||||
@@ -269,18 +269,13 @@ function FileManagerMenu:setUpdateItemTable()
|
||||
self.menu_items.exit = {
|
||||
text = _("Exit"),
|
||||
callback = function()
|
||||
if SetDefaults.settings_changed then
|
||||
SetDefaults.settings_changed = false
|
||||
UIManager:show(ConfirmBox:new{
|
||||
text = _("You have unsaved default settings. Save them now?"),
|
||||
ok_callback = function()
|
||||
SetDefaults:saveSettings()
|
||||
end,
|
||||
})
|
||||
else
|
||||
UIManager:close(self.menu_container)
|
||||
self.ui:onClose()
|
||||
end
|
||||
self:exitOrRestart()
|
||||
end,
|
||||
}
|
||||
self.menu_items.restart_koreader = {
|
||||
text = _("Restart KOReader"),
|
||||
callback = function()
|
||||
self:exitOrRestart(function() UIManager:restartKOReader() end)
|
||||
end,
|
||||
}
|
||||
|
||||
@@ -298,6 +293,34 @@ dbg:guard(FileManagerMenu, 'setUpdateItemTable',
|
||||
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()
|
||||
local tab_index = G_reader_settings:readSetting("filemanagermenu_tab_index") or 1
|
||||
if self.tab_item_table == nil then
|
||||
|
||||
@@ -186,12 +186,14 @@ function ReaderMenu:setUpdateItemTable()
|
||||
self.menu_items.exit = {
|
||||
text = _("Exit"),
|
||||
callback = function()
|
||||
self:onTapCloseMenu()
|
||||
UIManager:scheduleIn(0.1, function() self.ui:onClose() end)
|
||||
local FileManager = require("apps/filemanager/filemanager")
|
||||
if FileManager.instance then
|
||||
FileManager.instance:onClose()
|
||||
end
|
||||
self:exitOrRestart()
|
||||
end,
|
||||
}
|
||||
|
||||
self.menu_items.restart_koreader = {
|
||||
text = _("Restart KOReader"),
|
||||
callback = function()
|
||||
self:exitOrRestart(function() UIManager:restartKOReader() end)
|
||||
end,
|
||||
}
|
||||
|
||||
@@ -209,6 +211,20 @@ dbg:guard(ReaderMenu, 'setUpdateItemTable',
|
||||
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()
|
||||
if self.tab_item_table == nil then
|
||||
self:setUpdateItemTable()
|
||||
|
||||
@@ -481,7 +481,6 @@ end
|
||||
|
||||
function ReaderUI:onFlushSettings()
|
||||
self:saveSettings()
|
||||
return true
|
||||
end
|
||||
|
||||
function ReaderUI:closeDocument()
|
||||
@@ -530,7 +529,6 @@ function ReaderUI:onClose()
|
||||
if _running_instance == self then
|
||||
_running_instance = nil
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
return ReaderUI
|
||||
|
||||
@@ -47,6 +47,7 @@ function Dbg:turnOn()
|
||||
return unpack(values)
|
||||
end
|
||||
end
|
||||
Dbg.dassert = function(check, msg) assert(check, msg) end
|
||||
|
||||
-- TODO: close ev.log fd for children
|
||||
-- create or clear ev log file
|
||||
@@ -59,6 +60,7 @@ function Dbg:turnOff()
|
||||
logger:setLevel(logger.levels.info)
|
||||
function Dbg_mt.__call() end
|
||||
function Dbg.guard() end
|
||||
function Dbg.dassert() end
|
||||
if self.ev_log then
|
||||
io.close(self.ev_log)
|
||||
self.ev_log = nil
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
local Event = require("ui/event")
|
||||
local logger = require("logger")
|
||||
local _ = require("gettext")
|
||||
|
||||
@@ -125,9 +124,6 @@ function Device:onPowerEvent(ev)
|
||||
elseif ev == "Power" or ev == "Suspend" then
|
||||
self.powerd:beforeSuspend()
|
||||
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...")
|
||||
-- always suspend in portrait mode
|
||||
self.orig_rotation_mode = self.screen:getRotationMode()
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
local Generic = require("device/generic/device")
|
||||
local util = require("ffi/util")
|
||||
local Event = require("ui/event")
|
||||
local logger = require("logger")
|
||||
|
||||
local function yes() return true end
|
||||
@@ -93,7 +92,6 @@ function Kindle:intoScreenSaver()
|
||||
os.execute("killall -cont awesome")
|
||||
end
|
||||
end
|
||||
require("ui/uimanager"):broadcastEvent(Event:new("FlushSettings"))
|
||||
end
|
||||
|
||||
function Kindle:outofScreenSaver()
|
||||
|
||||
@@ -63,6 +63,7 @@ local order = {
|
||||
"help",
|
||||
"system_statistics",
|
||||
"----------------------------",
|
||||
"restart_koreader",
|
||||
"poweroff", -- if Device:isKobo()
|
||||
"reboot", -- if Device:isKobo()
|
||||
"----------------------------",
|
||||
|
||||
@@ -81,6 +81,7 @@ local order = {
|
||||
"help",
|
||||
"system_statistics",
|
||||
"----------------------------",
|
||||
"restart_koreader",
|
||||
"poweroff", -- if Device:isKobo()
|
||||
"reboot", -- if Device:isKobo()
|
||||
"----------------------------",
|
||||
|
||||
@@ -33,6 +33,7 @@ local UIManager = {
|
||||
_refresh_stack = {},
|
||||
_refresh_func_stack = {},
|
||||
_entered_poweroff_stage = false,
|
||||
_exit_code = nil,
|
||||
}
|
||||
|
||||
function UIManager:init()
|
||||
@@ -41,7 +42,7 @@ function UIManager:init()
|
||||
self:sendEvent(input_event)
|
||||
end,
|
||||
SaveState = function()
|
||||
self:broadcastEvent(Event:new("FlushSettings"))
|
||||
self:flushSettings()
|
||||
end,
|
||||
Power = function(input_event)
|
||||
Device:onPowerEvent(input_event)
|
||||
@@ -73,6 +74,7 @@ function UIManager:init()
|
||||
-- resume.
|
||||
self:_initAutoSuspend()
|
||||
self.event_handlers["Suspend"] = function()
|
||||
self:_beforeSuspend()
|
||||
if self._stopAutoSuspend then
|
||||
-- TODO(Hzj-jie): Why _stopAutoSuspend could be nil in test cases.
|
||||
--[[
|
||||
@@ -87,13 +89,12 @@ function UIManager:init()
|
||||
--]]
|
||||
self:_stopAutoSuspend()
|
||||
end
|
||||
self:broadcastEvent(Event:new("Suspend"))
|
||||
Device:onPowerEvent("Suspend")
|
||||
end
|
||||
self.event_handlers["Resume"] = function()
|
||||
Device:onPowerEvent("Resume")
|
||||
self:broadcastEvent(Event:new("Resume"))
|
||||
self:_startAutoSuspend()
|
||||
self:_afterResume()
|
||||
end
|
||||
self.event_handlers["PowerPress"] = function()
|
||||
UIManager:scheduleIn(2, self.poweroff_action)
|
||||
@@ -101,24 +102,24 @@ function UIManager:init()
|
||||
self.event_handlers["PowerRelease"] = function()
|
||||
if not self._entered_poweroff_stage then
|
||||
UIManager:unschedule(self.poweroff_action)
|
||||
self.event_handlers["Suspend"]()
|
||||
self:suspend()
|
||||
end
|
||||
end
|
||||
if not G_reader_settings:readSetting("ignore_power_sleepcover") then
|
||||
self.event_handlers["SleepCoverClosed"] = function()
|
||||
Device.is_cover_closed = true
|
||||
self.event_handlers["Suspend"]()
|
||||
self:suspend()
|
||||
end
|
||||
self.event_handlers["SleepCoverOpened"] = function()
|
||||
Device.is_cover_closed = false
|
||||
self.event_handlers["Resume"]()
|
||||
self:resume()
|
||||
end
|
||||
else
|
||||
-- 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
|
||||
self.event_handlers["SleepCoverClosed"] = function()
|
||||
if Device.screen_saver_mode then
|
||||
self.event_handlers["Suspend"]()
|
||||
self:suspend()
|
||||
end
|
||||
end
|
||||
self.event_handlers["SleepCoverOpened"] = self.event_handlers["SleepCoverClosed"]
|
||||
@@ -127,15 +128,16 @@ function UIManager:init()
|
||||
Device:getPowerDevice():toggleFrontlight()
|
||||
end
|
||||
self.event_handlers["Charging"] = function()
|
||||
self:broadcastEvent(Event:new("Charging"))
|
||||
self:_beforeCharging()
|
||||
if Device.screen_saver_mode then
|
||||
self.event_handlers["Suspend"]()
|
||||
self:suspend()
|
||||
end
|
||||
end
|
||||
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
|
||||
self.event_handlers["Suspend"]()
|
||||
self:suspend()
|
||||
end
|
||||
end
|
||||
self.event_handlers["__default__"] = function(input_event)
|
||||
@@ -143,27 +145,27 @@ function UIManager:init()
|
||||
-- Suspension in Kobo can be interrupted by screen updates. We
|
||||
-- ignore user touch input here so screen udpate won't be
|
||||
-- triggered in suspend mode
|
||||
self.event_handlers["Suspend"]()
|
||||
self:suspend()
|
||||
else
|
||||
self:sendEvent(input_event)
|
||||
end
|
||||
end
|
||||
elseif Device:isKindle() then
|
||||
self.event_handlers["IntoSS"] = function()
|
||||
self:broadcastEvent(Event:new("Suspend"))
|
||||
self:_beforeSuspend()
|
||||
Device:intoScreenSaver()
|
||||
end
|
||||
self.event_handlers["OutOfSS"] = function()
|
||||
Device:outofScreenSaver()
|
||||
self:broadcastEvent(Event:new("Resume"))
|
||||
self:_afterResume();
|
||||
end
|
||||
self.event_handlers["Charging"] = function()
|
||||
self:broadcastEvent(Event:new("Charging"))
|
||||
self:_beforeCharging()
|
||||
Device:usbPlugIn()
|
||||
end
|
||||
self.event_handlers["NotCharging"] = function()
|
||||
Device:usbPlugOut()
|
||||
self:broadcastEvent(Event:new("NotCharging"))
|
||||
self:_afterNotCharging()
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -226,6 +228,8 @@ function UIManager:close(widget, refreshtype, refreshregion)
|
||||
end
|
||||
logger.dbg("close widget", widget.id or widget.name)
|
||||
local dirty = false
|
||||
-- Ensure all the widgets can get onFlushSettings event.
|
||||
widget:handleEvent(Event:new("FlushSettings"))
|
||||
-- first send close event to widget
|
||||
widget:handleEvent(Event:new("CloseWidget"))
|
||||
-- make it disabled by default and check any widget that enables it
|
||||
@@ -412,6 +416,7 @@ end
|
||||
|
||||
--- Signals to quit.
|
||||
function UIManager:quit()
|
||||
if not self._running then return end
|
||||
logger.info("quitting uimanager")
|
||||
self._task_queue_dirty = false
|
||||
self._running = false
|
||||
@@ -765,12 +770,14 @@ function UIManager:run()
|
||||
self.looper:add_callback(function() self:handleInput() end)
|
||||
self.looper:start()
|
||||
end
|
||||
|
||||
return self._exit_code
|
||||
end
|
||||
|
||||
-- run uimanager forever for testing purpose
|
||||
function UIManager:runForever()
|
||||
self._run_forever = true
|
||||
self:run()
|
||||
return self:run()
|
||||
end
|
||||
|
||||
-- Kobo does not have an auto suspend function, so we implement it ourselves.
|
||||
@@ -792,7 +799,7 @@ function UIManager:_initAutoSuspend()
|
||||
local now = os.time()
|
||||
-- Do not repeat auto suspend procedure after suspend.
|
||||
if self.last_action_sec + self.auto_suspend_sec <= now then
|
||||
self.event_handlers["Suspend"]()
|
||||
self:suspend()
|
||||
else
|
||||
self:scheduleIn(
|
||||
self.last_action_sec + self.auto_suspend_sec - now,
|
||||
@@ -824,6 +831,54 @@ function UIManager:_initAutoSuspend()
|
||||
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:init()
|
||||
|
||||
@@ -44,6 +44,7 @@ local ConfirmBox = InputContainer:new{
|
||||
cancel_text = _("Cancel"),
|
||||
ok_callback = function() end,
|
||||
cancel_callback = function() end,
|
||||
other_buttons = nil,
|
||||
margin = 5,
|
||||
padding = 5,
|
||||
}
|
||||
@@ -78,28 +79,42 @@ function ConfirmBox:init()
|
||||
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{
|
||||
width = content:getSize().w,
|
||||
button_font_face = "cfont",
|
||||
button_font_size = 20,
|
||||
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,
|
||||
},
|
||||
},
|
||||
},
|
||||
buttons = { buttons },
|
||||
zero_sep = true,
|
||||
show_parent = self,
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ will call a method "onEventName" for an event with name
|
||||
]]
|
||||
|
||||
local EventListener = {}
|
||||
local DEBUG = require("dbg")
|
||||
|
||||
function EventListener:new(new_o)
|
||||
local o = new_o or {}
|
||||
@@ -29,9 +28,6 @@ By default, it's `"on"..Event.name`.
|
||||
]]
|
||||
function EventListener:handleEvent(event)
|
||||
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))
|
||||
end
|
||||
end
|
||||
|
||||
9
kodev
9
kodev
@@ -366,8 +366,12 @@ OPTIONS:
|
||||
[[ $args != /* ]] && args="${CURDIR}/${args}"
|
||||
fi
|
||||
|
||||
EMULATE_READER_W=${screen_width} EMULATE_READER_H=${screen_height} \
|
||||
./reader.lua -d "$args"
|
||||
RETURN_VALUE=85
|
||||
while [ $RETURN_VALUE -eq 85 ]; do
|
||||
EMULATE_READER_W=${screen_width} EMULATE_READER_H=${screen_height} \
|
||||
./reader.lua -d "$args"
|
||||
RETURN_VALUE=$?
|
||||
done
|
||||
} || exit
|
||||
popd
|
||||
}
|
||||
@@ -417,6 +421,7 @@ OPTIONS:
|
||||
make "${EMU_DIR}/.busted"
|
||||
pushd "${EMU_DIR}" && {
|
||||
test_path="./spec/$1/unit"
|
||||
rm -rf "${test_path}"/data/*.sdr
|
||||
|
||||
if [ ! -z "$2" ]; then
|
||||
test_path="${test_path}/$2"
|
||||
|
||||
@@ -255,7 +255,12 @@ if [ -e crash.log ]; then
|
||||
tail -c 500000 crash.log >crash.log.new
|
||||
mv -f crash.log.new crash.log
|
||||
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)
|
||||
if pidof reader.lua >/dev/null 2>&1; then
|
||||
@@ -345,3 +350,5 @@ if [ "${PASSCODE_DISABLED}" = "yes" ]; then
|
||||
logmsg "Restoring system passcode . . ."
|
||||
touch "/var/local/system/userpasswdenabled"
|
||||
fi
|
||||
|
||||
exit $RETURN_VALUE
|
||||
|
||||
@@ -119,8 +119,11 @@ if [ -e crash.log ]; then
|
||||
mv -f crash.log.new crash.log
|
||||
fi
|
||||
|
||||
./reader.lua "${args}" >>crash.log 2>&1
|
||||
RESULT=$?
|
||||
RETURN_VALUE=85
|
||||
while [ $RETURN_VALUE -eq 85 ]; do
|
||||
./reader.lua "${args}" >>crash.log 2>&1
|
||||
RETURN_VALUE=$?
|
||||
done
|
||||
|
||||
if [ "${FROM_NICKEL}" = "true" ]; then
|
||||
if [ "${FROM_KFMON}" != "true" ]; then
|
||||
@@ -145,4 +148,4 @@ else
|
||||
fi
|
||||
fi
|
||||
|
||||
return ${RESULT}
|
||||
exit $RETURN_VALUE
|
||||
|
||||
@@ -42,8 +42,14 @@ if [ -e crash.log ]; then
|
||||
mv -f crash.log.new crash.log
|
||||
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
|
||||
killall -TERM reader.lua
|
||||
fi
|
||||
|
||||
exit $RETURN_VALUE
|
||||
|
||||
@@ -29,4 +29,11 @@ export EXT_FONT_DIR="${HOME}/fonts"
|
||||
# set fullscreen mode
|
||||
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 WidgetContainer = require("ui/widget/container/widgetcontainer")
|
||||
local T = require("ffi/util").template
|
||||
local dbg = require("dbg")
|
||||
local logger = require("logger")
|
||||
local util = require("ffi/util")
|
||||
local _ = require("gettext")
|
||||
@@ -94,11 +95,12 @@ local BatteryStat = {
|
||||
settings = LuaSettings:open(DataStorage:getSettingsDir() .. "/batterstat.lua"),
|
||||
dump_file = util.realpath(DataStorage:getDataDir()) .. "/batterystat.log",
|
||||
debugging = false,
|
||||
kv_page = nil,
|
||||
}
|
||||
|
||||
function BatteryStat:init()
|
||||
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.sleeping = Usage:new(self.settings:readSetting("sleeping"))
|
||||
|
||||
@@ -125,7 +127,7 @@ end
|
||||
function BatteryStat:onFlushSettings()
|
||||
self.settings:reset({
|
||||
charging = self.charging,
|
||||
decharging = self.decharging,
|
||||
discharging = self.discharging,
|
||||
awake = self.awake,
|
||||
sleeping = self.sleeping,
|
||||
charging_state = self.charging_state,
|
||||
@@ -146,7 +148,7 @@ function BatteryStat:accumulate()
|
||||
-- Decharging to charging.
|
||||
self.charging:append(self.charging_state)
|
||||
else
|
||||
self.decharging:append(self.charging_state)
|
||||
self.discharging:append(self.charging_state)
|
||||
end
|
||||
self.awake_state = State:new()
|
||||
self.charging_state = State:new()
|
||||
@@ -183,20 +185,14 @@ end
|
||||
function BatteryStat:onCharging()
|
||||
self:debugOutput("onCharging")
|
||||
self.was_charging = false
|
||||
self:dumpToText()
|
||||
self.charging = Usage:new()
|
||||
self.awake = Usage:new()
|
||||
self.sleeping = Usage:new()
|
||||
self:reset(true, false)
|
||||
self:accumulate()
|
||||
end
|
||||
|
||||
function BatteryStat:onNotCharging()
|
||||
self:debugOutput("onNotCharging")
|
||||
self.was_charging = true
|
||||
self:dumpToText()
|
||||
self.decharging = Usage:new()
|
||||
self.awake = Usage:new()
|
||||
self.sleeping = Usage:new()
|
||||
self:rest(false, true)
|
||||
self:accumulate()
|
||||
end
|
||||
|
||||
@@ -207,10 +203,47 @@ function BatteryStat:showStatistics()
|
||||
table.insert(kv_pairs, "----------")
|
||||
table.insert(kv_pairs, {_("Historical records are dumped to"), ""})
|
||||
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"),
|
||||
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
|
||||
|
||||
function BatteryStat:dumpToText()
|
||||
@@ -237,8 +270,8 @@ function BatteryStat:dump()
|
||||
self.charging:dump(kv_pairs)
|
||||
self.charging:dumpCharging(kv_pairs)
|
||||
table.insert(kv_pairs, {_("Since last charge"), ""})
|
||||
self.decharging:dump(kv_pairs)
|
||||
self.decharging:dumpRemaining(kv_pairs)
|
||||
self.discharging:dump(kv_pairs)
|
||||
self.discharging:dumpRemaining(kv_pairs)
|
||||
return kv_pairs
|
||||
end
|
||||
|
||||
|
||||
@@ -223,7 +223,7 @@ end
|
||||
function KOSync:setCustomServer(server)
|
||||
DEBUG("set custom server", server)
|
||||
self.kosync_custom_server = server ~= "" and server or nil
|
||||
self:onSaveSettings()
|
||||
self:saveSettings()
|
||||
end
|
||||
|
||||
function KOSync:login()
|
||||
@@ -324,7 +324,7 @@ function KOSync:doRegister(username, password)
|
||||
})
|
||||
end
|
||||
|
||||
self:onSaveSettings()
|
||||
self:saveSettings()
|
||||
end
|
||||
|
||||
function KOSync:doLogin(username, password)
|
||||
@@ -359,13 +359,13 @@ function KOSync:doLogin(username, password)
|
||||
})
|
||||
end
|
||||
|
||||
self:onSaveSettings()
|
||||
self:saveSettings()
|
||||
end
|
||||
|
||||
function KOSync:logout()
|
||||
self.kosync_userkey = nil
|
||||
self.kosync_auto_sync = true
|
||||
self:onSaveSettings()
|
||||
self:saveSettings()
|
||||
end
|
||||
|
||||
function KOSync:getLastPercent()
|
||||
@@ -555,7 +555,7 @@ function KOSync:getProgress(manual)
|
||||
end
|
||||
end
|
||||
|
||||
function KOSync:onSaveSettings()
|
||||
function KOSync:saveSettings()
|
||||
local settings = {
|
||||
custom_server = self.kosync_custom_server,
|
||||
username = self.kosync_username,
|
||||
|
||||
14
reader.lua
14
reader.lua
@@ -11,7 +11,6 @@ io.stdout:write([[
|
||||
[*] Current time: ]], os.date("%x-%X"), "\n\n")
|
||||
io.stdout:flush()
|
||||
|
||||
|
||||
-- load default settings
|
||||
require("defaults")
|
||||
local DataStorage = require("datastorage")
|
||||
@@ -165,6 +164,8 @@ if Device:needsTouchScreenProbe() then
|
||||
Device:touchScreenProbe()
|
||||
end
|
||||
|
||||
local exit_code = nil
|
||||
|
||||
if ARGV[argidx] and ARGV[argidx] ~= "" then
|
||||
local file = nil
|
||||
if lfs.attributes(ARGV[argidx], "mode") == "file" then
|
||||
@@ -189,13 +190,13 @@ if ARGV[argidx] and ARGV[argidx] ~= "" then
|
||||
FileManager:showFiles(home_dir)
|
||||
end)
|
||||
end
|
||||
UIManager:run()
|
||||
exit_code = UIManager:run()
|
||||
elseif last_file then
|
||||
local ReaderUI = require("apps/reader/readerui")
|
||||
UIManager:nextTick(function()
|
||||
ReaderUI:showReader(last_file)
|
||||
end)
|
||||
UIManager:run()
|
||||
exit_code = UIManager:run()
|
||||
else
|
||||
return showusage()
|
||||
end
|
||||
@@ -213,7 +214,12 @@ local function exitReader()
|
||||
Device:exit()
|
||||
|
||||
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
|
||||
|
||||
exitReader()
|
||||
|
||||
@@ -43,6 +43,7 @@ describe("Readerfooter module", function()
|
||||
book_time_to_read = true,
|
||||
chapter_time_to_read = true,
|
||||
})
|
||||
UIManager:run()
|
||||
end)
|
||||
|
||||
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:close(readerui.dictionary.dict_window)
|
||||
UIManager:close(readerui)
|
||||
UIManager:quit()
|
||||
end)
|
||||
UIManager:run()
|
||||
end
|
||||
@@ -57,6 +58,7 @@ describe("Readerhighlight module", function()
|
||||
UIManager:nextTick(function()
|
||||
UIManager:close(readerui.highlight.edit_highlight_dialog)
|
||||
UIManager:close(readerui)
|
||||
UIManager:quit()
|
||||
end)
|
||||
UIManager:run()
|
||||
end
|
||||
@@ -169,6 +171,7 @@ describe("Readerhighlight module", function()
|
||||
after_each(function()
|
||||
readerui.highlight:clear()
|
||||
readerui.document.configurable.text_wrap = 0
|
||||
UIManager:close(readerui) -- close to flush settings
|
||||
end)
|
||||
it("should highlight single word", function()
|
||||
highlight_single_word(readerui, Geom:new{ x = 260, y = 70 })
|
||||
@@ -253,6 +256,7 @@ describe("Readerhighlight module", function()
|
||||
after_each(function()
|
||||
readerui.highlight:clear()
|
||||
readerui.document.configurable.text_wrap = 0
|
||||
UIManager:close(readerui) -- close to flush settings
|
||||
end)
|
||||
it("should highlight single word", function()
|
||||
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()
|
||||
UIManager:quit()
|
||||
UIManager:show(readerui)
|
||||
UIManager:scheduleIn(1, function() UIManager:close(readerui) end)
|
||||
UIManager:nextTick(function() UIManager:close(readerui) end)
|
||||
UIManager:run()
|
||||
readerui:handleEvent(Event:new("SetScrollMode", false))
|
||||
readerui.zooming:setZoomMode("pageheight")
|
||||
@@ -54,7 +54,7 @@ describe("Readerpaging module", function()
|
||||
it("should emit EndOfBook event at the end", function()
|
||||
UIManager:quit()
|
||||
UIManager:show(readerui)
|
||||
UIManager:scheduleIn(1, function() UIManager:close(readerui) end)
|
||||
UIManager:nextTick(function() UIManager:close(readerui) end)
|
||||
UIManager:run()
|
||||
paging.page_positions = {}
|
||||
readerui:handleEvent(Event:new("SetScrollMode", true))
|
||||
@@ -71,7 +71,7 @@ describe("Readerpaging module", function()
|
||||
UIManager:quit()
|
||||
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 tmp_readerui = ReaderUI:new{
|
||||
document = DocumentRegistry:openDocument(sample_djvu),
|
||||
@@ -79,7 +79,7 @@ describe("Readerpaging module", function()
|
||||
tmp_readerui.paging:onScrollPanRel(-100)
|
||||
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 tmp_readerui = ReaderUI:new{
|
||||
document = DocumentRegistry:openDocument(sample_djvu),
|
||||
|
||||
@@ -12,6 +12,8 @@ describe("Readertoc module", function()
|
||||
readerui = ReaderUI:new{
|
||||
document = DocumentRegistry:openDocument(sample_epub),
|
||||
}
|
||||
-- reset book to first page
|
||||
readerui.rolling:onGotoPage(0)
|
||||
toc = readerui.toc
|
||||
end)
|
||||
|
||||
|
||||
@@ -172,6 +172,7 @@ describe("UIManager spec", function()
|
||||
assert.truthy(old_reset_timer)
|
||||
G_reader_settings:saveSetting("auto_suspend_timeout_seconds", 3600)
|
||||
|
||||
UIManager:run()
|
||||
UIManager:quit()
|
||||
-- should skip on non-kobo devices
|
||||
UIManager:_initAutoSuspend()
|
||||
|
||||
Reference in New Issue
Block a user