From e402e1103b874c0bf91a1bc754752ee73ffadf33 Mon Sep 17 00:00:00 2001 From: Bartlomiej Moskal Date: Tue, 23 Mar 2021 10:08:20 +0100 Subject: [PATCH 1/3] Android: fix for isSoftwareKeyboard method isSoftwareKeyboard() method will rely on visibility flag from activityDelegate. In such case it also need to consider that keyboard is during the hiding. Fix the regression related with commit: e6ca200a3a0aecc2313becf959c1be4fe18bdfa1 Before this change Software Keyboard is not showing after changing the focus. It is happening when Keyboard is already visible and focus is changed to widget that also need the keyboard. In such case keyboard is hiding (and NOT showing again). Pick-to: 5.15 Fixes: QTBUG-92051 Change-Id: I6a5d07b25442429fda6e715d09ea104432c5ef50 Reviewed-by: Rami Potinkara Reviewed-by: Ville Voutilainen --- .../qtproject/qt/android/QtActivityDelegate.java | 7 ++++++- .../src/org/qtproject/qt/android/QtNative.java | 16 +++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java index c473c1f78b7..e9efd064975 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java @@ -209,6 +209,11 @@ public class QtActivityDelegate } } + public boolean isKeyboardVisible() + { + return m_keyboardIsVisible; + } + // input method hints - must be kept in sync with QTDIR/src/corelib/global/qnamespace.h private final int ImhHiddenText = 0x1; private final int ImhSensitiveData = 0x2; @@ -260,7 +265,7 @@ public class QtActivityDelegate if (m_keyboardIsVisible == visibility) return false; m_keyboardIsVisible = visibility; - QtNative.keyboardVisibilityChanged(m_keyboardIsVisible); + QtNative.keyboardVisibilityUpdated(m_keyboardIsVisible); if (visibility == false) updateFullScreen(); // Hiding the keyboard clears the immersive mode, so we need to set it again. diff --git a/src/android/jar/src/org/qtproject/qt/android/QtNative.java b/src/android/jar/src/org/qtproject/qt/android/QtNative.java index 5aa3997f91a..56cf0cca8a5 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtNative.java @@ -99,6 +99,7 @@ public class QtNative public static final String QtTAG = "Qt JAVA"; // string used for Log.x private static ArrayList m_lostActions = new ArrayList(); // a list containing all actions which could not be performed (e.g. the main activity is destroyed, etc.) private static boolean m_started = false; + private static boolean m_isKeyboardHiding = false; private static int m_displayMetricsScreenWidthPixels = 0; private static int m_displayMetricsScreenHeightPixels = 0; private static int m_displayMetricsAvailableLeftPixels = 0; @@ -930,6 +931,7 @@ public class QtNative private static void hideSoftwareKeyboard() { + m_isKeyboardHiding = true; runAction(new Runnable() { @Override public void run() { @@ -954,13 +956,7 @@ public class QtNative public static boolean isSoftwareKeyboardVisible() { - Activity activity = QtNative.activity(); - Rect r = new Rect(); - activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(r); - DisplayMetrics metrics = new DisplayMetrics(); - activity.getWindowManager().getDefaultDisplay().getMetrics(metrics); - final int kbHeight = metrics.heightPixels - r.bottom; - return (kbHeight >= KEYBOARD_HEIGHT_THRESHOLD); + return m_activityDelegate.isKeyboardVisible() && !m_isKeyboardHiding; } private static void notifyAccessibilityLocationChange() @@ -1327,6 +1323,12 @@ public class QtNative }); } + public static void keyboardVisibilityUpdated(boolean visibility) + { + m_isKeyboardHiding = false; + keyboardVisibilityChanged(visibility); + } + private static String[] listAssetContent(android.content.res.AssetManager asset, String path) { String [] list; ArrayList res = new ArrayList(); From 547228bf86281733c09a0638c57a4384c664f66e Mon Sep 17 00:00:00 2001 From: Bartlomiej Moskal Date: Thu, 18 Mar 2021 07:54:20 +0100 Subject: [PATCH 2/3] Android: fix wrong position of cursor hander in split screen Use activity window position to fix position of cursor hander. In case without splti sceen, position of activity window is equal (0, 0), so it does not have any effect. Fixes: QTBUG-91362 Pick-to: 5.15 Change-Id: Icae9f19308112a78bdddf168abe81ffe7b6e4fae Reviewed-by: Rami Potinkara Reviewed-by: Ville Voutilainen --- .../src/org/qtproject/qt/android/CursorHandle.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/android/jar/src/org/qtproject/qt/android/CursorHandle.java b/src/android/jar/src/org/qtproject/qt/android/CursorHandle.java index fd650a149c0..dbadf7502d9 100644 --- a/src/android/jar/src/org/qtproject/qt/android/CursorHandle.java +++ b/src/android/jar/src/org/qtproject/qt/android/CursorHandle.java @@ -159,11 +159,15 @@ public class CursorHandle implements ViewTreeObserver.OnPreDrawListener public void setPosition(final int x, final int y){ initOverlay(); - final int[] location = new int[2]; - m_layout.getLocationOnScreen(location); + final int[] layoutLocation = new int[2]; + m_layout.getLocationOnScreen(layoutLocation); - int x2 = x + location[0]; - int y2 = y + location[1] + m_yShift; + // This value is used for handling split screen case + final int[] activityLocation = new int[2]; + m_activity.getWindow().getDecorView().getLocationOnScreen(activityLocation); + + int x2 = x + layoutLocation[0] - activityLocation[0]; + int y2 = y + layoutLocation[1] + m_yShift - activityLocation[1]; if (m_id == QtNative.IdCursorHandle) { x2 -= m_popup.getWidth() / 2 ; From e05d666d42dcda1fb97cec7039130ee118044c12 Mon Sep 17 00:00:00 2001 From: Fabian Kosmale Date: Thu, 25 Mar 2021 13:59:55 +0100 Subject: [PATCH 3/3] QMetaType::id(): Fix ABI breakage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We cannot replace a non-inline method with an inline one without breaking the ABI. Instead, we now create a version with a dummy int parameter (to avoid ODR violations), and hide the non-inline version behind an ifdef, so that it is only visible in qmetatype.cpp. Pick-to: 6.1 Change-Id: Ib4e82e44071bdf5c37227409a56d377ff2e07ee0 Reviewed-by: MÃ¥rten Nordheim Reviewed-by: Ulf Hermann Reviewed-by: Qt CI Bot --- src/corelib/CMakeLists.txt | 2 ++ src/corelib/kernel/qmetatype.cpp | 14 ++++++++++++++ src/corelib/kernel/qmetatype.h | 8 +++++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/corelib/CMakeLists.txt b/src/corelib/CMakeLists.txt index d8baa4952bf..1a9a690f427 100644 --- a/src/corelib/CMakeLists.txt +++ b/src/corelib/CMakeLists.txt @@ -264,6 +264,8 @@ qt_internal_add_module(Core # special case end ) +qt_update_ignore_pch_source(Core kernel/qmetatype.cpp ) + # special case begin add_dependencies(Core qmodule_pri) add_dependencies(Core ${QT_CMAKE_EXPORT_NAMESPACE}::moc) diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index 60fe6149223..9554a844f1c 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -37,7 +37,9 @@ ** ****************************************************************************/ +#define QT_QMETATYPE_BC_COMPAT 1 #include "qmetatype.h" +#undef QT_QMETATYPE_BC_COMPAT #include "qmetatype_p.h" #include "qobjectdefs.h" #include "qdatetime.h" @@ -489,6 +491,18 @@ bool QMetaType::isRegistered() const Returns id type hold by this QMetatype instance. */ +// keep in sync with version in header +// ### Qt 7::remove BC helper +int QMetaType::id() const +{ + if (d_ptr) { + if (int id = d_ptr->typeId.loadRelaxed()) + return id; + return idHelper(); + } + return 0; +} + /*! \internal The slowpath of id(). Precondition: d_ptr != nullptr diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index fe68a15e5a4..c08a87efd95 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -444,7 +444,12 @@ public: bool isValid() const; bool isRegistered() const; - int id() const +#if defined(QT_QMETATYPE_BC_COMPAT) + int id() const; +#else + // ### Qt 7: Remove traces of out of line version + // unused int parameter is used to avoid ODR violation + int id(int = 0) const { if (d_ptr) { if (int id = d_ptr->typeId.loadRelaxed()) @@ -453,6 +458,7 @@ public: } return 0; }; +#endif constexpr qsizetype sizeOf() const; constexpr qsizetype alignOf() const; constexpr TypeFlags flags() const;