From 2e731dd4ddc55711734cca3759f3a72d3747787b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Fern=C3=A1ndez?= Date: Fri, 19 Jun 2020 09:41:50 +0200 Subject: [PATCH] [chore] Device abstraction (#6280) * generic Device:info() function which returns the model * add Device:canSuspend() and make it true in all devices that have suspend routines and the emulator * also enable fake poweroff/reboot on the emulator * add Device.home_dir * add Device:hasExitOptions() and update menus & comments --- frontend/apps/filemanager/filemanager.lua | 12 +----------- frontend/apps/filemanager/filemanagerutil.lua | 14 +------------- frontend/device/android/device.lua | 4 +++- frontend/device/cervantes/device.lua | 1 + frontend/device/generic/device.lua | 7 +++++++ frontend/device/kindle/device.lua | 1 + frontend/device/kobo/device.lua | 1 + frontend/device/pocketbook/device.lua | 2 ++ frontend/device/remarkable/device.lua | 1 + frontend/device/sdl/device.lua | 6 ++++++ frontend/ui/elements/common_info_menu_table.lua | 9 ++------- frontend/ui/elements/filemanager_menu_order.lua | 13 ++++++------- frontend/ui/elements/reader_menu_order.lua | 12 ++++++------ 13 files changed, 38 insertions(+), 45 deletions(-) diff --git a/frontend/apps/filemanager/filemanager.lua b/frontend/apps/filemanager/filemanager.lua index 0d532a4e8..7560ef70b 100644 --- a/frontend/apps/filemanager/filemanager.lua +++ b/frontend/apps/filemanager/filemanager.lua @@ -681,17 +681,7 @@ function FileManager:goHome() local home_dir = G_reader_settings:readSetting("home_dir") if not home_dir or lfs.attributes(home_dir, "mode") ~= "directory" then -- Try some sane defaults, depending on platform - if Device:isKindle() then - home_dir = "/mnt/us" - elseif Device:isKobo() then - home_dir = "/mnt/onboard" - elseif Device:isPocketBook() then - home_dir = "/mnt/ext1" - elseif Device:isCervantes() then - home_dir = "/mnt/public" - elseif Device:isAndroid() then - home_dir = Device.external_storage() - end + home_dir = Device.home_dir end if home_dir then -- Jump to the first page if we're already home diff --git a/frontend/apps/filemanager/filemanagerutil.lua b/frontend/apps/filemanager/filemanagerutil.lua index 8d2348daa..dae4f9f57 100644 --- a/frontend/apps/filemanager/filemanagerutil.lua +++ b/frontend/apps/filemanager/filemanagerutil.lua @@ -10,19 +10,7 @@ local _ = require("gettext") local filemanagerutil = {} function filemanagerutil.getDefaultDir() - if Device:isAndroid() then - return Device.external_storage() - elseif Device:isCervantes() then - return "/mnt/public" - elseif Device:isKindle() then - return "/mnt/us/documents" - elseif Device:isKobo() then - return "/mnt/onboard" - elseif Device:isRemarkable() then - return "/home/root" - else - return "." - end + return Device.home_dir or "." end function filemanagerutil.abbreviate(path) diff --git a/frontend/device/android/device.lua b/frontend/device/android/device.lua index 1e2224518..ce7148ba7 100644 --- a/frontend/device/android/device.lua +++ b/frontend/device/android/device.lua @@ -67,13 +67,15 @@ local Device = Generic:new{ model = android.prop.product, hasKeys = yes, hasDPad = no, + hasExitOptions = no, hasEinkScreen = function() return android.isEink() end, hasColorScreen = function() return not android.isEink() end, hasFrontlight = yes, hasLightLevelFallback = yes, canRestart = no, + canSuspend = no, firmware_rev = android.app.activity.sdkVersion, - external_storage = android.getExternalStoragePath, + home_dir = android.getExternalStoragePath(), display_dpi = android.lib.AConfiguration_getDensity(android.app.config), isHapticFeedbackEnabled = yes, hasClipboard = yes, diff --git a/frontend/device/cervantes/device.lua b/frontend/device/cervantes/device.lua index 56b16518d..96e5a4eee 100644 --- a/frontend/device/cervantes/device.lua +++ b/frontend/device/cervantes/device.lua @@ -62,6 +62,7 @@ local Cervantes = Generic:new{ hasWifiManager = yes, canReboot = yes, canPowerOff = yes, + home_dir = "/mnt/public", -- do we support usb mass storage? canToggleMassStorage = function() return isMassStorageSupported() end, diff --git a/frontend/device/generic/device.lua b/frontend/device/generic/device.lua index 2befd8125..bab1d460e 100644 --- a/frontend/device/generic/device.lua +++ b/frontend/device/generic/device.lua @@ -21,6 +21,7 @@ local Device = { screen = nil, screen_dpi_override = nil, input = nil, + home_dir = 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, @@ -29,6 +30,7 @@ local Device = { hasKeyboard = no, hasKeys = no, hasDPad = no, + hasExitOptions = yes, hasFewKeys = no, hasWifiToggle = yes, hasWifiManager = no, @@ -52,6 +54,7 @@ local Device = { canToggleMassStorage = no, canUseWAL = yes, -- requires mmap'ed I/O on the target FS canRestart = yes, + canSuspend = yes, canReboot = no, canPowerOff = no, @@ -279,6 +282,10 @@ function Device:onPowerEvent(ev) end end +function Device:info() + return self.model +end + -- Hardware specific method to handle usb plug in event function Device:usbPlugIn() end diff --git a/frontend/device/kindle/device.lua b/frontend/device/kindle/device.lua index ccf247783..5c4a84c62 100644 --- a/frontend/device/kindle/device.lua +++ b/frontend/device/kindle/device.lua @@ -96,6 +96,7 @@ local Kindle = Generic:new{ canHWInvert = yes, -- NOTE: Newer devices will turn the frontlight off at 0 canTurnFrontlightOff = yes, + home_dir = "/mnt/us/documents", } function Kindle:initNetworkManager(NetworkMgr) diff --git a/frontend/device/kobo/device.lua b/frontend/device/kobo/device.lua index 8aa67518a..30dbbbbed 100644 --- a/frontend/device/kobo/device.lua +++ b/frontend/device/kobo/device.lua @@ -47,6 +47,7 @@ local Kobo = Generic:new{ hasNaturalLightMixer = no, -- HW inversion is generally safe on Kobo, except on a few boards/kernels canHWInvert = yes, + home_dir = "/mnt/onboard", } --- @todo hasKeys for some devices? diff --git a/frontend/device/pocketbook/device.lua b/frontend/device/pocketbook/device.lua index 55de2aec5..e4a73f84f 100644 --- a/frontend/device/pocketbook/device.lua +++ b/frontend/device/pocketbook/device.lua @@ -63,7 +63,9 @@ local PocketBook = Generic:new{ isTouchDevice = yes, hasKeys = yes, hasFrontlight = yes, + canSuspend = no, emu_events_dev = "/dev/shm/emu_events", + home_dir = "/mnt/ext1", } -- Make sure the C BB cannot be used on devices with a 24bpp fb diff --git a/frontend/device/remarkable/device.lua b/frontend/device/remarkable/device.lua index b5bc2792b..255487112 100644 --- a/frontend/device/remarkable/device.lua +++ b/frontend/device/remarkable/device.lua @@ -14,6 +14,7 @@ local Remarkable = Generic:new{ isTouchDevice = yes, hasFrontlight = no, display_dpi = 226, + home_dir = "/mnt/root", } local EV_ABS = 3 diff --git a/frontend/device/sdl/device.lua b/frontend/device/sdl/device.lua index 6b9dcd9bb..aba4e94a8 100644 --- a/frontend/device/sdl/device.lua +++ b/frontend/device/sdl/device.lua @@ -80,6 +80,7 @@ local Device = Generic:new{ needsScreenRefreshAfterResume = no, hasColorScreen = yes, hasEinkScreen = no, + canSuspend = no, canOpenLink = getLinkOpener, openLink = function(self, link) local enabled, tool = getLinkOpener() @@ -114,6 +115,7 @@ local AppImage = Device:new{ hasMultitouch = no, hasOTAUpdates = yes, isDesktop = yes, + home_dir = os.getenv("HOME"), } local Emulator = Device:new{ @@ -123,11 +125,15 @@ local Emulator = Device:new{ hasFrontlight = yes, hasWifiToggle = yes, hasWifiManager = yes, + canPowerOff = yes, + canReboot = yes, + canSuspend = yes, } local Linux = Device:new{ model = "Linux", isDesktop = yes, + home_dir = os.getenv("HOME"), } local UbuntuTouch = Device:new{ diff --git a/frontend/ui/elements/common_info_menu_table.lua b/frontend/ui/elements/common_info_menu_table.lua index ed24c9010..89b28cbee 100644 --- a/frontend/ui/elements/common_info_menu_table.lua +++ b/frontend/ui/elements/common_info_menu_table.lua @@ -55,19 +55,14 @@ common_info.report_bug = { text = _("Report a bug"), keep_menu_open = true, callback = function() - local device = Device.model - if Device:isAndroid() then - device = Device:info() - end - UIManager:show(InfoMessage:new{ text = T(_("Please report bugs to \nhttps://github.com/koreader/koreader/issues\n\nVersion:\n%1\n\nDetected device:\n%2"), - version, device), + version, Device:info()), }) end } -if Device:isCervantes() or Device:isKindle() or Device:isKobo() then +if Device:canSuspend() then common_info.sleep = { text = _("Sleep"), callback = function() diff --git a/frontend/ui/elements/filemanager_menu_order.lua b/frontend/ui/elements/filemanager_menu_order.lua index d4f50df95..06e427447 100644 --- a/frontend/ui/elements/filemanager_menu_order.lua +++ b/frontend/ui/elements/filemanager_menu_order.lua @@ -154,19 +154,18 @@ local order = { }, plus_menu = {}, exit_menu = { - "restart_koreader", + "restart_koreader", -- if Device:canRestart() "----------------------------", - "sleep", -- if Device:isKindle() or Device:isKobo() - "poweroff", -- if Device:isKobo() - "reboot", -- if Device:isKobo() + "sleep", -- if Device:canSuspend() + "poweroff", -- if Device:canPowerOff() + "reboot", -- if Device:canReboot() "----------------------------", - "start_bq", + "start_bq", -- if Device:isCervantes() "exit", } } -if Device:isAndroid() then +if not Device:hasExitOptions() then order.exit_menu = nil end - return order diff --git a/frontend/ui/elements/reader_menu_order.lua b/frontend/ui/elements/reader_menu_order.lua index 8d3173c80..248a458d8 100644 --- a/frontend/ui/elements/reader_menu_order.lua +++ b/frontend/ui/elements/reader_menu_order.lua @@ -178,18 +178,18 @@ local order = { "about", }, exit_menu = { - "restart_koreader", + "restart_koreader", -- if Device:canRestart() "----------------------------", - "sleep", -- if Device:isKindle() or Device:isKobo() - "poweroff", -- if Device:isKobo() - "reboot", -- if Device:isKobo() + "sleep", -- if Device:canSuspend() + "poweroff", -- if Device:canPowerOff() + "reboot", -- if Device:canReboot() "----------------------------", - "start_bq", + "start_bq", -- if Device:isCervantes() "exit", } } -if Device:isAndroid() then +if not Device:hasExitOptions() then order.exit_menu = nil end