From a60544b1ad2e9e206060c8f4a00d2ab62a907230 Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 3 Oct 2015 14:18:47 +0800 Subject: [PATCH] Koreader Ubuntu-touch port Currently only tested on Ubuntu-touch emulator with framework ubuntu-sdk-14.10 for armhf. The ubuntu-touch port is binary compatible with the Kobo port major changes in this PR are: 1. rename the emulator device to sdl device since both the emulator and the ubuntu-touch target use libsdl to handle input/output. 2. ubuntu-touch app has no write access to the installation dir so all write-outs should be in a seperate dir definded in `datastorage`. --- .gitignore | 16 +++-- .gitmodules | 3 + Makefile | 64 +++++++++++++++++- README.md | 2 +- datastorage.lua | 28 +++++++- .../apps/filemanager/filemanagerhistory.lua | 3 +- .../apps/reader/modules/readerdictionary.lua | 8 +-- .../apps/reader/modules/readerscreenshot.lua | 11 +-- frontend/cache.lua | 3 +- frontend/dbg.lua | 6 +- frontend/device.lua | 4 +- frontend/device/generic/device.lua | 2 +- frontend/device/{emulator => sdl}/device.lua | 8 +-- .../{emulator => sdl}/event_map_sdl.lua | 0 .../{emulator => sdl}/event_map_sdl2.lua | 0 frontend/docsettings.lua | 12 ++-- frontend/document/credocument.lua | 3 +- frontend/dump.lua | 13 +++- frontend/ui/otamanager.lua | 13 ++-- platform/ubuntu-touch/koreader.apparmor | 15 ++++ platform/ubuntu-touch/koreader.desktop | 10 +++ platform/ubuntu-touch/koreader.png | Bin 0 -> 13674 bytes platform/ubuntu-touch/koreader.sh | 31 +++++++++ platform/ubuntu-touch/manifest.json | 15 ++++ platform/ubuntu-touch/ubuntu-touch-sdl | 1 + plugins/evernote.koplugin/main.lua | 5 +- plugins/statistics.koplugin/main.lua | 5 +- 27 files changed, 233 insertions(+), 48 deletions(-) rename frontend/device/{emulator => sdl}/device.lua (89%) rename frontend/device/{emulator => sdl}/event_map_sdl.lua (100%) rename frontend/device/{emulator => sdl}/event_map_sdl2.lua (100%) create mode 100644 platform/ubuntu-touch/koreader.apparmor create mode 100644 platform/ubuntu-touch/koreader.desktop create mode 100644 platform/ubuntu-touch/koreader.png create mode 100755 platform/ubuntu-touch/koreader.sh create mode 100644 platform/ubuntu-touch/manifest.json create mode 160000 platform/ubuntu-touch/ubuntu-touch-sdl diff --git a/.gitignore b/.gitignore index ee57a33b4..fa36f444f 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ emu koreader-*.zip koreader-*.apk koreader-*.tar.gz +koreader-*.click l10n/* !l10n/Makefile @@ -27,11 +28,12 @@ l10n/* /.cproject /.project -koreader-arm-linux-androideabi -koreader-arm-linux-gnueabi -koreader-arm-linux-gnueabihf -koreader-i686-w64-mingw32 -koreader-x86_64-linux-gnu -koreader-x86_64-pc-linux-gnu -koreader-arm-obreey-linux-gnueabi +koreader-android-arm-linux-androideabi +koreader-kindle-arm-linux-gnueabi +koreader-kobo-arm-linux-gnueabihf +koreader-emulator-i686-w64-mingw32 +koreader-emulator-x86_64-linux-gnu +koreader-emulator-x86_64-pc-linux-gnu +koreader-pocketbook-arm-obreey-linux-gnueabi +koreader-ubuntu-touch-arm-linux-gnueabihf diff --git a/.gitmodules b/.gitmodules index b0b7eeae0..81d9eda33 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "platform/android/luajit-launcher"] path = platform/android/luajit-launcher url = https://github.com/koreader/android-luajit-launcher.git +[submodule "platform/ubuntu-touch/ubuntu-touch-sdl"] + path = platform/ubuntu-touch/ubuntu-touch-sdl + url = https://github.com/Sturmflut/ubuntu-touch-sdl-template diff --git a/Makefile b/Makefile index 4368982e6..a41671c71 100644 --- a/Makefile +++ b/Makefile @@ -17,15 +17,24 @@ else ifeq ($(TARGET), pocketbook) endif MACHINE?=$(shell PATH=$(PATH) $(CC) -dumpmachine 2>/dev/null) -INSTALL_DIR=koreader-$(MACHINE) + +ifdef TARGET + DIST:=$(TARGET) +else + DIST:=emulator +endif + +INSTALL_DIR=koreader-$(DIST)-$(MACHINE) # platform directories PLATFORM_DIR=platform KINDLE_DIR=$(PLATFORM_DIR)/kindle KOBO_DIR=$(PLATFORM_DIR)/kobo POCKETBOOK_DIR=$(PLATFORM_DIR)/pocketbook +UBUNTUTOUCH_DIR=$(PLATFORM_DIR)/ubuntu-touch ANDROID_DIR=$(PLATFORM_DIR)/android ANDROID_LAUNCHER_DIR:=$(ANDROID_DIR)/luajit-launcher +UBUNTUTOUCH_SDL_DIR:=$(UBUNTUTOUCH_DIR)/ubuntu-touch-sdl WIN32_DIR=$(PLATFORM_DIR)/win32 # files to link from main directory @@ -221,6 +230,46 @@ pbupdate: all tar czafh ../../koreader-pocketbook-$(MACHINE)-$(VERSION).targz \ -T koreader/ota/package.index --no-recursion +utupdate: all + # ensure that the binaries were built for ARM + file $(INSTALL_DIR)/koreader/luajit | grep ARM || exit 1 + # remove old package if any + rm -f koreader-ubuntu-touch-$(MACHINE)-$(VERSION).click + + ln -sf ../../$(UBUNTUTOUCH_DIR)/koreader.sh $(INSTALL_DIR)/koreader + ln -sf ../../$(UBUNTUTOUCH_DIR)/manifest.json $(INSTALL_DIR)/koreader + ln -sf ../../$(UBUNTUTOUCH_DIR)/koreader.apparmor $(INSTALL_DIR)/koreader + ln -sf ../../$(UBUNTUTOUCH_DIR)/koreader.desktop $(INSTALL_DIR)/koreader + ln -sf ../../$(UBUNTUTOUCH_DIR)/koreader.png $(INSTALL_DIR)/koreader + ln -sf ../../../$(UBUNTUTOUCH_SDL_DIR)/lib/arm-linux-gnueabihf/libSDL2.so $(INSTALL_DIR)/koreader/libs + + # create new package + cd $(INSTALL_DIR) && pwd && \ + zip -9 -r \ + ../koreader-$(DIST)-$(MACHINE)-$(VERSION).zip \ + koreader -x "koreader/resources/fonts/*" "koreader/ota/*" \ + "koreader/resources/icons/src/*" "koreader/spec/*" + + # generate update package index file + zipinfo -1 koreader-$(DIST)-$(MACHINE)-$(VERSION).zip > \ + $(INSTALL_DIR)/koreader/ota/package.index + echo "koreader/ota/package.index" >> $(INSTALL_DIR)/koreader/ota/package.index + # update index file in zip package + cd $(INSTALL_DIR) && zip -u ../koreader-$(DIST)-$(MACHINE)-$(VERSION).zip \ + koreader/ota/package.index + # make gzip update for zsync OTA update + cd $(INSTALL_DIR) && \ + tar czafh ../koreader-$(DIST)-$(MACHINE)-$(VERSION).targz \ + -T koreader/ota/package.index --no-recursion + + # generate ubuntu touch click package + rm -rf $(INSTALL_DIR)/tmp && mkdir -p $(INSTALL_DIR)/tmp + cd $(INSTALL_DIR)/tmp && \ + unzip ../../koreader-$(DIST)-$(MACHINE)-$(VERSION).zip && \ + click build koreader && \ + mv *.click ../../koreader-$(DIST)-$(MACHINE)-$(VERSION).click + + androidupdate: all mkdir -p $(ANDROID_LAUNCHER_DIR)/assets/module -rm $(ANDROID_LAUNCHER_DIR)/assets/module/koreader-* @@ -231,6 +280,19 @@ androidupdate: all cp $(ANDROID_LAUNCHER_DIR)/bin/NativeActivity-debug.apk \ koreader-android-$(MACHINE)-$(VERSION).apk +update: +ifeq ($(TARGET), kindle) + make kindleupdate +else ifeq ($(TARGET), kobo) + make koboupdate +else ifeq ($(TARGET), pocketbook) + make pbupdate +else ifeq ($(TARGET), ubuntu-touch) + make utupdate +else ifeq ($(TARGET), android) + make androidupdate +endif + androiddev: androidupdate $(MAKE) -C $(ANDROID_LAUNCHER_DIR) dev diff --git a/README.md b/README.md index 8d480f2ac..e48c9f13c 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ and cross compiling. Users of Debian and Ubuntu can install the required packages using: ``` -sudo apt-get install build-essential libtool gcc-multilib libffi-dev \ +sudo apt-get install build-essential libtool gcc-multilib libffi-dev linux-libc-dev:i386 \ patch wget unzip git autoconf subversion cmake nasm libsdl1.2-dev luarocks ``` diff --git a/datastorage.lua b/datastorage.lua index 8cf2bd24a..35cd1f239 100644 --- a/datastorage.lua +++ b/datastorage.lua @@ -1,14 +1,38 @@ -- need low-level mechnism to detect android to avoid recursive dependency local isAndroid = pcall(require, "android") +local lfs = require("libs/libkoreader-lfs") local DataStorage = {} function DataStorage:getDataDir() + local data_dir if isAndroid then - return "/sdcard/koreader/" + data_dir = "/sdcard/koreader/" + elseif os.getenv("UBUNTU_APPLICATION_ISOLATION") then + local app_id = os.getenv("APP_ID") + local package_name = app_id:match("^(.-)_") + -- confinded ubuntu app has write access to this dir + data_dir = os.getenv("XDG_DATA_HOME") .. "/" .. package_name else - return "./" + data_dir = "./" end + if lfs.attributes(data_dir, "mode") ~= "directory" then + lfs.mkdir(data_dir) + end + return data_dir end +local function initDataDir() + local data_dir = DataStorage:getDataDir() + local sub_data_dirs = {"cache", "clipboard", "data", "history", "ota", "screenshots"} + for _, dir in ipairs(sub_data_dirs) do + local sub_data_dir = data_dir .. "/" .. dir + if lfs.attributes(sub_data_dir, "mode") ~= "directory" then + lfs.mkdir(sub_data_dir) + end + end +end + +initDataDir() + return DataStorage diff --git a/frontend/apps/filemanager/filemanagerhistory.lua b/frontend/apps/filemanager/filemanagerhistory.lua index 22e77505d..1d1f0d416 100644 --- a/frontend/apps/filemanager/filemanagerhistory.lua +++ b/frontend/apps/filemanager/filemanagerhistory.lua @@ -2,13 +2,14 @@ local InputContainer = require("ui/widget/container/inputcontainer") local CenterContainer = require("ui/widget/container/centercontainer") local ButtonDialog = require("ui/widget/buttondialog") local lfs = require("libs/libkoreader-lfs") +local DataStorage = require("datastorage") local UIManager = require("ui/uimanager") local DocSettings = require("docsettings") local Menu = require("ui/widget/menu") local Screen = require("device").screen local _ = require("gettext") -local history_dir = "./history/" +local history_dir = DataStorage:getDataDir() .. "/history/" local FileManagerHistory = InputContainer:extend{ hist_menu_title = _("History"), diff --git a/frontend/apps/reader/modules/readerdictionary.lua b/frontend/apps/reader/modules/readerdictionary.lua index 7bc05b87f..7f4b37f9e 100644 --- a/frontend/apps/reader/modules/readerdictionary.lua +++ b/frontend/apps/reader/modules/readerdictionary.lua @@ -1,6 +1,7 @@ local InputContainer = require("ui/widget/container/inputcontainer") local DictQuickLookup = require("ui/widget/dictquicklookup") local InfoMessage = require("ui/widget/infomessage") +local DataStorage = require("datastorage") local UIManager = require("ui/uimanager") local Screen = require("device").screen local Device = require("device") @@ -15,11 +16,8 @@ local ReaderDictionary = InputContainer:new{ function ReaderDictionary:init() self.ui.menu:registerToMainMenu(self) - if Device:isAndroid() then - self.data_dir = "/sdcard/koreader/data/dict" - else - self.data_dir = os.getenv("STARDICT_DATA_DIR") or "data/dict" - end + self.data_dir = os.getenv("STARDICT_DATA_DIR") or + DataStorage:getDataDir() .. "/data/dict" end function ReaderDictionary:addToMainMenu(tab_item_table) diff --git a/frontend/apps/reader/modules/readerscreenshot.lua b/frontend/apps/reader/modules/readerscreenshot.lua index 346adf2b6..b7284a285 100644 --- a/frontend/apps/reader/modules/readerscreenshot.lua +++ b/frontend/apps/reader/modules/readerscreenshot.lua @@ -1,15 +1,18 @@ local InputContainer = require("ui/widget/container/inputcontainer") -local Device = require("device") -local Screen = require("device").screen +local InfoMessage = require("ui/widget/infomessage") local GestureRange = require("ui/gesturerange") +local DataStorage = require("datastorage") local UIManager = require("ui/uimanager") -local InfoMessage = require("ui/widget/infomessage") +local Device = require("device") +local Screen = require("device").screen local DEBUG = require("dbg") local T = require("ffi/util").template local _ = require("gettext") +local screenshots_dir = DataStorage:getDataDir() .. "/screenshots/" + local ReaderScreenshot = InputContainer:new{ - datetime_name = "screenshots/Screenshot_%Y-%b-%d_%H%M%S.png", + datetime_name = screenshots_dir .. "Screenshot_%Y-%b-%d_%H%M%S.png", } function ReaderScreenshot:init() diff --git a/frontend/cache.lua b/frontend/cache.lua index 5f9b92431..4fb859e79 100644 --- a/frontend/cache.lua +++ b/frontend/cache.lua @@ -3,6 +3,7 @@ A global LRU cache ]]-- local md5 = require("MD5") local lfs = require("libs/libkoreader-lfs") +local DataStorage = require("datastorage") local DEBUG = require("dbg") local function calcFreeMem() @@ -30,7 +31,7 @@ local function calcCacheMemSize() return math.min(max, math.max(min, calc)) end -local cache_path = lfs.currentdir().."/cache/" +local cache_path = DataStorage:getDataDir() .. "/cache/" --[[ -- return a snapshot of disk cached items for subsequent check diff --git a/frontend/dbg.lua b/frontend/dbg.lua index eb540ab84..fea21d785 100644 --- a/frontend/dbg.lua +++ b/frontend/dbg.lua @@ -39,8 +39,10 @@ end function Dbg:logEv(ev) local log = ev.type.."|"..ev.code.."|" ..ev.value.."|"..ev.time.sec.."|"..ev.time.usec.."\n" - self.ev_log:write(log) - self.ev_log:flush() + if self.ev_log then + self.ev_log:write(log) + self.ev_log:flush() + end end function Dbg:traceback() diff --git a/frontend/device.lua b/frontend/device.lua index 504a03255..aeacc5e8e 100644 --- a/frontend/device.lua +++ b/frontend/device.lua @@ -2,8 +2,8 @@ local isAndroid, android = pcall(require, "android") local util = require("ffi/util") local function probeDevice() - if util.isEmulated() then - return require("device/emulator/device") + if util.isSDL() then + return require("device/sdl/device") end if isAndroid then diff --git a/frontend/device/generic/device.lua b/frontend/device/generic/device.lua index 743207806..0f1aabfe6 100644 --- a/frontend/device/generic/device.lua +++ b/frontend/device/generic/device.lua @@ -29,7 +29,7 @@ local Device = { isKobo = no, isPocketBook = no, isAndroid = no, - isEmulator = no, + isSDL = no, -- some devices have part of their screen covered by the bezel viewport = nil, diff --git a/frontend/device/emulator/device.lua b/frontend/device/sdl/device.lua similarity index 89% rename from frontend/device/emulator/device.lua rename to frontend/device/sdl/device.lua index 533eb05de..e924ea519 100644 --- a/frontend/device/emulator/device.lua +++ b/frontend/device/sdl/device.lua @@ -6,8 +6,8 @@ local function yes() return true end local function no() return false end local Device = Generic:new{ - model = "Emulator", - isEmulator = yes, + model = "SDL", + isSDL = yes, hasKeyboard = yes, hasKeys = yes, hasDPad = yes, @@ -32,13 +32,13 @@ function Device:init() self.screen = require("ffi/framebuffer_SDL2_0"):new{device = self, debug = DEBUG} self.input = require("device/input"):new{ device = self, - event_map = require("device/emulator/event_map_sdl2"), + event_map = require("device/sdl/event_map_sdl2"), } else self.screen = require("ffi/framebuffer_SDL1_2"):new{device = self, debug = DEBUG} self.input = require("device/input"):new{ device = self, - event_map = require("device/emulator/event_map_sdl"), + event_map = require("device/sdl/event_map_sdl"), } end diff --git a/frontend/device/emulator/event_map_sdl.lua b/frontend/device/sdl/event_map_sdl.lua similarity index 100% rename from frontend/device/emulator/event_map_sdl.lua rename to frontend/device/sdl/event_map_sdl.lua diff --git a/frontend/device/emulator/event_map_sdl2.lua b/frontend/device/sdl/event_map_sdl2.lua similarity index 100% rename from frontend/device/emulator/event_map_sdl2.lua rename to frontend/device/sdl/event_map_sdl2.lua diff --git a/frontend/docsettings.lua b/frontend/docsettings.lua index 2b167a8a8..7efe53c70 100644 --- a/frontend/docsettings.lua +++ b/frontend/docsettings.lua @@ -1,10 +1,13 @@ local lfs = require("libs/libkoreader-lfs") -local DocSettings = {} -local dump = require("dump") local DataStorage = require("datastorage") +local dump = require("dump") + +local DocSettings = {} + +local history_dir = DataStorage:getDataDir() .. "/history/" function DocSettings:getHistoryPath(fullpath) - return "./history/[" .. fullpath:gsub("(.*/)([^/]+)","%1] %2"):gsub("/","#") .. ".lua" + return history_dir .. "[" .. fullpath:gsub("(.*/)([^/]+)","%1] %2"):gsub("/","#") .. ".lua" end function DocSettings:getPathFromHistory(hist_name) @@ -29,9 +32,6 @@ function DocSettings:open(docfile) -- we handle reader setting as special case history_path = DataStorage:getDataDir() .. "/settings.reader.lua" else - if lfs.attributes("./history", "mode") ~= "directory" then - lfs.mkdir("history") - end history_path = self:getHistoryPath(docfile) local sidecar = docfile:match("(.*)%.")..".sdr" diff --git a/frontend/document/credocument.lua b/frontend/document/credocument.lua index 4408c15fe..6eddb3c0f 100644 --- a/frontend/document/credocument.lua +++ b/frontend/document/credocument.lua @@ -3,6 +3,7 @@ local Document = require("document/document") local Configurable = require("configurable") local Blitbuffer = require("ffi/blitbuffer") local lfs = require("libs/libkoreader-lfs") +local DataStorage = require("datastorage") local Geom = require("ui/geometry") local Device = require("device") local Screen = require("device").screen @@ -44,7 +45,7 @@ function CreDocument:cacheInit() if lfs.attributes("./cr3cache", "mode") == "directory" then os.execute("rm -r ./cr3cache") end - cre.initCache("./cache/cr3cache", 1024*1024*32) + cre.initCache(DataStorage:getDataDir() .. "/cache/cr3cache", 1024*1024*32) end function CreDocument:engineInit() diff --git a/frontend/dump.lua b/frontend/dump.lua index cd1ba9dff..242ca1e08 100644 --- a/frontend/dump.lua +++ b/frontend/dump.lua @@ -2,6 +2,7 @@ simple serialization function, won't do uservalues, functions, loops ]] +local isUbuntuTouch = os.getenv("UBUNTU_APPLICATION_ISOLATION") ~= nil local insert = table.insert local function _serialize(what, outt, indent, max_lv, history) @@ -45,7 +46,17 @@ local function _serialize(what, outt, indent, max_lv, history) insert(outt, "}") elseif type(what) == "string" then insert(outt, string.format("%q", what)) - elseif type(what) == "number" or type(what) == "boolean" then + elseif type(what) == "number" then + if isUbuntuTouch then + -- FIXME: the `SDL_CreateRenderer` function in Ubuntu touch somehow + -- use a strange locale that formats number like this: 1.10000000000000g+02 + -- which cannot be recognized by loadfile after the number is dumped. + -- Here the workaround is to preserve enough precision in "%.13e" format. + insert(outt, string.format("%.13e", what)) + else + insert(outt, tostring(what)) + end + elseif type(what) == "boolean" then insert(outt, tostring(what)) elseif type(what) == "function" then insert(outt, "nil --[[ FUNCTION ]]") diff --git a/frontend/ui/otamanager.lua b/frontend/ui/otamanager.lua index f8752e30f..4547cf7df 100644 --- a/frontend/ui/otamanager.lua +++ b/frontend/ui/otamanager.lua @@ -2,12 +2,15 @@ local InfoMessage = require("ui/widget/infomessage") local ConfirmBox = require("ui/widget/confirmbox") local NetworkMgr = require("ui/networkmgr") local lfs = require("libs/libkoreader-lfs") +local DataStorage = require("datastorage") local UIManager = require("ui/uimanager") local Device = require("device") local DEBUG = require("dbg") local T = require("ffi/util").template local _ = require("gettext") +local ota_dir = DataStorage:getDataDir() .. "/ota/" + local OTAManager = { ota_servers = { "http://vislab.bjmu.edu.cn:80/apps/koreader/ota/", @@ -19,9 +22,9 @@ local OTAManager = { "nightly", }, zsync_template = "koreader-%s-latest-%s.zsync", - installed_package = "ota/koreader.installed.tar", + installed_package = ota_dir .. "/koreader.installed.tar", package_indexfile = "ota/package.index", - updated_package = "ota/koreader.updated.tar", + updated_package = ota_dir .. "/koreader.updated.tar", } local ota_channels = { @@ -69,7 +72,7 @@ function OTAManager:checkUpdate() local zsync_file = self:getZsyncFilename() local ota_zsync_file = self:getOTAServer() .. zsync_file - local local_zsync_file = "ota/" .. zsync_file + local local_zsync_file = ota_dir .. zsync_file -- download zsync file from OTA server DEBUG("downloading zsync file", ota_zsync_file) local r, c, h = http.request{ @@ -146,7 +149,7 @@ function OTAManager:fetchAndProcessUpdate() UIManager:show(ConfirmBox:new{ text = _("Error updating KOReader. Would you like to delete temporary files?"), ok_callback = function() - os.execute("rm ota/ko*") + os.execute("rm " .. ota_dir .. "/ko*") end, }) end @@ -172,7 +175,7 @@ function OTAManager:zsync() return os.execute(string.format( "./zsync -i %s -o %s -u %s %s", self.installed_package, self.updated_package, - self:getOTAServer(), "ota/" .. self:getZsyncFilename() + self:getOTAServer(), ota_dir .. self:getZsyncFilename() )) end end diff --git a/platform/ubuntu-touch/koreader.apparmor b/platform/ubuntu-touch/koreader.apparmor new file mode 100644 index 000000000..a45b2c473 --- /dev/null +++ b/platform/ubuntu-touch/koreader.apparmor @@ -0,0 +1,15 @@ +{ + "policy_groups": [ + "networking" + ], + "read_path": [ + "@{HOME}/", + "/media/*/*/[Dd][Oo][Cc][Uu][Mm][Ee][Nn][Tt][Ss]/", + "@{PROC}/*/mounts", + "/dev/disk/by-label/" + ], + "write_path": [ + "@{HOME}/" + ], + "policy_version": 1.2 +} diff --git a/platform/ubuntu-touch/koreader.desktop b/platform/ubuntu-touch/koreader.desktop new file mode 100644 index 000000000..7cda547bc --- /dev/null +++ b/platform/ubuntu-touch/koreader.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=Koreader +Comment=Koreader for Ubuntu touch +Exec=koreader.sh +Icon=koreader.png +Terminal=false +Type=Application +MimeType=application/pdf;application/epub+zip +X-Ubuntu-Touch=true +X-Ubuntu-Supported-Orientations=portrait diff --git a/platform/ubuntu-touch/koreader.png b/platform/ubuntu-touch/koreader.png new file mode 100644 index 0000000000000000000000000000000000000000..fd83d394adaa05294905d2deae9430a8218d03de GIT binary patch literal 13674 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", + "name": "org.koreader.koreader", + "title": "Koreader for Ubuntu touch", + "version": "0.0.1" +} diff --git a/platform/ubuntu-touch/ubuntu-touch-sdl b/platform/ubuntu-touch/ubuntu-touch-sdl new file mode 160000 index 000000000..1d0cd7583 --- /dev/null +++ b/platform/ubuntu-touch/ubuntu-touch-sdl @@ -0,0 +1 @@ +Subproject commit 1d0cd7583c27025a69e340ac77cab3c53cdef8ba diff --git a/plugins/evernote.koplugin/main.lua b/plugins/evernote.koplugin/main.lua index 2734c167c..71bf0348a 100644 --- a/plugins/evernote.koplugin/main.lua +++ b/plugins/evernote.koplugin/main.lua @@ -1,8 +1,9 @@ local InputContainer = require("ui/widget/container/inputcontainer") local LoginDialog = require("ui/widget/logindialog") local InfoMessage = require("ui/widget/infomessage") -local DocSettings = require("docsettings") local NetworkMgr = require("ui/networkmgr") +local DataStorage = require("datastorage") +local DocSettings = require("docsettings") local UIManager = require("ui/uimanager") local Screen = require("device").screen local Event = require("ui/event") @@ -18,7 +19,7 @@ local EvernoteExporter = InputContainer:new{ notebook_name = _("Koreader Notes"), evernote_domain = nil, notemarks = _("Note: "), - clipping_dir = "./clipboard", + clipping_dir = DataStorage:getDataDir() .. "/clipboard", evernote_token, notebook_guid, diff --git a/plugins/statistics.koplugin/main.lua b/plugins/statistics.koplugin/main.lua index a654dde63..cd9316eb1 100755 --- a/plugins/statistics.koplugin/main.lua +++ b/plugins/statistics.koplugin/main.lua @@ -12,8 +12,9 @@ local DEBUG = require("dbg") local T = require("ffi/util").template local _ = require("gettext") local tableutil = require("tableutil") +local DataStorage = require("datastorage") -local statistics_dir = "./statistics" +local statistics_dir = DataStorage:getDataDir() .. "/statistics" local ReaderStatistics = InputContainer:new { last_time = nil, @@ -382,7 +383,7 @@ end function ReaderStatistics:importFromFile(item) item = string.gsub(item, "^%s*(.-)%s*$", "%1") --trim if lfs.attributes(statistics_dir, "mode") ~= "directory" then - lfs.mkdir("statistics") + lfs.mkdir(statistics_dir) end local statisticFile = statistics_dir .. "/" .. item local ok, stored = pcall(dofile, statisticFile)