From b75fec4971c1b2fa46e9a69cf72c2275fc10d35f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Fern=C3=A1ndez?= Date: Tue, 8 Oct 2019 18:15:43 +0200 Subject: [PATCH] tweak timeouts, add haptic feedback support Co-Authored-By: Frans de Jonge --- frontend/device/android/device.lua | 21 +++--- frontend/ui/elements/screen_android.lua | 93 +++++++++++++++++-------- 2 files changed, 75 insertions(+), 39 deletions(-) diff --git a/frontend/device/android/device.lua b/frontend/device/android/device.lua index 4deee2c19..367dd245c 100644 --- a/frontend/device/android/device.lua +++ b/frontend/device/android/device.lua @@ -70,6 +70,7 @@ local Device = Generic:new{ canRestart = no, firmware_rev = android.app.activity.sdkVersion, display_dpi = android.lib.AConfiguration_getDensity(android.app.config), + isHapticFeedbackEnabled = yes, hasClipboard = yes, hasOTAUpdates = canUpdateApk, canOpenLink = yes, @@ -169,19 +170,17 @@ function Device:init() self.isTouchDevice = yes end - -- check if we enabled support for custom timeouts (including wakelocks) + -- check if we use custom timeouts if android.needsWakelocks() then - android.setScreenOffTimeout(-1) + android.timeout.set(C.AKEEP_SCREEN_ON_ENABLED) else local timeout = G_reader_settings:readSetting("android_screen_timeout") - if timeout and timeout > 0 then - -- set a custom timeout if we already have write settings permission. - -- do not attempt to request permissions here. - if android.canWriteSettings() then - android.setScreenOffTimeout(timeout) + if timeout then + if timeout == C.AKEEP_SCREEN_ON_ENABLED + or (timeout > C.AKEEP_SCREEN_ON_DISABLED + and android.settings.canWrite()) then + android.timeout.set(timeout) end - elseif timeout and timeout == -1 then - android.setScreenOffTimeout(timeout) end end @@ -225,6 +224,10 @@ function Device:initNetworkManager(NetworkMgr) end end +function Device:performHapticFeedback(type) + android.hapticFeedback(C["AHAPTIC_"..type]) +end + function Device:retrieveNetworkInfo() local ssid, ip, gw = android.getNetworkInfo() if ip == "0" or gw == "0" then diff --git a/frontend/ui/elements/screen_android.lua b/frontend/ui/elements/screen_android.lua index fdd670f59..77445a784 100644 --- a/frontend/ui/elements/screen_android.lua +++ b/frontend/ui/elements/screen_android.lua @@ -1,6 +1,7 @@ local isAndroid, android = pcall(require, "android") local Device = require("device") local Geom = require("ui/geometry") +local ffi = require("ffi") local logger = require("logger") local _ = require("gettext") local Input = Device.input @@ -9,20 +10,19 @@ local T = require("ffi/util").template if not isAndroid then return end +local system = ffi.C.AKEEP_SCREEN_ON_DISABLED +local screenOn = ffi.C.AKEEP_SCREEN_ON_ENABLED +local needs_wakelocks = android.needsWakelocks() + -- custom timeouts (in milliseconds) -local timeout_custom1 = 30 * 1000 -local timeout_custom2 = 60 * 1000 -local timeout_custom3 = 2 * 60 * 1000 -local timeout_custom4 = 5 * 60 * 1000 -local timeout_custom5 = 10 * 60 * 1000 -local timeout_custom6 = 15 * 60 * 1000 +local timeout_custom1 = 2 * 60 * 1000 +local timeout_custom2 = 5 * 60 * 1000 +local timeout_custom3 = 10 * 60 * 1000 +local timeout_custom4 = 15 * 60 * 1000 +local timeout_custom5 = 20 * 60 * 1000 +local timeout_custom6 = 25 * 60 * 1000 local timeout_custom7 = 30 * 60 * 1000 -local timeout_system = 0 -- same as system (do nothing!) -local timeout_disabled = -1 -- disable timeout using wakelocks - -local can_modify_timeout = not android.needsWakelocks() - local function humanReadableTimeout(timeout) local sec = timeout / 1000 if sec >= 120 then @@ -32,13 +32,35 @@ local function humanReadableTimeout(timeout) end end +local function canModifyTimeout(timeout) + if needs_wakelocks then return false end + if timeout == system or timeout == screenOn then + return true + else + return android.settings.canWrite() + end +end + local function timeoutEquals(timeout) - return timeout == android.getScreenOffTimeout() + return timeout == android.timeout.get() end local function saveAndApplyTimeout(timeout) G_reader_settings:saveSetting("android_screen_timeout", timeout) - android.setScreenOffTimeout(timeout) + android.timeout.set(timeout) +end + +local function requestWriteSettings() + local UIManager = require("ui/uimanager") + local ConfirmBox = require("ui/widget/confirmbox") + UIManager:show(ConfirmBox:new{ + text = _("Allow KOReader to modify system settings?\n\nYou will be prompted with a permission management screen. You'll need to give KOReader permission and then restart the program."), + ok_text = _("Allow"), + ok_callback = function() + UIManager:scheduleIn(1, function() UIManager:quit() end) + android.settings.requestWritePermission() + end, + }) end local ScreenHelper = {} @@ -93,66 +115,77 @@ end -- timeout menu table function ScreenHelper:getTimeoutMenuTable() - return { - text = _("Screen Timeout"), - sub_item_table = { + local t = { { text = _("Use system settings"), - enabled_func = function() return can_modify_timeout end, - checked_func = function() return timeoutEquals(timeout_system) end, - callback = function() saveAndApplyTimeout(timeout_system) end + enabled_func = function() return canModifyTimeout(system) end, + checked_func = function() return timeoutEquals(system) end, + callback = function() saveAndApplyTimeout(system) end }, { text = humanReadableTimeout(timeout_custom1), - enabled_func = function() return can_modify_timeout end, + enabled_func = function() return canModifyTimeout(timeout_custom1) end, checked_func = function() return timeoutEquals(timeout_custom1) end, callback = function() saveAndApplyTimeout(timeout_custom1) end }, { text = humanReadableTimeout(timeout_custom2), - enabled_func = function() return can_modify_timeout end, + enabled_func = function() return canModifyTimeout(timeout_custom2) end, checked_func = function() return timeoutEquals(timeout_custom2) end, callback = function() saveAndApplyTimeout(timeout_custom2) end }, { text = humanReadableTimeout(timeout_custom3), - enabled_func = function() return can_modify_timeout end, + enabled_func = function() return canModifyTimeout(timeout_custom3) end, checked_func = function() return timeoutEquals(timeout_custom3) end, callback = function() saveAndApplyTimeout(timeout_custom3) end }, { text = humanReadableTimeout(timeout_custom4), - enabled_func = function() return can_modify_timeout end, + enabled_func = function() return canModifyTimeout(timeout_custom4) end, checked_func = function() return timeoutEquals(timeout_custom4) end, callback = function() saveAndApplyTimeout(timeout_custom4) end }, { text = humanReadableTimeout(timeout_custom5), - enabled_func = function() return can_modify_timeout end, + enabled_func = function() return canModifyTimeout(timeout_custom5) end, checked_func = function() return timeoutEquals(timeout_custom5) end, callback = function() saveAndApplyTimeout(timeout_custom5) end }, { text = humanReadableTimeout(timeout_custom6), - enabled_func = function() return can_modify_timeout end, + enabled_func = function() return canModifyTimeout(timeout_custom6) end, checked_func = function() return timeoutEquals(timeout_custom6) end, callback = function() saveAndApplyTimeout(timeout_custom6) end }, { text = humanReadableTimeout(timeout_custom7), - enabled_func = function() return can_modify_timeout end, + enabled_func = function() return canModifyTimeout(timeout_custom7) end, checked_func = function() return timeoutEquals(timeout_custom7) end, callback = function() saveAndApplyTimeout(timeout_custom7) end }, { text = _("Keep screen on"), - enabled_func = function() return can_modify_timeout end, - checked_func = function() return timeoutEquals(timeout_disabled) end, - callback = function() saveAndApplyTimeout(timeout_disabled) end + enabled_func = function() return canModifyTimeout(screenOn) end, + checked_func = function() return timeoutEquals(screenOn) end, + callback = function() saveAndApplyTimeout(screenOn) end }, } + + if not android.settings.canWrite() then + table.insert(t, 1, { + text = _("Allow system settings override"), + enabled_func = function() return not android.settings.canWrite() end, + checked_func = function() return android.settings.canWrite() end, + callback = function() requestWriteSettings() end, + separator = true, + }) + end + + return { + text = _("Screen Timeout"), + sub_item_table = t } end - return ScreenHelper