From 4cbef8822a1c20432a7842ef71f1603741daedd2 Mon Sep 17 00:00:00 2001 From: Bartlomiej Moskal Date: Wed, 2 Oct 2024 21:21:55 +0200 Subject: [PATCH] Android: Ensure that Layout params are applied on editText Make sure that the Layout parameters are applied to the editText before opening the Popup (in openContextMenu method). Without them, it may cause incorrect behavior. Especially in the case of the error: "E BufferLayer: dimension too large 212x9957 E SurfaceFlinger: createBufferLayer() failed (Invalid argument) E SurfaceComposerClinet: SurfaceComposerClien::createSurface error Invalid argument" It may cause crash. Fixes: QTBUG-129770 Change-Id: Ib9ef4b5b77fb1faf196e56431976c2a0e6e4a1e2 Reviewed-by: Petri Virkkunen Reviewed-by: Assam Boudjelthia (cherry picked from commit 0d4778497ee13f93ecaff9036ee7f5f6d24bb2a3) Reviewed-by: Qt Cherry-pick Bot --- .../qt/android/QtActivityDelegate.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 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 4c7dae4f323..14babfc7dfc 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java @@ -310,13 +310,21 @@ class QtActivityDelegate extends QtActivityDelegateBase return; } m_layout.setLayoutParams(focusedEditText, new QtLayout.LayoutParams(w, h, x, y), false); - PopupMenu popup = new PopupMenu(m_activity, focusedEditText); - QtActivityDelegate.this.onCreatePopupMenu(popup.getMenu()); - popup.setOnMenuItemClickListener(menuItem -> - m_activity.onContextItemSelected(menuItem)); - popup.setOnDismissListener(popupMenu -> - m_activity.onContextMenuClosed(popupMenu.getMenu())); - popup.show(); + focusedEditText.requestLayout(); + focusedEditText.getViewTreeObserver().addOnGlobalLayoutListener( + new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + focusedEditText.getViewTreeObserver().removeOnGlobalLayoutListener(this); + PopupMenu popup = new PopupMenu(m_activity, focusedEditText); + QtActivityDelegate.this.onCreatePopupMenu(popup.getMenu()); + popup.setOnMenuItemClickListener(menuItem -> + m_activity.onContextItemSelected(menuItem)); + popup.setOnDismissListener(popupMenu -> + m_activity.onContextMenuClosed(popupMenu.getMenu())); + popup.show(); + } + }); }, 100); } // QtMenuInterface implementation end