diff --git a/frontend/device/generic/device.lua b/frontend/device/generic/device.lua index 727ce8cf9..f1acd76a9 100644 --- a/frontend/device/generic/device.lua +++ b/frontend/device/generic/device.lua @@ -9,6 +9,7 @@ local Device = { screen_saver_mode = false, charging_mode = false, survive_screen_saver = false, + is_cover_closed = false, model = nil, powerd = nil, screen = nil, @@ -113,35 +114,44 @@ function Device:outofScreenSaver() self.screen_saver_mode = false end +function Device:scheduleSuspendIfNeeded() + local UIManager = require("ui/uimanager") + if not UIManager:hasScheduled(self.suspend) then + UIManager:nextTick(self.suspend) + end +end + -- ONLY used for Kobo and PocketBook devices function Device:onPowerEvent(ev) if self.screen_saver_mode then if ev == "Power" or ev == "Resume" then - DEBUG("Resuming...") - require("ui/uimanager"):unschedule(self.suspend) - local network_manager = require("ui/network/manager") - if network_manager.wifi_was_on and G_reader_settings:nilOrTrue("auto_restore_wifi") then - network_manager.restoreWifiAsync() - end - self:resume() - require("ui/screensaver"):close() - -- restore to previous rotation mode - self.screen:setRotationMode(self.orig_rotation_mode) - if self:needsScreenRefreshAfterResume() then - self.screen:refreshFull() + if self.is_cover_closed then + -- don't let power key press wake up device when the cover is in closed state + self:scheduleSuspendIfNeeded() + else + DEBUG("Resuming...") + require("ui/uimanager"):unschedule(self.suspend) + local network_manager = require("ui/network/manager") + if network_manager.wifi_was_on and G_reader_settings:nilOrTrue("auto_restore_wifi") then + network_manager.restoreWifiAsync() + end + self:resume() + require("ui/screensaver"):close() + -- restore to previous rotation mode + self.screen:setRotationMode(self.orig_rotation_mode) + if self:needsScreenRefreshAfterResume() then + self.screen:refreshFull() + end + self.screen_saver_mode = false + self.powerd:refreshCapacity() + self.powerd:afterResume() end - self.screen_saver_mode = false - self.powerd:refreshCapacity() - self.powerd:afterResume() elseif ev == "Suspend" then -- Already in screen saver mode, no need to update UI/state before -- suspending the hardware. This usually happens when sleep cover -- is closed after the device was sent to suspend state. DEBUG("Already in screen saver mode, suspending...") - local UIManager = require("ui/uimanager") - if not UIManager:hasScheduled(self.suspend) then - UIManager:nextTick(self.suspend) - end + self:scheduleSuspendIfNeeded() end -- else we we not in screensaver mode elseif ev == "Power" or ev == "Suspend" then diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index 4a79a0d61..963c3f715 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -87,8 +87,14 @@ function UIManager:init() end end if not G_reader_settings:readSetting("ignore_power_sleepcover") then - self.event_handlers["SleepCoverClosed"] = self.event_handlers["Suspend"] - self.event_handlers["SleepCoverOpened"] = self.event_handlers["Resume"] + self.event_handlers["SleepCoverClosed"] = function() + Device.is_cover_closed = true + self.event_handlers["Suspend"]() + end + self.event_handlers["SleepCoverOpened"] = function() + Device.is_cover_closed = false + self.event_handlers["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