From e47180b46d10813f97657b2e2af49bfe17a5f2e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tinja=20Paavosepp=C3=A4?= Date: Wed, 10 Jan 2024 12:59:13 +0200 Subject: [PATCH] Android: Handle embedding container windows better Initialize surface container type to TextureView to make sure it's set also for embedding containers. Additional checks for embedding containers when setting parent or changing visibility. Change-Id: Iba07bfbb9e8f16804627efbdfe78559ac2580e41 Reviewed-by: Assam Boudjelthia (cherry picked from commit 46b86410a9730b099fa350516c3902db0ee01291) Reviewed-by: Qt Cherry-pick Bot --- .../android/qandroidplatformforeignwindow.cpp | 8 ++++-- .../android/qandroidplatformwindow.cpp | 26 ++++++++++++------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/plugins/platforms/android/qandroidplatformforeignwindow.cpp b/src/plugins/platforms/android/qandroidplatformforeignwindow.cpp index befc8d4d00f..e84a481a2b1 100644 --- a/src/plugins/platforms/android/qandroidplatformforeignwindow.cpp +++ b/src/plugins/platforms/android/qandroidplatformforeignwindow.cpp @@ -48,12 +48,16 @@ void QAndroidPlatformForeignWindow::setGeometry(const QRect &rect) void QAndroidPlatformForeignWindow::setVisible(bool visible) { - if (!m_view.isValid() || isEmbeddingContainer()) + if (isEmbeddingContainer()) { + QAndroidPlatformWindow::setVisible(visible); + return; + } + + if (!m_view.isValid()) return; QtAndroid::setViewVisibility(m_view.object(), visible); - QAndroidPlatformWindow::setVisible(visible); if (!visible && m_nativeViewInserted) { m_nativeQtWindow.callMethod("removeNativeView"); m_nativeViewInserted = false; diff --git a/src/plugins/platforms/android/qandroidplatformwindow.cpp b/src/plugins/platforms/android/qandroidplatformwindow.cpp index 81968097726..8c6158a030d 100644 --- a/src/plugins/platforms/android/qandroidplatformwindow.cpp +++ b/src/plugins/platforms/android/qandroidplatformwindow.cpp @@ -17,7 +17,8 @@ QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(lcQpaWindow, "qt.qpa.window") QAndroidPlatformWindow::QAndroidPlatformWindow(QWindow *window) - : QPlatformWindow(window), m_nativeQtWindow(nullptr), m_nativeParentQtWindow(nullptr), + : QPlatformWindow(window), m_nativeQtWindow(nullptr), + m_surfaceContainerType(SurfaceContainer::TextureView), m_nativeParentQtWindow(nullptr), m_androidSurfaceObject(nullptr) { m_windowFlags = Qt::Widget; @@ -48,8 +49,11 @@ QAndroidPlatformWindow::QAndroidPlatformWindow(QWindow *window) if (isEmbeddingContainer()) return; - if (parent()) - m_nativeParentQtWindow = static_cast(parent())->nativeWindow(); + if (parent()) { + QAndroidPlatformWindow *androidParent = static_cast(parent()); + if (!androidParent->isEmbeddingContainer()) + m_nativeParentQtWindow = androidParent->nativeWindow(); + } m_nativeQtWindow = QJniObject::construct( QNativeInterface::QAndroidApplication::context(), @@ -62,9 +66,7 @@ QAndroidPlatformWindow::QAndroidPlatformWindow(QWindow *window) // TODO should handle case where this changes at runtime -> need to change existing window // into TextureView (or perhaps not, if the parent window would be SurfaceView, as long as // onTop was false it would stay below the children) - if (platformScreen()->windows().size() > 1) - m_surfaceContainerType = SurfaceContainer::TextureView; - else + if (platformScreen()->windows().size() <= 1) m_surfaceContainerType = SurfaceContainer::SurfaceView; } @@ -114,6 +116,8 @@ void QAndroidPlatformWindow::setGeometry(const QRect &rect) void QAndroidPlatformWindow::setVisible(bool visible) { + if (isEmbeddingContainer()) + return; m_nativeQtWindow.callMethod("setVisible", visible); if (visible) { @@ -164,20 +168,22 @@ Qt::WindowFlags QAndroidPlatformWindow::windowFlags() const void QAndroidPlatformWindow::setParent(const QPlatformWindow *window) { using namespace QtJniTypes; + if (window) { + auto androidWindow = static_cast(window); + if (androidWindow->isEmbeddingContainer()) + return; // If we were a top level window, remove from screen if (!m_nativeParentQtWindow.isValid()) platformScreen()->removeWindow(this); - const QAndroidPlatformWindow *androidWindow = - static_cast(window); const QtWindow parentWindow = androidWindow->nativeWindow(); // If this was a child window of another window, the java method takes care of that m_nativeQtWindow.callMethod("setParent", parentWindow.object()); m_nativeParentQtWindow = parentWindow; - } else { - m_nativeQtWindow.callMethod("setParent", nullptr); + } else if (QtAndroid::isQtApplication()) { platformScreen()->addWindow(this); + m_nativeQtWindow.callMethod("setParent", nullptr); m_nativeParentQtWindow = QJniObject(); } }