From d77e099200f564e664519e85692a8141545d60b5 Mon Sep 17 00:00:00 2001 From: Ahmed El Khazari Date: Wed, 17 Apr 2024 13:21:54 +0300 Subject: [PATCH] Android: Fix crash when selecting text on a TextField The crash is due to absence of the helper class that manages the selection in QtInputDelegate. As a fix, updateInputDelegate() is introduced when setView(), where the instantiation and clearance of EditPopupMenu is made. On the other hand, the nullity of EditPopupMenu in QTEmbeddedDelegate is handled. Fixes: QTBUG-122740 Change-Id: Iac5cded7be7530dde8c739265fc9402670714d39 Reviewed-by: Assam Boudjelthia (cherry picked from commit a87764789feaa0575b9f4f0957bb7ec3e3b9a4d1) Reviewed-by: Qt Cherry-pick Bot --- .../org/qtproject/qt/android/QtEmbeddedDelegate.java | 10 ++++++++++ .../src/org/qtproject/qt/android/QtInputDelegate.java | 11 ++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java index 2d0ea84b9e8..d71a8c10ec6 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java @@ -143,10 +143,20 @@ class QtEmbeddedDelegate extends QtActivityDelegateBase implements QtNative.AppS void setView(QtView view) { m_view = view; + updateInputDelegate(); if (m_view != null) registerGlobalFocusChangeListener(m_view); } + private void updateInputDelegate() { + if (m_view == null) { + m_inputDelegate.setEditPopupMenu(null); + return; + } + m_inputDelegate.setEditPopupMenu(new EditPopupMenu(m_activity, m_view)); + } + + public void setRootWindowRef(long ref) { m_rootWindowRef = ref; } 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 cd1b675f2e9..5327049f444 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtInputDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtInputDelegate.java @@ -405,12 +405,13 @@ public class QtInputDelegate implements QtInputConnection.QtInputConnectionListe if (!QtClipboardManager.hasClipboardText(activity)) editButtons &= ~EditContextView.PASTE_BUTTON; - if ((mode & CursorHandleShowEdit) == CursorHandleShowEdit && editButtons != 0) { - m_editPopupMenu.setPosition(editX, editY, editButtons, - m_cursorHandle, m_leftSelectionHandle, m_rightSelectionHandle); - } else { - if (m_editPopupMenu != null) + if (m_editPopupMenu != null) { + if ((mode & CursorHandleShowEdit) == CursorHandleShowEdit && editButtons != 0) { + m_editPopupMenu.setPosition(editX, editY, editButtons, + m_cursorHandle, m_leftSelectionHandle, m_rightSelectionHandle); + } else { m_editPopupMenu.hide(); + } } }