mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
Make the powered off state customizable
This changes the behavior of the powered off transition phase for the
Kobo devices: instead of displaying a confirmation dialog, a screensaver
is used after a 2 seconds press delay.
Users can specify separate directories/files/messages for the powered
off and sleeping states through the `path` and `message` attributes of
the `{poweroff,suspend}_screensaver` settings.
Fixes #2327 and closes #2306.
This commit is contained in:
committed by
Qingping Hou
parent
2599c39d42
commit
64bc5cd63c
@@ -1,5 +1,6 @@
|
||||
local Event = require("ui/event")
|
||||
local DEBUG = require("dbg")
|
||||
local _ = require("gettext")
|
||||
|
||||
local function yes() return true end
|
||||
local function no() return false end
|
||||
@@ -137,7 +138,7 @@ function Device:onPowerEvent(ev)
|
||||
-- always suspend in portrait mode
|
||||
self.orig_rotation_mode = self.screen:getRotationMode()
|
||||
self.screen:setRotationMode(0)
|
||||
require("ui/screensaver"):show()
|
||||
require("ui/screensaver"):show("suspend", _("Sleeping"))
|
||||
self.screen:refreshFull()
|
||||
self.screen_saver_mode = true
|
||||
UIManager:scheduleIn(self.suspend_wait_timeout, self.suspend)
|
||||
|
||||
@@ -4,7 +4,6 @@ local Device = require("device")
|
||||
local Screen = Device.screen
|
||||
local DocSettings = require("docsettings")
|
||||
local DEBUG = require("dbg")
|
||||
local _ = require("gettext")
|
||||
|
||||
local Screensaver = {
|
||||
}
|
||||
@@ -88,56 +87,60 @@ function Screensaver:getCoverImage(file)
|
||||
end
|
||||
end
|
||||
|
||||
function Screensaver:show()
|
||||
function Screensaver:show(kind, default_msg)
|
||||
DEBUG("show screensaver")
|
||||
local InfoMessage = require("ui/widget/infomessage")
|
||||
local screensaver_settings = G_reader_settings:readSetting(kind .. "_screensaver") or {}
|
||||
-- first check book cover image, on by default
|
||||
local screen_saver_last_book =
|
||||
local screensaver_last_book =
|
||||
G_reader_settings:readSetting("use_lastfile_as_screensaver")
|
||||
if screen_saver_last_book == nil or screen_saver_last_book then
|
||||
if screensaver_last_book == nil or screensaver_last_book then
|
||||
local lastfile = G_reader_settings:readSetting("lastfile")
|
||||
if lastfile then
|
||||
local doc_settings = DocSettings:open(lastfile)
|
||||
local exclude = doc_settings:readSetting("exclude_screensaver")
|
||||
if not exclude then
|
||||
self.suspend_msg = self:getCoverImage(lastfile)
|
||||
self.left_msg = self:getCoverImage(lastfile)
|
||||
end
|
||||
end
|
||||
end
|
||||
-- then screensaver directory or file image
|
||||
if not self.suspend_msg then
|
||||
-- FIXME: rename this config to screen_saver_path
|
||||
local screen_saver_folder =
|
||||
if not self.left_msg then
|
||||
-- FIXME: rename screensaver_folder to screensaver_path
|
||||
local screensaver_path = screensaver_settings.path or
|
||||
G_reader_settings:readSetting("screensaver_folder")
|
||||
if screen_saver_folder == nil
|
||||
if screensaver_path == nil
|
||||
and Device.internal_storage_mount_point ~= nil then
|
||||
screen_saver_folder =
|
||||
screensaver_path =
|
||||
Device.internal_storage_mount_point .. "screensaver"
|
||||
end
|
||||
if screen_saver_folder then
|
||||
local file = screen_saver_folder
|
||||
if lfs.attributes(file, "mode") == "directory" then
|
||||
self.suspend_msg = getRandomImage(file)
|
||||
else
|
||||
self.suspend_msg = createWidgetFromFile(file)
|
||||
if screensaver_path then
|
||||
local mode = lfs.attributes(screensaver_path, "mode")
|
||||
if mode ~= nil then
|
||||
if mode == "directory" then
|
||||
self.left_msg = getRandomImage(screensaver_path)
|
||||
else
|
||||
self.left_msg = createWidgetFromFile(screensaver_path)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
-- fallback to suspended message
|
||||
if not self.suspend_msg then
|
||||
self.suspend_msg = InfoMessage:new{ text = _("Suspended") }
|
||||
UIManager:show(self.suspend_msg)
|
||||
-- fallback to message box
|
||||
if not self.left_msg then
|
||||
local msg = screensaver_settings.message or default_msg
|
||||
self.left_msg = InfoMessage:new{ text = msg }
|
||||
UIManager:show(self.left_msg)
|
||||
else
|
||||
-- refresh whole screen for other types
|
||||
UIManager:show(self.suspend_msg, "full")
|
||||
UIManager:show(self.left_msg, "full")
|
||||
end
|
||||
end
|
||||
|
||||
function Screensaver:close()
|
||||
DEBUG("close screensaver")
|
||||
if self.suspend_msg then
|
||||
UIManager:close(self.suspend_msg)
|
||||
self.suspend_msg = nil
|
||||
if self.left_msg then
|
||||
UIManager:close(self.left_msg)
|
||||
self.left_msg = nil
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ local UIManager = {
|
||||
_zeromqs = {},
|
||||
_refresh_stack = {},
|
||||
_refresh_func_stack = {},
|
||||
_power_ev_handled = false,
|
||||
_entered_poweroff_stage = false,
|
||||
}
|
||||
|
||||
function UIManager:init()
|
||||
@@ -42,6 +42,16 @@ function UIManager:init()
|
||||
Device:onPowerEvent(input_event)
|
||||
end,
|
||||
}
|
||||
self.poweroff_action = function()
|
||||
self._entered_poweroff_stage = true;
|
||||
Screen:setRotationMode(0)
|
||||
require("ui/screensaver"):show("poweroff", _("Powered off"))
|
||||
Screen:refreshFull()
|
||||
UIManager:nextTick(function()
|
||||
self:broadcastEvent(Event:new("Close"))
|
||||
Device:powerOff()
|
||||
end)
|
||||
end
|
||||
if Device:isKobo() then
|
||||
-- We do not want auto suspend procedure to waste battery during
|
||||
-- suspend. So let's unschedule it when suspending, and restart it after
|
||||
@@ -57,33 +67,12 @@ function UIManager:init()
|
||||
self:_startAutoSuspend()
|
||||
end
|
||||
self.event_handlers["PowerPress"] = function()
|
||||
self._power_ev_handled = false
|
||||
local showPowerOffDialog = function()
|
||||
if self._power_ev_handled then return end
|
||||
self._power_ev_handled = true
|
||||
local ConfirmBox = require("ui/widget/confirmbox")
|
||||
UIManager:show(ConfirmBox:new{
|
||||
text = _("Power off?"),
|
||||
ok_callback = function()
|
||||
local InfoMessage = require("ui/widget/infomessage")
|
||||
|
||||
UIManager:show(InfoMessage:new{
|
||||
text = _("Powered off."),
|
||||
})
|
||||
-- The message can fail to render if this is executed directly
|
||||
UIManager:scheduleIn(0.1, function()
|
||||
self:broadcastEvent(Event:new("Close"))
|
||||
Device:powerOff()
|
||||
end)
|
||||
end,
|
||||
})
|
||||
end
|
||||
UIManager:scheduleIn(3, showPowerOffDialog)
|
||||
UIManager:scheduleIn(2, self.poweroff_action)
|
||||
end
|
||||
self.event_handlers["PowerRelease"] = function()
|
||||
if not self._power_ev_handled then
|
||||
self._power_ev_handled = true
|
||||
self.event_handlers["Suspend"]()
|
||||
if not self._entered_poweroff_stage then
|
||||
UIManager:unschedule(self.poweroff_action)
|
||||
self.event_handlers["Suspend"]()
|
||||
end
|
||||
end
|
||||
if not G_reader_settings:readSetting("ignore_power_sleepcover") then
|
||||
|
||||
Reference in New Issue
Block a user