From 6d578b26f5f6d85a788a08fcb0cdfdd3136a0a89 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Sun, 24 Jul 2016 16:47:10 -0700 Subject: [PATCH 01/13] minor: use io.write instead of print for dbg module --- frontend/dbg.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/dbg.lua b/frontend/dbg.lua index 2b1836742..4d8f4cd36 100644 --- a/frontend/dbg.lua +++ b/frontend/dbg.lua @@ -21,7 +21,7 @@ local function LvDEBUG(lv, ...) if isAndroid then android.LOGI("#"..line) else - print(string.format("# %s %s", os.date("%x-%X"), line)) + io.stdout:write(string.format("# %s %s\n", os.date("%x-%X"), line)) io.stdout:flush() end end From c619de324e78a221bfd3d179329238f05832f12b Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Sun, 11 Sep 2016 21:47:24 -0700 Subject: [PATCH 02/13] chore: more luacheck fixes --- .ci/script.sh | 2 +- frontend/apps/reader/modules/readerpaging.lua | 6 ++---- frontend/device/gesturedetector.lua | 3 +-- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/.ci/script.sh b/.ci/script.sh index 2c1bfc48c..d0bb499e5 100755 --- a/.ci/script.sh +++ b/.ci/script.sh @@ -8,4 +8,4 @@ make all make testfront set +o pipefail luajit $(which luacheck) --no-color -q frontend | tee ./luacheck.out -test $(grep Total ./luacheck.out | awk '{print $2}') -le 19 +test $(grep Total ./luacheck.out | awk '{print $2}') -le 17 diff --git a/frontend/apps/reader/modules/readerpaging.lua b/frontend/apps/reader/modules/readerpaging.lua index e1c6da5a7..69931be91 100644 --- a/frontend/apps/reader/modules/readerpaging.lua +++ b/frontend/apps/reader/modules/readerpaging.lua @@ -707,15 +707,13 @@ function ReaderPaging:onGotoPageRel(diff) local new_va = self.visible_area:copy() local x_pan_off, y_pan_off = 0, 0 - if self.zoom_mode == "free" then - -- do nothing in free zoom mode - elseif self.zoom_mode:find("width") then + if self.zoom_mode:find("width") then y_pan_off = self.visible_area.h * diff elseif self.zoom_mode:find("height") then -- negative x panning if writing direction is right to left local direction = self.ui.document.configurable.writing_direction x_pan_off = self.visible_area.w * diff * (direction == 1 and -1 or 1) - else + elseif self.zoom_mode ~= "free" then -- do nothing in "free" zoom mode -- must be fit content or page zoom mode if self.visible_area.w == self.page_area.w then y_pan_off = self.visible_area.h * diff diff --git a/frontend/device/gesturedetector.lua b/frontend/device/gesturedetector.lua index 3b5fb0147..a99273ed5 100644 --- a/frontend/device/gesturedetector.lua +++ b/frontend/device/gesturedetector.lua @@ -160,8 +160,7 @@ function GestureDetector:getPath(slot) local y_diff = self.last_tevs[slot].y - self.first_tevs[slot].y local direction = nil local distance = math.sqrt(x_diff*x_diff + y_diff*y_diff) - if x_diff == 0 and y_diff == 0 then - else + if x_diff ~= 0 or y_diff ~= 0 then local v_direction = y_diff < 0 and "north" or "south" local h_direction = x_diff < 0 and "west" or "east" if math.abs(y_diff) > 0.577*math.abs(x_diff) From ebc7055b43cc52a9c8d8e8ea7d6368297c1d3022 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Sun, 11 Sep 2016 21:41:56 -0700 Subject: [PATCH 03/13] chore: move kobo specific code into kobo/device.lua --- frontend/device/kobo/device.lua | 32 ++++++++++++++++++++++++++++++++ frontend/ui/uimanager.lua | 31 ------------------------------- kodev | 1 + spec/unit/device_spec.lua | 19 +++++++++++++------ 4 files changed, 46 insertions(+), 37 deletions(-) diff --git a/frontend/device/kobo/device.lua b/frontend/device/kobo/device.lua index 09db1d7da..533e3e8ce 100644 --- a/frontend/device/kobo/device.lua +++ b/frontend/device/kobo/device.lua @@ -156,6 +156,38 @@ function Kobo:init() self:initEventAdjustHooks() end end + + -- TODO: get rid of KOBO_LIGHT_ON_START + local kobo_light_on_start = tonumber(KOBO_LIGHT_ON_START) + if kobo_light_on_start then + local new_intensity + local is_frontlight_on + if kobo_light_on_start > 0 then + new_intensity = math.min(kobo_light_on_start, 100) + is_frontlight_on = true + elseif kobo_light_on_start == 0 then + is_frontlight_on = false + elseif kobo_light_on_start == -2 then + local NickelConf = require("device/kobo/nickel_conf") + new_intensity = NickelConf.frontLightLevel.get() + is_frontlight_on = NickelConf.frontLightState:get() + if is_frontlight_on == nil then + -- this device does not support frontlight toggle, + -- we set the value based on frontlight intensity. + if new_intensity > 0 then + is_frontlight_on = true + else + is_frontlight_on = false + end + end + end + -- Since this is kobo-specific, we save all values in settings here + -- and let the code (reader.lua) pick it up later during bootstrap. + if new_intensity then + G_reader_settings:saveSetting("frontlight_intensity", new_intensity) + end + G_reader_settings:saveSetting("is_frontlight_on", is_frontlight_on) + end end function Kobo:initNetworkManager(NetworkMgr) diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index abe985a7b..79dd545c8 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -99,37 +99,6 @@ function UIManager:init() self:sendEvent(input_event) end end - local kobo_light_on_start = tonumber(KOBO_LIGHT_ON_START) - if kobo_light_on_start then - local new_intensity - local is_frontlight_on - if kobo_light_on_start > 0 then - new_intensity = math.min(kobo_light_on_start, 100) - is_frontlight_on = true - elseif kobo_light_on_start == 0 then - is_frontlight_on = false - elseif kobo_light_on_start == -2 then - local NickelConf = require("device/kobo/nickel_conf") - new_intensity = NickelConf.frontLightLevel.get() - is_frontlight_on = NickelConf.frontLightState:get() - if is_frontlight_on == nil then - -- this device does not support frontlight toggle, - -- we set the value based on frontlight intensity. - if new_intensity > 0 then - is_frontlight_on = true - else - is_frontlight_on = false - end - end - end - -- Since this kobo-specific, we save all values in settings here - -- and let the code (reader.lua) pick it up later during bootstrap. - if new_intensity then - G_reader_settings:saveSetting("frontlight_intensity", - new_intensity) - end - G_reader_settings:saveSetting("is_frontlight_on", is_frontlight_on) - end elseif Device:isKindle() then self.event_handlers["IntoSS"] = function() Device:intoScreenSaver() diff --git a/kodev b/kodev index 4eae9c5af..e39ac0387 100755 --- a/kodev +++ b/kodev @@ -329,6 +329,7 @@ OPTIONS: test_path="${test_path}/$2" fi + echo "Runing tests in" ${test_path} busted --lua="./luajit" ${opts} \ --no-auto-insulate \ --lazy \ diff --git a/spec/unit/device_spec.lua b/spec/unit/device_spec.lua index 424d1ed03..66e376a07 100644 --- a/spec/unit/device_spec.lua +++ b/spec/unit/device_spec.lua @@ -41,8 +41,21 @@ describe("device module", function() 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() @@ -51,7 +64,6 @@ describe("device module", function() kobo_dev:init() assert.is.same("Kobo_dahlia", kobo_dev.model) - end) it("should setup eventAdjustHooks properly for input in trilogy", function() @@ -149,10 +161,7 @@ describe("device module", function() local sample_pdf = "spec/front/unit/data/tall.pdf" local ReaderUI = require("apps/reader/readerui") local Device = require("device") - local NickelConf = require("device/kobo/nickel_conf") - stub(NickelConf.frontLightLevel, "get") - stub(NickelConf.frontLightState, "get") NickelConf.frontLightLevel.get.returns(1) NickelConf.frontLightState.get.returns(0) @@ -175,8 +184,6 @@ describe("device module", function() Device.suspend:revert() Device.powerd.beforeSuspend:revert() Device.isKobo:revert() - NickelConf.frontLightLevel.get:revert() - NickelConf.frontLightState.get:revert() readerui.onFlushSettings:revert() UIManager._startAutoSuspend = nil UIManager._stopAutoSuspend = nil From 22964a77a0f4f702c8b6b7ed39868ab126a9097b Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Sat, 10 Sep 2016 17:33:21 -0700 Subject: [PATCH 04/13] kobo(fix): always put device to suspend state when cover is closed --- frontend/device/generic/device.lua | 53 ++++++++++++++++++------------ frontend/ui/uimanager.lua | 10 ++++++ 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/frontend/device/generic/device.lua b/frontend/device/generic/device.lua index da92b002a..727ce8cf9 100644 --- a/frontend/device/generic/device.lua +++ b/frontend/device/generic/device.lua @@ -115,10 +115,38 @@ end -- ONLY used for Kobo and PocketBook devices function Device:onPowerEvent(ev) - local Screensaver = require("ui/screensaver") - local network_manager = require("ui/network/manager") - if (ev == "Power" or ev == "Suspend") and not self.screen_saver_mode then + 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() + 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 + end + -- else we we not in screensaver mode + elseif ev == "Power" or ev == "Suspend" then self.powerd:beforeSuspend() + local network_manager = require("ui/network/manager") if network_manager.wifi_was_on then network_manager:releaseIP() network_manager:turnOffWifi() @@ -131,27 +159,10 @@ function Device:onPowerEvent(ev) -- always suspend in portrait mode self.orig_rotation_mode = self.screen:getRotationMode() self.screen:setRotationMode(0) - Screensaver:show() + require("ui/screensaver"):show() self.screen:refreshFull() self.screen_saver_mode = true UIManager:scheduleIn(10, self.suspend) - elseif (ev == "Power" or ev == "Resume") and self.screen_saver_mode then - DEBUG("Resuming...") - local UIManager = require("ui/uimanager") - UIManager:unschedule(self.suspend) - if network_manager.wifi_was_on and G_reader_settings:nilOrTrue("auto_restore_wifi") then - network_manager.restoreWifiAsync() - end - self:resume() - 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 end diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index 79dd545c8..d789ce578 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -259,6 +259,16 @@ end dbg:guard(UIManager, 'unschedule', function(self, action) assert(action ~= nil) end) +-- Check to see if a task is already scheduled +function UIManager:hasScheduled(action) + for i = #self._task_queue, 1, -1 do + if self._task_queue[i].action == action then + return true + end + end + return false +end + --[[ register a widget to be repainted and enqueue a refresh From 93b3262db7ad832bdefde80602a07f3aa64c81e1 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Sun, 11 Sep 2016 21:38:06 -0700 Subject: [PATCH 05/13] kobo(fix): make sure sleep cover is not interrupting sleeping when ignore_power_sleepcover is set --- frontend/device/input.lua | 6 +++--- frontend/device/kobo/device.lua | 5 +---- frontend/ui/uimanager.lua | 13 +++++++++++++ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/frontend/device/input.lua b/frontend/device/input.lua index de8dab7b4..fd08282bb 100644 --- a/frontend/device/input.lua +++ b/frontend/device/input.lua @@ -275,12 +275,12 @@ function Input:handleKeyBoardEv(ev) return keycode end - -- Kobo sleep + -- Kobo sleep cover if keycode == "Power_SleepCover" then if ev.value == EVENT_VALUE_KEY_PRESS then - return "Suspend" + return "SleepCoverClosed" else - return "Resume" + return "SleepCoverOpened" end end diff --git a/frontend/device/kobo/device.lua b/frontend/device/kobo/device.lua index 533e3e8ce..1926ff10a 100644 --- a/frontend/device/kobo/device.lua +++ b/frontend/device/kobo/device.lua @@ -118,16 +118,13 @@ function Kobo:init() self.input = require("device/input"):new{ device = self, event_map = { + [59] = "Power_SleepCover", [90] = "Light", [102] = "Home", [116] = "Power", } } - if not G_reader_settings:readSetting("ignore_power_sleepcover") then - self.input.event_map[59] = "Power_SleepCover" - end - Generic.init(self) self.input.open("/dev/input/event0") -- Light button and sleep slider diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index d789ce578..4a79a0d61 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -86,6 +86,19 @@ function UIManager:init() self.event_handlers["Suspend"]() 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"] + 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"]() + end + end + self.event_handlers["SleepCoverOpened"] = self.event_handlers["SleepCoverClosed"] + end self.event_handlers["Light"] = function() Device:getPowerDevice():toggleFrontlight() end From 4036e2c460f6c58191f3dea30b2ba6b99a3b487a Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Tue, 13 Sep 2016 22:16:31 -0700 Subject: [PATCH 06/13] kobo(fix): do not wake up device when cover is closed --- frontend/device/generic/device.lua | 48 ++++++++++++++++++------------ frontend/ui/uimanager.lua | 10 +++++-- 2 files changed, 37 insertions(+), 21 deletions(-) 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() + 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: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() 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 From 71afe3606ca777e4e01fcb3c9a5323cf08bdfc0c Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Mon, 19 Sep 2016 01:16:41 -0700 Subject: [PATCH 07/13] kobo(fix): set suspend wait timeout to 15 seconds Otherwise, suspend might fail and the device will ended up in a false sleep state and drain the battery. --- base | 2 +- frontend/device/generic/device.lua | 16 +++++++++------- frontend/ui/uimanager.lua | 10 ---------- 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/base b/base index 3e9b63f5c..2287aa8e7 160000 --- a/base +++ b/base @@ -1 +1 @@ -Subproject commit 3e9b63f5cafc12335e18ea8ed313aa01c004b745 +Subproject commit 2287aa8e75b456d6e1a69d6cb16a5b372e24f248 diff --git a/frontend/device/generic/device.lua b/frontend/device/generic/device.lua index f1acd76a9..4663a9519 100644 --- a/frontend/device/generic/device.lua +++ b/frontend/device/generic/device.lua @@ -14,6 +14,9 @@ local Device = { powerd = nil, screen = nil, input = nil, + -- For Kobo, wait at least 15 seconds before calling suspend script. Otherwise, suspend might + -- fail and the battery will be drained while we are in screensaver mode + suspend_wait_timeout = 15, -- hardware feature tests: (these are functions!) hasKeyboard = no, @@ -114,11 +117,10 @@ function Device:outofScreenSaver() self.screen_saver_mode = false end -function Device:scheduleSuspendIfNeeded() +function Device:rescheduleSuspend() local UIManager = require("ui/uimanager") - if not UIManager:hasScheduled(self.suspend) then - UIManager:nextTick(self.suspend) - end + UIManager:unschedule(self.suspend) + UIManager:scheduleIn(self.suspend_wait_timeout, self.suspend) end -- ONLY used for Kobo and PocketBook devices @@ -127,7 +129,7 @@ function Device:onPowerEvent(ev) if ev == "Power" or ev == "Resume" then if self.is_cover_closed then -- don't let power key press wake up device when the cover is in closed state - self:scheduleSuspendIfNeeded() + self:rescheduleSuspend() else DEBUG("Resuming...") require("ui/uimanager"):unschedule(self.suspend) @@ -151,7 +153,7 @@ function Device:onPowerEvent(ev) -- 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...") - self:scheduleSuspendIfNeeded() + self:rescheduleSuspend() end -- else we we not in screensaver mode elseif ev == "Power" or ev == "Suspend" then @@ -172,7 +174,7 @@ function Device:onPowerEvent(ev) require("ui/screensaver"):show() self.screen:refreshFull() self.screen_saver_mode = true - UIManager:scheduleIn(10, self.suspend) + UIManager:scheduleIn(self.suspend_wait_timeout, self.suspend) end end diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index 963c3f715..baaea7dd0 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -278,16 +278,6 @@ end dbg:guard(UIManager, 'unschedule', function(self, action) assert(action ~= nil) end) --- Check to see if a task is already scheduled -function UIManager:hasScheduled(action) - for i = #self._task_queue, 1, -1 do - if self._task_queue[i].action == action then - return true - end - end - return false -end - --[[ register a widget to be repainted and enqueue a refresh From ca934947836105e204071ed94f5dcdace2c69e72 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Mon, 19 Sep 2016 10:04:03 -0700 Subject: [PATCH 08/13] base: pick up djvu TOC page number fix --- base | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base b/base index 2287aa8e7..9f0a70e9e 160000 --- a/base +++ b/base @@ -1 +1 @@ -Subproject commit 2287aa8e75b456d6e1a69d6cb16a5b372e24f248 +Subproject commit 9f0a70e9ea529960c6e6b6e5935b681ef02cf166 From 902403bf0a687e3beb37b73b238535e8263ef85b Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Tue, 20 Sep 2016 00:14:14 -0700 Subject: [PATCH 09/13] kobo(fix): prevent usb plug events from interrupting sleep --- frontend/device/input.lua | 25 ++++++++++++------------- frontend/device/kobo/device.lua | 23 ++++++++++++++++++++--- frontend/ui/uimanager.lua | 6 ++++++ 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/frontend/device/input.lua b/frontend/device/input.lua index fd08282bb..b5b3979ec 100644 --- a/frontend/device/input.lua +++ b/frontend/device/input.lua @@ -265,6 +265,10 @@ function Input:handleKeyBoardEv(ev) return end + if type(keycode) == "function" then + return keycode(ev) + end + -- take device rotation into account if self.rotation_map[self.device.screen:getRotationMode()][keycode] then keycode = self.rotation_map[self.device.screen:getRotationMode()][keycode] @@ -275,15 +279,6 @@ function Input:handleKeyBoardEv(ev) return keycode end - -- Kobo sleep cover - if keycode == "Power_SleepCover" then - if ev.value == EVENT_VALUE_KEY_PRESS then - return "SleepCoverClosed" - else - return "SleepCoverOpened" - end - end - if keycode == "Power" then -- Kobo generates Power keycode only, we need to decide whether it's -- power-on or power-off ourselves. @@ -300,10 +295,6 @@ function Input:handleKeyBoardEv(ev) end end - if ev.value == EVENT_VALUE_KEY_RELEASE and keycode == "Light" then - return keycode - end - -- handle modifier keys if self.modifiers[keycode] ~= nil then if ev.value == EVENT_VALUE_KEY_PRESS then @@ -538,6 +529,14 @@ function Input:cleanAbsxy() self:setCurrentMtSlot("abs_y", nil) end +function Input:isEvKeyPress(ev) + return ev.value == EVENT_VALUE_KEY_PRESS +end + +function Input:isEvKeyRelease(ev) + return ev.value == EVENT_VALUE_KEY_RELEASE +end + -- main event handling: diff --git a/frontend/device/kobo/device.lua b/frontend/device/kobo/device.lua index 1926ff10a..37f7a2a56 100644 --- a/frontend/device/kobo/device.lua +++ b/frontend/device/kobo/device.lua @@ -118,8 +118,25 @@ function Kobo:init() self.input = require("device/input"):new{ device = self, event_map = { - [59] = "Power_SleepCover", - [90] = "Light", + [59] = function(ev) + if self.input:isEvKeyPress(ev) then + return "SleepCoverClosed" + else + return "SleepCoverOpened" + end + end, + [90] = function(ev) + if self.input:isEvKeyRelease(ev) then + return "Light" + end + end, + [330] = function(ev) + if self.input:isEvKeyPress(ev) then + return "USBPlugIn" + else + return "USBPlugOut" + end + end, [102] = "Home", [116] = "Power", } @@ -338,7 +355,7 @@ elseif codename == "alyssum" then elseif codename == "pika" then return KoboPika elseif codename == "daylight" then - return KoboDaylight + return KoboDaylight else error("unrecognized Kobo model "..codename) end diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index baaea7dd0..9fbac1d61 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -108,6 +108,12 @@ function UIManager:init() self.event_handlers["Light"] = function() Device:getPowerDevice():toggleFrontlight() end + self.event_handlers["USBPlugIn"] = function() + if Device.screen_saver_mode then + self.event_handlers["Suspend"]() + end + end + self.event_handlers["USBPlugOut"] = self.event_handlers["USBPlugIn"] self.event_handlers["__default__"] = function(input_event) if Device.screen_saver_mode then -- Suspension in Kobo can be interrupted by screen updates. We From ca21ab4be58889e7c214ed5ff4d991168ea78b20 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Wed, 21 Sep 2016 23:52:40 -0700 Subject: [PATCH 10/13] fix(defaults): type casting for user input --- .../apps/filemanager/filemanagersetdefaults.lua | 9 +-------- frontend/ui/widget/inputdialog.lua | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/frontend/apps/filemanager/filemanagersetdefaults.lua b/frontend/apps/filemanager/filemanagersetdefaults.lua index fbd686f22..ef7672975 100644 --- a/frontend/apps/filemanager/filemanagersetdefaults.lua +++ b/frontend/apps/filemanager/filemanagersetdefaults.lua @@ -209,14 +209,7 @@ function SetDefaults:init() is_enter_default = true, enabled = true, callback = function() - local new_value = self.set_dialog:getInputText() - if setting_type == "boolean" then - if new_value == "true" then - new_value = true - else - new_value = false - end - end + local new_value = self.set_dialog:getInputValue() if _G[setting_name] ~= new_value then _G[setting_name] = new_value self.defaults_value[i] = new_value diff --git a/frontend/ui/widget/inputdialog.lua b/frontend/ui/widget/inputdialog.lua index 186097661..c5a637734 100644 --- a/frontend/ui/widget/inputdialog.lua +++ b/frontend/ui/widget/inputdialog.lua @@ -10,7 +10,7 @@ Example: title = _("Dialog title"), input = "default value", input_hint = "hint text", - input_type = "text", + input_type = "string", -- text_type = "password", buttons = { { @@ -26,7 +26,8 @@ Example: -- triggered after user press the enter key from keyboard is_enter_default = true, callback = function() - print('Got user input:', sample_input:getInputText()) + print('Got user input as raw text:', sample_input:getInputText()) + print('Got user input as value:', sample_input:getInputValue()) end, }, } @@ -177,6 +178,15 @@ function InputDialog:getInputText() return self._input_widget:getText() end +function InputDialog:getInputValue() + local text = self:getInputText() + if self.input_type == "number" then + return tonumber(text) + else + return text + end +end + function InputDialog:setInputText(text) self._input_widget:setText(text) end From 252100891fbcf6abf261e1a9dab672a2e90bafce Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 22 Sep 2016 00:10:40 -0700 Subject: [PATCH 11/13] fix(defaults): override defaults with persistent defaults for advanced setting menu --- .../apps/filemanager/filemanagersetdefaults.lua | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/frontend/apps/filemanager/filemanagersetdefaults.lua b/frontend/apps/filemanager/filemanagersetdefaults.lua index ef7672975..5b435bb01 100644 --- a/frontend/apps/filemanager/filemanagersetdefaults.lua +++ b/frontend/apps/filemanager/filemanagersetdefaults.lua @@ -15,7 +15,7 @@ local dump = require("dump") local defaults_path = DataStorage:getDataDir() .. "/defaults.lua" -local persistent_filename = DataStorage:getDataDir() .. "/defaults.persistent.lua" +local persistent_defaults_path = DataStorage:getDataDir() .. "/defaults.persistent.lua" local SetDefaults = InputContainer:new{ @@ -50,6 +50,14 @@ function SetDefaults:init() setfenv(load_defaults, defaults) load_defaults() + local file = io.open(persistent_defaults_path, "r") + if file ~= nil then + file:close() + load_defaults = loadfile(persistent_defaults_path) + setfenv(load_defaults, defaults) + load_defaults() + end + local i = 1 for n, v in util.orderedPairs(defaults) do self.defaults_name[i] = n @@ -271,10 +279,10 @@ end function SetDefaults:saveSettings() self.results = {} local persisted_defaults = {} - local file = io.open(persistent_filename, "r") + local file = io.open(persistent_defaults_path, "r") if file ~= nil then file:close() - local load_defaults = loadfile(persistent_filename) + local load_defaults = loadfile(persistent_defaults_path) setfenv(load_defaults, persisted_defaults) load_defaults() end @@ -314,7 +322,7 @@ function SetDefaults:saveSettings() end end - file = io.open(persistent_filename, "w") + file = io.open(persistent_defaults_path, "w") if file then file:write("-- For configuration changes that persists between updates\n") for k, v in pairs(persisted_defaults) do From d6c48b06f928defb301dee908059895c834d45ed Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 22 Sep 2016 00:36:09 -0700 Subject: [PATCH 12/13] chore: fix all luacheck issues --- .ci/script.sh | 4 +- .luacheckrc | 4 +- frontend/apps/filemanager/filemanagermenu.lua | 4 +- .../apps/filemanager/filemanagersearch.lua | 75 ++++++++++--------- .../filemanager/filemanagersetdefaults.lua | 13 ++-- 5 files changed, 53 insertions(+), 47 deletions(-) diff --git a/.ci/script.sh b/.ci/script.sh index d0bb499e5..d69256045 100755 --- a/.ci/script.sh +++ b/.ci/script.sh @@ -6,6 +6,4 @@ source "${CI_DIR}/common.sh" travis_retry make fetchthirdparty make all make testfront -set +o pipefail -luajit $(which luacheck) --no-color -q frontend | tee ./luacheck.out -test $(grep Total ./luacheck.out | awk '{print $2}') -le 17 +luajit $(which luacheck) --no-color -q frontend diff --git a/.luacheckrc b/.luacheckrc index bddf6fb5f..44bb008a9 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -78,14 +78,14 @@ read_globals = { "DDICT_FONT_SIZE", "FRONTLIGHT_SENSITIVITY_DECREASE", "DALPHA_SORT_CASE_INSENSITIVE", - "SEARCH_LIBRARY_PATH", - "SEARCH_LIBRARY_PATH2", "SEARCH_CASESENSITIVE", "SEARCH_AUTHORS", "SEARCH_TITLE", "SEARCH_TAGS", "SEARCH_SERIES", "SEARCH_PATH", + "SEARCH_LIBRARY_PATH", + "SEARCH_LIBRARY_PATH2", "KOBO_LIGHT_ON_START", "NETWORK_PROXY", "DUSE_TURBO_LIB", diff --git a/frontend/apps/filemanager/filemanagermenu.lua b/frontend/apps/filemanager/filemanagermenu.lua index 29998b823..e6025edfd 100644 --- a/frontend/apps/filemanager/filemanagermenu.lua +++ b/frontend/apps/filemanager/filemanagermenu.lua @@ -36,8 +36,8 @@ function FileManagerMenu:init() home = { icon = "resources/icons/appbar.home.png", callback = function() - if settings_changed then - settings_changed = false + 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() diff --git a/frontend/apps/filemanager/filemanagersearch.lua b/frontend/apps/filemanager/filemanagersearch.lua index 689643dce..6e763231f 100644 --- a/frontend/apps/filemanager/filemanagersearch.lua +++ b/frontend/apps/filemanager/filemanagersearch.lua @@ -12,6 +12,7 @@ local Font = require("ui/font") local DEBUG = require("dbg") local T = require("ffi/util").template local _ = require("gettext") +local SetDefaults = require("apps/filemanager/filemanagersetdefaults") local calibre = "metadata.calibre" local koreaderfile = "temp/metadata.koreader" @@ -75,11 +76,11 @@ function Search:getCalibre() if not self.metafile_1 then self.error = _("SEARCH_LIBRARY_PATH should be defined in DEFAULTS.LUA.") else - settings_changed = true + SetDefaults.settings_changed = true end else if string.sub(SEARCH_LIBRARY_PATH,string.len(SEARCH_LIBRARY_PATH)) ~= "/" then - SEARCH_LIBRARY_PATH = SEARCH_LIBRARY_PATH .. "/" + SEARCH_LIBRARY_PATH = SEARCH_LIBRARY_PATH .. "/" -- luacheck: ignore end if io.open(SEARCH_LIBRARY_PATH .. calibre,"r") == nil then if io.open(SEARCH_LIBRARY_PATH .. "." .. calibre,"r") == nil then @@ -98,7 +99,7 @@ function Search:getCalibre() elseif self.metafile_1 == nil then self.metafile_1 = findcalibre("/mnt") if self.metafile_1 then - settings_changed = true + SetDefaults.settings_changed = true end end end @@ -106,7 +107,7 @@ function Search:getCalibre() local dummy if string.sub(SEARCH_LIBRARY_PATH2,string.len(SEARCH_LIBRARY_PATH2)) ~= "/" then - SEARCH_LIBRARY_PATH2 = SEARCH_LIBRARY_PATH2 .. "/" + SEARCH_LIBRARY_PATH2 = SEARCH_LIBRARY_PATH2 .. "/" -- luacheck: ignore end if io.open(SEARCH_LIBRARY_PATH2 .. calibre,"r") == nil then if io.open(SEARCH_LIBRARY_PATH2 .. "." .. calibre,"r") ~= nil then @@ -152,7 +153,7 @@ function Search:ShowSearch() enabled = true, callback = function() self.search_value = self.search_dialog:getInputText() - if not settings_changed and self.search_value == dummy and self.lastsearch == "series" then + if not SetDefaults.settings_changed and self.search_value == dummy and self.lastsearch == "series" then self.use_previous_search_results = true else self.use_previous_search_results = false @@ -166,7 +167,7 @@ function Search:ShowSearch() enabled = true, callback = function() self.search_value = self.search_dialog:getInputText() - if not settings_changed and self.search_value == dummy and self.lastsearch == "tags" then + if not SetDefaults.settings_changed and self.search_value == dummy and self.lastsearch == "tags" then self.use_previous_search_results = true else self.use_previous_search_results = false @@ -190,7 +191,7 @@ function Search:ShowSearch() enabled = true, callback = function() self.search_value = self.search_dialog:getInputText() - if not settings_changed and self.search_value == dummy and self.lastsearch == "find" then + if not SetDefaults.settings_changed and self.search_value == dummy and self.lastsearch == "find" then self.use_previous_search_results = true else self.use_previous_search_results = false @@ -235,7 +236,6 @@ function Search:find(option) local line local i = 1 local upsearch - local dummy local firstrun -- removes leading and closing characters and converts hex-unicodes @@ -269,10 +269,10 @@ function Search:find(option) if s == self.authors then self.data[i][self.authors2] = self.data[i][self.authors2] .. " & " .. ReplaceHexChars(line,8,3) elseif s == self.tags then - local dummy = ReplaceHexChars(line,8,3) - self.data[i][self.tags2] = self.data[i][self.tags2] .. " & " .. dummy - self.data[i][self.tags3] = self.data[i][self.tags3] .. "\t" .. dummy - self.browse_tags[dummy] = (self.browse_tags[dummy] or 0) + 1 + local tags_line = ReplaceHexChars(line,8,3) + self.data[i][self.tags2] = self.data[i][self.tags2] .. " & " .. tags_line + self.data[i][self.tags3] = self.data[i][self.tags3] .. "\t" .. tags_line + self.browse_tags[tags_line] = (self.browse_tags[tags_line] or 0) + 1 end end end @@ -318,16 +318,24 @@ function Search:find(option) line = g:read() end - local dummy = "" - if option == "find" and SEARCH_AUTHORS then dummy = dummy .. self.data[i][self.authors] .. "\n" end - if option == "find" and SEARCH_TITLE then dummy = dummy .. self.data[i][self.title] .. "\n" end - if option == "find" and SEARCH_PATH then dummy = dummy .. self.data[i][self.path] .. "\n" end + local search_content = "" + if option == "find" and SEARCH_AUTHORS then + search_content = search_content .. self.data[i][self.authors] .. "\n" + end + if option == "find" and SEARCH_TITLE then + search_content = search_content .. self.data[i][self.title] .. "\n" + end + if option == "find" and SEARCH_PATH then + search_content = search_content .. self.data[i][self.path] .. "\n" + end if (option == "series" or SEARCH_SERIES) and self.data[i][self.series] ~= "-" then - dummy = dummy .. self.data[i][self.series] .. "\n" + search_content = search_content .. self.data[i][self.series] .. "\n" self.browse_series[self.data[i][self.series]] = (self.browse_series[self.data[i][self.series]] or 0) + 1 end - if option == "tags" or SEARCH_TAGS then dummy = dummy .. self.data[i][self.tags] .. "\n" end - if not SEARCH_CASESENSITIVE then dummy = string.upper(dummy) end + if option == "tags" or SEARCH_TAGS then + search_content = search_content .. self.data[i][self.tags] .. "\n" + end + if not SEARCH_CASESENSITIVE then search_content = string.upper(search_content) end for j in string.gmatch(self.data[i][self.tags3],"\t[^\t]+") do if j~="\t" then @@ -336,7 +344,7 @@ function Search:find(option) end if DocumentRegistry:getProvider(self.data[i][self.path]) then if upsearch ~= "" then - if string.find(dummy,upsearch,nil,true) then + if string.find(search_content,upsearch,nil,true) then i = i + 1 end else @@ -372,23 +380,23 @@ function Search:find(option) if line == " }, " or line == " }" then -- new calibre data set - dummy = "" - if option == "find" and SEARCH_AUTHORS then dummy = dummy .. self.data[i][self.authors] .. "\n" end - if option == "find" and SEARCH_TITLE then dummy = dummy .. self.data[i][self.title] .. "\n" end - if option == "find" and SEARCH_PATH then dummy = dummy .. self.data[i][self.path] .. "\n" end + local search_content = "" + if option == "find" and SEARCH_AUTHORS then search_content = search_content .. self.data[i][self.authors] .. "\n" end + if option == "find" and SEARCH_TITLE then search_content = search_content .. self.data[i][self.title] .. "\n" end + if option == "find" and SEARCH_PATH then search_content = search_content .. self.data[i][self.path] .. "\n" end if (option == "series" or SEARCH_SERIES) and self.data[i][self.series] ~= "-" then - dummy = dummy .. self.data[i][self.series] .. "\n" + search_content = search_content .. self.data[i][self.series] .. "\n" self.browse_series[self.data[i][self.series]] = (self.browse_series[self.data[i][self.series]] or 0) + 1 end - if option == "tags" or SEARCH_TAGS then dummy = dummy .. self.data[i][self.tags] .. "\n" end - if not SEARCH_CASESENSITIVE then dummy = string.upper(dummy) end + if option == "tags" or SEARCH_TAGS then search_content = search_content .. self.data[i][self.tags] .. "\n" end + if not SEARCH_CASESENSITIVE then search_content = string.upper(search_content) end for j = 1,9 do g:write(self.data[i][j] .. "\n") end if upsearch ~= "" then - if string.find(dummy,upsearch,nil,true) then + if string.find(search_content,upsearch,nil,true) then i = i + 1 end else @@ -464,8 +472,7 @@ function Search:find(option) self:browse(option,1) end else - dummy = _("No match for") .. " " .. self.search_value - UIManager:show(InfoMessage:new{text = dummy}) + UIManager:show(InfoMessage:new{text = T(_("No match for %1."), self.search_value)}) end end @@ -616,14 +623,14 @@ function Search:browse(option, run, chosen) local i = 1 while i <= self.count do if (option == "tags" and self.data[i][self.tags3]:find("\t" .. chosen .. "\t",nil,true)) or (option == "series" and chosen == self.data[i][self.series]) then - local dummy = _("Title: ") .. (self.data[i][self.title] or "-") .. "\n \n" .. + local entry = _("Title: ") .. (self.data[i][self.title] or "-") .. "\n \n" .. _("Author(s):") .. " " .. (self.data[i][self.authors2] or "-") .. "\n \n" .. _("Tags:") .. " " .. (self.data[i][self.tags2] or "-") .. "\n \n" .. _("Series:") .. " " .. (self.data[i][self.series] or "-") if self.data[i][self.series] ~= "-" then - dummy = dummy .. " (" .. tostring(self.data[i][self.series_index]):gsub(".0$","") .. ")" + entry = entry .. " (" .. tostring(self.data[i][self.series_index]):gsub(".0$","") .. ")" end - dummy = dummy .. "\n \n" .. _("Path: ") + entry = entry .. "\n \n" .. _("Path: ") local book = self.data[i][self.path] local text if option == "series" then @@ -637,7 +644,7 @@ function Search:browse(option, run, chosen) end table.insert(self.results, { text = text, - info = dummy, + info = entry, notchecked = true, path = self.data[i][self.path], callback = function() diff --git a/frontend/apps/filemanager/filemanagersetdefaults.lua b/frontend/apps/filemanager/filemanagersetdefaults.lua index 5b435bb01..6d861321c 100644 --- a/frontend/apps/filemanager/filemanagersetdefaults.lua +++ b/frontend/apps/filemanager/filemanagersetdefaults.lua @@ -24,7 +24,8 @@ local SetDefaults = InputContainer:new{ results = {}, defaults_menu = {}, initialized = false, - changed = {} + changed = {}, + settings_changed = false, } function SetDefaults:ConfirmEdit() @@ -118,7 +119,7 @@ function SetDefaults:init() callback = function() self.defaults_value[i] = true _G[setting_name] = true - settings_changed = true + self.settings_changed = true self.changed[i] = true self.results[i].text = self:build_setting(i) self:close() @@ -132,7 +133,7 @@ function SetDefaults:init() callback = function() self.defaults_value[i] = false _G[setting_name] = false - settings_changed = true + self.settings_changed = true self.changed[i] = true self.results[i].text = self:build_setting(i) self.defaults_menu:swithItemTable("Defaults", self.results, i) @@ -180,7 +181,7 @@ function SetDefaults:init() _G[setting_name] = new_table self.defaults_value[i] = _G[setting_name] - settings_changed = true + self.settings_changed = true self.changed[i] = true self.results[i].text = self:build_setting(i) @@ -221,7 +222,7 @@ function SetDefaults:init() if _G[setting_name] ~= new_value then _G[setting_name] = new_value self.defaults_value[i] = new_value - settings_changed = true + self.settings_changed = true self.changed[i] = true self.results[i].text = self:build_setting(i) end @@ -338,7 +339,7 @@ function SetDefaults:saveSettings() text = _("Default settings saved."), }) end - settings_changed = false + self.settings_changed = false end return SetDefaults From 3767c5857493819318f9d09ae4f06068c6146623 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 22 Sep 2016 01:16:52 -0700 Subject: [PATCH 13/13] fix typo --- defaults.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/defaults.lua b/defaults.lua index e9b85445f..2ee54f775 100644 --- a/defaults.lua +++ b/defaults.lua @@ -136,7 +136,7 @@ DMINIBAR_HEIGHT = 7 -- Should be smaller than DMINIBAR_CONTAINER_HEI DMINIBAR_CONTAINER_HEIGHT = 14 -- Larger means more padding at the bottom, at the risk of eating into the last line DMINIBAR_FONT_SIZE = 14 --- change this to any numerical value if you want to antomatically save settings when turning pages +-- change this to any numerical value if you want to automatically save settings when turning pages DAUTO_SAVE_PAGING_COUNT = nil -- dictionary font size