From bdca63dba3b0b04351db8192cecdf495c16e3d2c Mon Sep 17 00:00:00 2001 From: Petri Virkkunen Date: Tue, 16 Jul 2024 12:43:12 +0300 Subject: [PATCH] Android: Do not request focus on window touch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove focusing QtEditText on window touch so that hardware keyboard events can still be sent to the application after touching the screen. Move QtEditText focus request back to showSoftwareKeyboard in QtInputDelegate, so that we can still show virtual keyboard on QtEditText when needed. So that QtInputDelegate still has a valid QtEditText instance to show a virtual keyboard with, add a new QtInputConnectionListener interface function that gives the currently "active" QtEditText to listeners. Call the new QtInputConnectionListener interface function when QtWindow is touched. Pick-to: 6.7 Task-number: QTBUG-126187 Change-Id: Iff90b96351d5285249d5bcd19f3caa648628cf14 Reviewed-by: Tinja Paavoseppä (cherry picked from commit 25852624e1a306ab35acb7192ab29dc80b416556) Reviewed-by: Qt Cherry-pick Bot --- .../org/qtproject/qt/android/QtActivityDelegateBase.java | 2 -- .../src/org/qtproject/qt/android/QtInputConnection.java | 1 + .../jar/src/org/qtproject/qt/android/QtInputDelegate.java | 7 ++++++- src/android/jar/src/org/qtproject/qt/android/QtWindow.java | 6 +++++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java index 0e74884a773..d8a2f50cb93 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java @@ -116,7 +116,6 @@ abstract class QtActivityDelegateBase if (newFocus instanceof QtEditText) { final QtWindow newWindow = (QtWindow) newFocus.getParent(); QtWindow.windowFocusChanged(true, newWindow.getId()); - m_inputDelegate.setFocusedView((QtEditText) newFocus); } else { int id = -1; if (oldFocus instanceof QtEditText) { @@ -124,7 +123,6 @@ abstract class QtActivityDelegateBase id = oldWindow.getId(); } QtWindow.windowFocusChanged(false, id); - m_inputDelegate.setFocusedView(null); } } diff --git a/src/android/jar/src/org/qtproject/qt/android/QtInputConnection.java b/src/android/jar/src/org/qtproject/qt/android/QtInputConnection.java index 845f7c5e8d3..399a9b7600a 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtInputConnection.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtInputConnection.java @@ -104,6 +104,7 @@ class QtInputConnection extends BaseInputConnection void onSetClosing(boolean closing); void onHideKeyboardRunnableDone(boolean visibility, long hideTimeStamp); void onSendKeyEventDefaultCase(); + void onEditTextChanged(QtEditText editText); } private final QtEditText m_view; diff --git a/src/android/jar/src/org/qtproject/qt/android/QtInputDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtInputDelegate.java index 3a879776c2a..6a18d4931bd 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtInputDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtInputDelegate.java @@ -117,6 +117,7 @@ class QtInputDelegate implements QtInputConnection.QtInputConnectionListener, Qt return; m_currentEditText.setEditTextOptions(enterKeyType, inputHints); + m_currentEditText.requestFocus(); m_currentEditText.postDelayed(() -> { m_imm.showSoftInput(m_currentEditText, 0, new ResultReceiver(new Handler()) { @@ -241,6 +242,11 @@ class QtInputDelegate implements QtInputConnection.QtInputConnectionListener, Qt public void onSendKeyEventDefaultCase() { hideSoftwareKeyboard(); } + + @Override + public void onEditTextChanged(QtEditText editText) { + setFocusedView(editText); + } // QtInputConnectionListener methods boolean isKeyboardVisible() @@ -283,7 +289,6 @@ class QtInputDelegate implements QtInputConnection.QtInputConnectionListener, Qt // Hiding the keyboard clears the immersive mode, so we need to set it again. if (!visibility) m_keyboardVisibilityListener.onKeyboardVisibilityChange(); - } void setFocusedView(QtEditText currentEditText) diff --git a/src/android/jar/src/org/qtproject/qt/android/QtWindow.java b/src/android/jar/src/org/qtproject/qt/android/QtWindow.java index 3b8fe4b1e96..e844a57987a 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtWindow.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtWindow.java @@ -19,6 +19,7 @@ class QtWindow extends QtLayout implements QtSurfaceInterface { private QtWindow m_parentWindow; private GestureDetector m_gestureDetector; private final QtEditText m_editText; + private final QtInputConnection.QtInputConnectionListener m_inputConnectionListener; private static native void setSurface(int windowId, Surface surface); static native void windowFocusChanged(boolean hasFocus, int id); @@ -29,6 +30,7 @@ class QtWindow extends QtLayout implements QtSurfaceInterface { super(context); setId(View.generateViewId()); m_editText = new QtEditText(context, listener); + m_inputConnectionListener = listener; setParent(parentWindow); setFocusableInTouchMode(true); addView(m_editText, new QtLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, @@ -65,7 +67,9 @@ class QtWindow extends QtLayout implements QtSurfaceInterface { @Override public boolean onTouchEvent(MotionEvent event) { - m_editText.requestFocus(); + if (m_editText != null && m_inputConnectionListener != null) + m_inputConnectionListener.onEditTextChanged(m_editText); + event.setLocation(event.getX() + getX(), event.getY() + getY()); QtInputDelegate.sendTouchEvent(event, getId()); m_gestureDetector.onTouchEvent(event);