From 3f691bab93e9891b8153dcd2786389749ba7a300 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 1 Feb 2015 17:24:50 +0800 Subject: [PATCH 01/12] add stable OTA channel This should fix #1353. --- frontend/ui/otamanager.lua | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/frontend/ui/otamanager.lua b/frontend/ui/otamanager.lua index 241bddb85..d8874e270 100644 --- a/frontend/ui/otamanager.lua +++ b/frontend/ui/otamanager.lua @@ -15,6 +15,7 @@ local OTAManager = { "http://hal9k.ifsc.usp.br:80/koreader/", }, ota_channels = { + "stable", "nightly", }, zsync_template = "koreader-%s-latest-%s.zsync", @@ -23,6 +24,11 @@ local OTAManager = { updated_package = "ota/koreader.updated.tar", } +local ota_channels = { + stable = _("stable"), + nightly = _("develop"), +} + function OTAManager:getOTAModel() if Device:isKindle() then return "kindle" @@ -65,11 +71,14 @@ function OTAManager:checkUpdate() local ota_zsync_file = self:getOTAServer() .. zsync_file local local_zsync_file = "ota/" .. zsync_file -- download zsync file from OTA server + DEBUG("downloading zsync file", ota_zsync_file) local r, c, h = http.request{ url = ota_zsync_file, sink = ltn12.sink.file(io.open(local_zsync_file, "w"))} - -- prompt users to turn on Wifi if network is unreachable - if c ~= 200 then return end + if c ~= 200 then + DEBUG("cannot find zsync file", c) + return + end -- parse OTA package version local ota_package = nil local zsync = io.open(local_zsync_file, "r") @@ -98,7 +107,7 @@ function OTAManager:checkUpdate() -- return ota package version if package on OTA server has version -- larger than the local package version if local_ok and ota_ok and ota_version and local_version and - ota_version > local_version then + ota_version ~= local_version then return ota_version, local_version elseif ota_version and ota_version == local_version then return 0 @@ -113,7 +122,7 @@ function OTAManager:fetchAndProcessUpdate() }) elseif ota_version == nil then UIManager:show(InfoMessage:new{ - text = _("OTA server is not available."), + text = _("OTA package is not available."), }) elseif ota_version then UIManager:show(ConfirmBox:new{ @@ -184,7 +193,7 @@ function OTAManager:genChannelList() local channels = {} for _, channel in ipairs(self.ota_channels) do local channel_item = { - text = channel, + text = ota_channels[channel], checked_func = function() return self:getOTAChannel() == channel end, callback = function() self:setOTAChannel(channel) end } From 07586cea71ab3f8624424773ec81795cb8ece892 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 1 Feb 2015 17:40:34 +0800 Subject: [PATCH 02/12] strip punctuations around word before searching This should fix #1337. --- frontend/apps/reader/modules/readerdictionary.lua | 4 +--- frontend/apps/reader/modules/readersearch.lua | 1 + frontend/util.lua | 11 +++++++++++ 3 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 frontend/util.lua diff --git a/frontend/apps/reader/modules/readerdictionary.lua b/frontend/apps/reader/modules/readerdictionary.lua index 4ce6ed0ea..dabf77579 100644 --- a/frontend/apps/reader/modules/readerdictionary.lua +++ b/frontend/apps/reader/modules/readerdictionary.lua @@ -59,9 +59,7 @@ end function ReaderDictionary:stardictLookup(word, box) DEBUG("lookup word:", word, box) if word then - -- strip ASCII punctuation characters around selected word - -- and strip any generic punctuation (U+2000 - U+206F) in the word - word = word:gsub("\226[\128-\131][\128-\191]",''):gsub("^%p+",''):gsub("%p+$",'') + word = require("util").stripePunctuations(word) DEBUG("stripped word:", word) -- escape quotes and other funny characters in word local std_out = io.popen("./sdcv --utf8-input --utf8-output -nj "..("%q"):format(word), "r") diff --git a/frontend/apps/reader/modules/readersearch.lua b/frontend/apps/reader/modules/readersearch.lua index a21aba836..342d525e4 100644 --- a/frontend/apps/reader/modules/readersearch.lua +++ b/frontend/apps/reader/modules/readersearch.lua @@ -29,6 +29,7 @@ function ReaderSearch:addToMainMenu(tab_item_table) end function ReaderSearch:onShowSearchDialog(text) + text = require("util").stripePunctuations(text) local do_search = function(search_func, text, param) return function() local res = search_func(self, text, param) diff --git a/frontend/util.lua b/frontend/util.lua new file mode 100644 index 000000000..ff1fbe4e1 --- /dev/null +++ b/frontend/util.lua @@ -0,0 +1,11 @@ + +local util = {} + +function util.stripePunctuations(word) + if not word then return end + -- strip ASCII punctuation characters around word + -- and strip any generic punctuation (U+2000 - U+206F) in the word + return word:gsub("\226[\128-\131][\128-\191]",''):gsub("^%p+",''):gsub("%p+$",'') +end + +return util From c6f6699644335ecee3247b25ae71fb3a41d1468e Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 1 Feb 2015 20:41:18 +0800 Subject: [PATCH 03/12] fix empty menu widget won't trigger screen refresh This should fix #1398. --- frontend/ui/widget/menu.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/ui/widget/menu.lua b/frontend/ui/widget/menu.lua index 045d0bb58..0371221b1 100644 --- a/frontend/ui/widget/menu.lua +++ b/frontend/ui/widget/menu.lua @@ -575,8 +575,8 @@ function Menu:init() -- if the table is not yet initialized, this call -- must be done manually: self.page = math.ceil((self.item_table.current or 1) / self.perpage) - self:updateItems(1) end + self:updateItems(1) end function Menu:onCloseWidget() From 1e8f07629f3b837a9ad4b9cba88bceb68cfdc94e Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 1 Feb 2015 21:36:22 +0800 Subject: [PATCH 04/12] don't pop-up TOC window --- frontend/apps/reader/modules/readertoc.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/apps/reader/modules/readertoc.lua b/frontend/apps/reader/modules/readertoc.lua index f5f35edc9..27b89a518 100644 --- a/frontend/apps/reader/modules/readertoc.lua +++ b/frontend/apps/reader/modules/readertoc.lua @@ -283,6 +283,7 @@ function ReaderToc:onShowToc() state_size = button_size, ui = self.ui, is_borderless = true, + is_popout = false, width = Screen:getWidth(), height = Screen:getHeight(), cface = Font:getFace("cfont", 20), From 10db20f2899b2ac386488bf250018bc9e0cafa55 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 1 Feb 2015 21:37:22 +0800 Subject: [PATCH 05/12] don't add duplicated bookmark and can delete bookmark This should fix #1397. --- .../apps/reader/modules/readerbookmark.lua | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/frontend/apps/reader/modules/readerbookmark.lua b/frontend/apps/reader/modules/readerbookmark.lua index d69eb87b6..2af362f7d 100644 --- a/frontend/apps/reader/modules/readerbookmark.lua +++ b/frontend/apps/reader/modules/readerbookmark.lua @@ -1,5 +1,6 @@ local InputContainer = require("ui/widget/container/inputcontainer") local CenterContainer = require("ui/widget/container/centercontainer") +local ButtonDialog = require("ui/widget/buttondialog") local Menu = require("ui/widget/menu") local Device = require("device") local GestureRange = require("ui/gesturerange") @@ -204,6 +205,26 @@ function ReaderBookmark:onShowBookmark() bookmark:gotoBookmark(item.page) end + function bm_menu:onMenuHold(item) + self.remove_bookmark_dialog = ButtonDialog:new{ + buttons = { + { + { + text = _("Remove this bookmark"), + callback = function() + bookmark:removeBookmark(item) + bm_menu:swithItemTable(nil, bookmark.bookmarks, -1) + UIManager:close(self.remove_bookmark_dialog) + end, + }, + }, + }, + } + + UIManager:show(self.remove_bookmark_dialog) + return true + end + bm_menu.close_callback = function() UIManager:close(self.bookmark_menu) end @@ -247,6 +268,8 @@ function ReaderBookmark:addBookmark(item) while _start <= _end do local v = self.bookmarks[_middle] _middle = math.floor((_start + _end)/2) + -- won't add duplicated bookmarks + if item.page == self.bookmarks[_middle].page then return end if self:isBookmarkInPageOrder(item, self.bookmarks[_middle]) then _end, direction = _middle - 1, 0 else From 720ab191abcff120fce80b9284eb934c20a01de3 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 1 Feb 2015 21:52:46 +0800 Subject: [PATCH 06/12] fix crash when opening TOC window in scroll mode of EPUB --- frontend/apps/reader/modules/readertoc.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/apps/reader/modules/readertoc.lua b/frontend/apps/reader/modules/readertoc.lua index 27b89a518..a244b7f3b 100644 --- a/frontend/apps/reader/modules/readertoc.lua +++ b/frontend/apps/reader/modules/readertoc.lua @@ -95,7 +95,9 @@ function ReaderToc:getTocTitleByPage(pn_or_xp) end function ReaderToc:getTocTitleOfCurrentPage() - return self:getTocTitleByPage(self.pageno) + if self.pageno then + return self:getTocTitleByPage(self.pageno) + end end function ReaderToc:getMaxDepth() @@ -220,7 +222,7 @@ function ReaderToc:getChapterPagesDone(pageno, level) end function ReaderToc:updateCurrentNode() - if #self.collapsed_toc > 0 then + if #self.collapsed_toc > 0 and self.pageno then for i, v in ipairs(self.collapsed_toc) do if v.page > self.pageno then self.collapsed_toc.current = i > 1 and i - 1 or 1 From e25ca27db3ce4ed437bae81b7277cc7526c68434 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 1 Feb 2015 22:50:08 +0800 Subject: [PATCH 07/12] auto expand the parent TOC node of current page and fix current item of item not updated when in the last node This should fix #1396. --- frontend/apps/reader/modules/readertoc.lua | 44 +++++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/frontend/apps/reader/modules/readertoc.lua b/frontend/apps/reader/modules/readertoc.lua index a244b7f3b..d3438d082 100644 --- a/frontend/apps/reader/modules/readertoc.lua +++ b/frontend/apps/reader/modules/readertoc.lua @@ -77,21 +77,30 @@ function ReaderToc:fillToc() self.toc = self.ui.document:getToc() end -function ReaderToc:getTocTitleByPage(pn_or_xp) +function ReaderToc:getTocIndexByPage(pn_or_xp) self:fillToc() - if #self.toc == 0 then return "" end + if #self.toc == 0 then return end local pageno = pn_or_xp if type(pn_or_xp) == "string" then pageno = self.ui.document:getPageFromXPointer(pn_or_xp) end - local pre_entry = self.toc[1] + local pre_index = 1 for _k,_v in ipairs(self.toc) do if _v.page > pageno then break end - pre_entry = _v + pre_index = _k + end + return pre_index +end + +function ReaderToc:getTocTitleByPage(pn_or_xp) + local index = self:getTocIndexByPage(pn_or_xp) + if index then + return self:cleanUpTocTitle(self.toc[index].title) + else + return "" end - return self:cleanUpTocTitle(pre_entry.title) end function ReaderToc:getTocTitleOfCurrentPage() @@ -226,6 +235,19 @@ function ReaderToc:updateCurrentNode() for i, v in ipairs(self.collapsed_toc) do if v.page > self.pageno then self.collapsed_toc.current = i > 1 and i - 1 or 1 + return + end + end + self.collapsed_toc.current = #self.collapsed_toc + end +end + +function ReaderToc:expandCurrentNode() + local current_node_index = self:getTocIndexByPage(self.pageno) + if current_node_index then + for i = current_node_index - 1, 1, -1 do + if self.toc[i+1].depth > self.toc[i].depth then + self:expandToc(i) break end end @@ -326,6 +348,9 @@ function ReaderToc:onShowToc() self.toc_menu = toc_menu + -- auto expand the parent node of current page + self:expandCurrentNode() + UIManager:show(menu_container) return true @@ -333,6 +358,9 @@ end -- expand TOC node of index in raw toc table function ReaderToc:expandToc(index) + for k, v in ipairs(self.expanded_nodes) do + if v == index then return end + end table.insert(self.expanded_nodes, index) local cur_node = self.toc[index] local cur_depth = cur_node.depth @@ -364,6 +392,12 @@ end -- collapse TOC node of index in raw toc table function ReaderToc:collapseToc(index) + for k, v in ipairs(self.expanded_nodes) do + if v == index then + table.remove(self.expanded_nodes, k) + break + end + end local cur_node = self.toc[index] local cur_depth = cur_node.depth local i = 1 From 02d61115dc63e3b95578643af4b0c4c054f30600 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 1 Feb 2015 23:21:34 +0800 Subject: [PATCH 08/12] fix some part of the screen not refreshed when togglering nightmode --- frontend/ui/elements/common_settings_menu_table.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/ui/elements/common_settings_menu_table.lua b/frontend/ui/elements/common_settings_menu_table.lua index 85b252203..e519ced69 100644 --- a/frontend/ui/elements/common_settings_menu_table.lua +++ b/frontend/ui/elements/common_settings_menu_table.lua @@ -23,6 +23,7 @@ table.insert(common_settings, { callback = function() local night_mode = G_reader_settings:readSetting("night_mode") or false Screen:toggleNightMode() + UIManager:setDirty(nil, "full") G_reader_settings:saveSetting("night_mode", not night_mode) end }) From ca6b3d7e3370a04a6b968083f492f565752f7295 Mon Sep 17 00:00:00 2001 From: chrox Date: Mon, 2 Feb 2015 00:09:07 +0800 Subject: [PATCH 09/12] fix #1373 by checking the pos0 and pos1 of selected text --- .../apps/reader/modules/readerbookmark.lua | 20 ++++++++++++++++++- .../apps/reader/modules/readerhighlight.lua | 5 ++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/frontend/apps/reader/modules/readerbookmark.lua b/frontend/apps/reader/modules/readerbookmark.lua index 2af362f7d..841b7f45e 100644 --- a/frontend/apps/reader/modules/readerbookmark.lua +++ b/frontend/apps/reader/modules/readerbookmark.lua @@ -262,6 +262,21 @@ function ReaderBookmark:getDogearBookmarkIndex(pn_or_xp) end end +function ReaderBookmark:isBookmarkSame(item1, item2) + if item1.notes ~= item2.notes then return end + if self.ui.document.info.has_pages then + if not item2.pos0 or not item2.pos1 then return end + local zoom1 = item1.pos0.zoom + local zoom1 = item2.pos0.zoom + return item2.pos0 and item2.pos1 and item1.pos0.page == item2.pos0.page + and item1.pos0.x == item2.pos0.x and item1.pos0.y == item2.pos0.y + and item1.pos1.x == item2.pos1.x and item1.pos1.y == item2.pos1.y + else + return item1.page == item2.page + and item1.pos0 == item2.pos0 and item1.pos1 == item2.pos1 + end +end + -- binary insert of sorted bookmarks function ReaderBookmark:addBookmark(item) local _start, _middle, _end, direction = 1, 1, #self.bookmarks, 0 @@ -269,7 +284,10 @@ function ReaderBookmark:addBookmark(item) local v = self.bookmarks[_middle] _middle = math.floor((_start + _end)/2) -- won't add duplicated bookmarks - if item.page == self.bookmarks[_middle].page then return end + if self:isBookmarkSame(item, self.bookmarks[_middle]) then + DEBUG("skip adding duplicated bookmark") + return + end if self:isBookmarkInPageOrder(item, self.bookmarks[_middle]) then _end, direction = _middle - 1, 0 else diff --git a/frontend/apps/reader/modules/readerhighlight.lua b/frontend/apps/reader/modules/readerhighlight.lua index f3ba54439..351492331 100644 --- a/frontend/apps/reader/modules/readerhighlight.lua +++ b/frontend/apps/reader/modules/readerhighlight.lua @@ -392,7 +392,8 @@ end function ReaderHighlight:saveHighlight() DEBUG("save highlight") local page = self.hold_pos.page - if self.hold_pos and self.selected_text then + if self.hold_pos and self.selected_text and self.selected_text.pos0 + and self.selected_text.pos1 then if not self.view.highlight.saved[page] then self.view.highlight.saved[page] = {} end @@ -408,6 +409,8 @@ function ReaderHighlight:saveHighlight() table.insert(self.view.highlight.saved[page], hl_item) self.ui.bookmark:addBookmark({ page = self.ui.document.info.has_pages and page or self.selected_text.pos0, + pos0 = self.selected_text.pos0, + pos1 = self.selected_text.pos1, datetime = datetime, notes = self.selected_text.text, highlighted = true, From f22a53affd79ae77ce5e9deb06c84210e72bc9d0 Mon Sep 17 00:00:00 2001 From: chrox Date: Mon, 2 Feb 2015 01:36:49 +0800 Subject: [PATCH 10/12] screen orientation won't change when going into filemanager and filemanager remembers screen orientation at exit This should fix #1338. --- frontend/apps/filemanager/filemanager.lua | 25 +++++++++++++++++---- frontend/apps/reader/modules/readermenu.lua | 7 +++--- frontend/ui/widget/filechooser.lua | 7 +++--- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/frontend/apps/filemanager/filemanager.lua b/frontend/apps/filemanager/filemanager.lua index 161996dc8..b9ebeef41 100644 --- a/frontend/apps/filemanager/filemanager.lua +++ b/frontend/apps/filemanager/filemanager.lua @@ -155,6 +155,20 @@ function FileManager:init() self:handleEvent(Event:new("SetDimensions", self.dimen)) end +function FileManager:resetDimen(dimen) + self.dimen = dimen + -- backup the root path and path items + self.root_path = self.file_chooser.path + local path_items_backup = {} + for k, v in pairs(self.file_chooser.path_items) do + path_items_backup[k] = v + end + -- reinit filemanager + self:init() + self.file_chooser.path_items = path_items_backup + self:onRefresh() +end + function FileManager:toggleHiddenFiles() self.file_chooser:toggleHiddenFiles() G_reader_settings:saveSetting("show_hidden", self.file_chooser.show_hidden) @@ -172,6 +186,7 @@ end function FileManager:onClose() DEBUG("close filemanager") + G_reader_settings:saveSetting("fm_screen_mode", Screen:getScreenMode()) UIManager:close(self) if self.onExit then self:onExit() @@ -206,15 +221,17 @@ function FileManager:showFiles(path) DEBUG("show home page") path = path or G_reader_settings:readSetting("lastdir") or self:getDefaultDir() G_reader_settings:saveSetting("lastdir", path) - UIManager:show(FileManager:new{ + self:restoreScreenMode() + local file_manager = FileManager:new{ dimen = Screen:getSize(), root_path = path, onExit = function() - self.is_running = false + self.instance = nil UIManager:quit() end - }) - self.is_running = true + } + UIManager:show(file_manager) + self.instance = file_manager end function FileManager:copyFile(file) diff --git a/frontend/apps/reader/modules/readermenu.lua b/frontend/apps/reader/modules/readermenu.lua index fce5cd206..2e4d3c8b6 100644 --- a/frontend/apps/reader/modules/readermenu.lua +++ b/frontend/apps/reader/modules/readermenu.lua @@ -40,11 +40,10 @@ function ReaderMenu:init() callback = function() self:onTapCloseMenu() self.ui:onClose() - -- screen orientation is independent for docview and filemanager - -- so we need to restore the screen mode for the filemanager local FileManager = require("apps/filemanager/filemanager") - FileManager:restoreScreenMode() - if not FileManager.is_running then + if FileManager.instance then + FileManager.instance:resetDimen(Screen:getSize()) + else local lastdir = nil local last_file = G_reader_settings:readSetting("lastfile") if last_file then diff --git a/frontend/ui/widget/filechooser.lua b/frontend/ui/widget/filechooser.lua index 06f9007f5..4fcb81984 100644 --- a/frontend/ui/widget/filechooser.lua +++ b/frontend/ui/widget/filechooser.lua @@ -26,7 +26,7 @@ local FileChooser = Menu:extend{ strcoll = strcoll, collate = "strcoll", -- or collate = "access", reverse_collate = false, - path_pages = {}, -- store last browsed location(page) for each path + path_items = {}, -- store last browsed location(item index) for each path } function FileChooser:init() @@ -150,12 +150,11 @@ end function FileChooser:updateItems(select_number) Menu.updateItems(self, select_number) -- call parent's updateItems() - self.path_pages[self.path] = self.page + self.path_items[self.path] = (self.page - 1) * self.perpage + (select_number or 1) end function FileChooser:refreshPath() - self.page = self.path_pages[self.path] or 1 - self:swithItemTable(nil, self:genItemTableFromPath(self.path), -1) + self:swithItemTable(nil, self:genItemTableFromPath(self.path), self.path_items[self.path]) end function FileChooser:changeToPath(path) From 5d79158602b42d2957fa995f647612a112447c71 Mon Sep 17 00:00:00 2001 From: chrox Date: Mon, 2 Feb 2015 02:22:58 +0800 Subject: [PATCH 11/12] fix cannot save document if exit directly after highlighting in PDF --- frontend/apps/filemanager/filemanager.lua | 1 - frontend/apps/reader/modules/readermenu.lua | 7 +++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/apps/filemanager/filemanager.lua b/frontend/apps/filemanager/filemanager.lua index b9ebeef41..7972232bb 100644 --- a/frontend/apps/filemanager/filemanager.lua +++ b/frontend/apps/filemanager/filemanager.lua @@ -227,7 +227,6 @@ function FileManager:showFiles(path) root_path = path, onExit = function() self.instance = nil - UIManager:quit() end } UIManager:show(file_manager) diff --git a/frontend/apps/reader/modules/readermenu.lua b/frontend/apps/reader/modules/readermenu.lua index 2e4d3c8b6..dc5d64370 100644 --- a/frontend/apps/reader/modules/readermenu.lua +++ b/frontend/apps/reader/modules/readermenu.lua @@ -58,8 +58,11 @@ function ReaderMenu:init() remember = false, callback = function() self:onTapCloseMenu() - self.ui:onClose() - UIManager:quit() + UIManager:scheduleIn(0.1, function() self.ui:onClose() end) + local FileManager = require("apps/filemanager/filemanager") + if FileManager.instance then + FileManager.instance:onClose() + end end, }, } From 17f149815614ab6540f42394d6ab8f70fb3b6c1a Mon Sep 17 00:00:00 2001 From: chrox Date: Mon, 2 Feb 2015 02:33:12 +0800 Subject: [PATCH 12/12] fix successively set landscape rotate the screen --- frontend/apps/filemanager/filemanager.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/apps/filemanager/filemanager.lua b/frontend/apps/filemanager/filemanager.lua index 7972232bb..52cb23bea 100644 --- a/frontend/apps/filemanager/filemanager.lua +++ b/frontend/apps/filemanager/filemanager.lua @@ -213,7 +213,9 @@ end function FileManager:restoreScreenMode() local screen_mode = G_reader_settings:readSetting("fm_screen_mode") - Screen:setScreenMode(screen_mode or "portrait") + if Screen:getScreenMode() ~= screen_mode then + Screen:setScreenMode(screen_mode or "portrait") + end UIManager:setDirty(self, "full") end