From 1ac0ad2f1a42e7bb1578fb1dfc46a1425c979087 Mon Sep 17 00:00:00 2001 From: NiLuJe Date: Thu, 15 Apr 2021 17:34:24 +0200 Subject: [PATCH] Android: More input handling tweaks * Android: Fix #7552 by simply ensuring we drain the input/cmd queue first, simply by scheduling the task to the next tick, instead of locally re-implementing part of the event loop ;). (Requires https://github.com/koreader/koreader-base/pull/1356 for extra safety). * Android: Clear input state when the window loses focus. (Related to the above fix). * Bump base: https://github.com/koreader/koreader-base/pull/1356 https://github.com/koreader/koreader-base/pull/1357 * Bump android-luajit-launcher: https://github.com/koreader/android-luajit-launcher/pull/293 https://github.com/koreader/android-luajit-launcher/pull/298 https://github.com/koreader/android-luajit-launcher/pull/299 --- base | 2 +- frontend/device/android/device.lua | 39 ++++++------------------- frontend/ui/widget/frontlightwidget.lua | 5 ++-- platform/android/luajit-launcher | 2 +- 4 files changed, 13 insertions(+), 35 deletions(-) diff --git a/base b/base index c9555f7fd..21591e6bf 160000 --- a/base +++ b/base @@ -1 +1 @@ -Subproject commit c9555f7fdda737fd6970425d237174073d67d054 +Subproject commit 21591e6bf8aa312bf6f19447bd218a17933ada65 diff --git a/frontend/device/android/device.lua b/frontend/device/android/device.lua index 761008f2f..82f62c377 100644 --- a/frontend/device/android/device.lua +++ b/frontend/device/android/device.lua @@ -143,7 +143,8 @@ function Device:init() or ev.code == C.APP_CMD_INIT_WINDOW or ev.code == C.APP_CMD_WINDOW_REDRAW_NEEDED then this.device.screen:_updateWindow() - elseif ev.code == C.APP_CMD_TERM_WINDOW then + elseif ev.code == C.APP_CMD_LOST_FOCUS + or ev.code == C.APP_CMD_TERM_WINDOW then this.device.input:resetState() elseif ev.code == C.APP_CMD_CONFIG_CHANGED then -- orientation and size changes @@ -393,39 +394,17 @@ function Device:isValidPath(path) return android.isPathInsideSandbox(path) end ---swallow all events -local function processEvents() - local events = ffi.new("int[1]") - local source = ffi.new("struct android_poll_source*[1]") - local poll_state = android.lib.ALooper_pollAll(-1, nil, events, ffi.cast("void**", source)) - if poll_state >= 0 then - if source[0] ~= nil then - if source[0].id == C.LOOPER_ID_MAIN then - local cmd = android.glue.android_app_read_cmd(android.app) - android.glue.android_app_pre_exec_cmd(android.app, cmd) - android.glue.android_app_post_exec_cmd(android.app, cmd) - elseif source[0].id == C.LOOPER_ID_INPUT then - local event = ffi.new("AInputEvent*[1]") - while android.lib.AInputQueue_getEvent(android.app.inputQueue, event) >= 0 do - if android.lib.AInputQueue_preDispatchEvent(android.app.inputQueue, event[0]) == 0 then - android.lib.AInputQueue_finishEvent(android.app.inputQueue, event[0], 1) - end - end - end - end - end +function Device:showLightDialog() + -- Delay it until next tick so that the event loop gets a chance to drain the input queue, + -- and consume the APP_CMD_LOST_FOCUS event. + -- This helps prevent ANRs on Tolino (c.f., #6583 & #7552). + local UIManager = require("ui/uimanager") + UIManager:nextTick(function() self:_showLightDialog() end) end -function Device:showLightDialog() +function Device:_showLightDialog() local title = android.isEink() and _("Frontlight settings") or _("Light settings") android.lights.showDialog(title, _("Brightness"), _("Warmth"), _("OK"), _("Cancel")) - repeat - processEvents() -- swallow all events, including the last one - FFIUtil.usleep(25000) -- sleep 25ms before next check if dialog was quit - until (android.lights.dialogState() ~= C.ALIGHTS_DIALOG_OPENED) - - local GestureDetector = require("device/gesturedetector") - GestureDetector:clearStates() local action = android.lights.dialogState() if action == C.ALIGHTS_DIALOG_OK then diff --git a/frontend/ui/widget/frontlightwidget.lua b/frontend/ui/widget/frontlightwidget.lua index 39764fec0..b9fc66fa8 100644 --- a/frontend/ui/widget/frontlightwidget.lua +++ b/frontend/ui/widget/frontlightwidget.lua @@ -280,8 +280,7 @@ function FrontLightWidget:setProgress(num, step, num_warmth) return true end --- Currently, we are assuming the 'warmth' has the same min/max limits --- as 'brightness'. +-- Currently, we are assuming the 'warmth' has the same min/max limits as 'brightness'. function FrontLightWidget:addWarmthWidgets(num_warmth, step, vertical_group) local button_group_down = HorizontalGroup:new{ align = "center" } local button_group_up = HorizontalGroup:new{ align = "center" } @@ -323,7 +322,7 @@ function FrontLightWidget:addWarmthWidgets(num_warmth, step, vertical_group) for i = math.floor(num_warmth / step) + 1, self.steps - 1 do table.insert(warmth_group, self.fl_prog_button:new{ - text="", + text = "", enabled = not self.powerd.auto_warmth, callback = function() self:setProgress(self.fl_cur, step, i * step) diff --git a/platform/android/luajit-launcher b/platform/android/luajit-launcher index bb00d4e4e..313e7da4c 160000 --- a/platform/android/luajit-launcher +++ b/platform/android/luajit-launcher @@ -1 +1 @@ -Subproject commit bb00d4e4e60883323f6182a46473a74e858ae3af +Subproject commit 313e7da4c791980bde01356e6ac6197a4a588f4c