diff --git a/src/android/jar/src/org/qtproject/qt/android/QtView.java b/src/android/jar/src/org/qtproject/qt/android/QtView.java index 9a43b8aa743..d7c2ad5bcf1 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtView.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtView.java @@ -40,6 +40,7 @@ abstract class QtView extends QtLayout { abstract protected void createWindow(long parentWindowRef); private static native void setWindowVisible(long windowReference, boolean visible); + private static native void resizeWindow(long windowReference, int width, int height); /** * Create QtView for embedding a QWindow. Instantiating a QtView will load the Qt libraries @@ -59,6 +60,20 @@ abstract class QtView extends QtLayout { QtEmbeddedLoader loader = new QtEmbeddedLoader(context); m_delegate = QtEmbeddedDelegateFactory.create((Activity)context); loader.setMainLibraryName(appLibName); + addOnLayoutChangeListener(new View.OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, + int oldLeft, int oldTop, int oldRight, int oldBottom) { + if (m_windowReference != 0L) { + final int oldWidth = oldRight - oldLeft; + final int oldHeight = oldBottom - oldTop; + final int newWidth = right - left; + final int newHeight = bottom - top; + if (oldWidth != newWidth || oldHeight != newHeight) + resizeWindow(m_windowReference, right - left, bottom - top); + } + } + }); loader.loadQtLibraries(); // Start Native Qt application m_delegate.startNativeApplication(loader.getApplicationParameters(), diff --git a/src/plugins/platforms/android/androidwindowembedding.cpp b/src/plugins/platforms/android/androidwindowembedding.cpp index 7d82ac6d87e..e72bb326ccc 100644 --- a/src/plugins/platforms/android/androidwindowembedding.cpp +++ b/src/plugins/platforms/android/androidwindowembedding.cpp @@ -45,6 +45,13 @@ namespace QtAndroidWindowEmbedding { }); } + void resizeWindow(JNIEnv *, jclass, jlong windowRef, jint width, jint height) + { + QWindow *window = reinterpret_cast(windowRef); + window->setWidth(width); + window->setHeight(height); + } + bool registerNatives(QJniEnvironment& env) { using namespace QtJniTypes; bool success = env.registerNativeMethods(Traits::className(), @@ -52,7 +59,8 @@ namespace QtAndroidWindowEmbedding { Q_JNI_NATIVE_SCOPED_METHOD(deleteWindow, QtAndroidWindowEmbedding)}); success &= env.registerNativeMethods(Traits::className(), - {Q_JNI_NATIVE_SCOPED_METHOD(setWindowVisible, QtAndroidWindowEmbedding)}); + {Q_JNI_NATIVE_SCOPED_METHOD(setWindowVisible, QtAndroidWindowEmbedding), + Q_JNI_NATIVE_SCOPED_METHOD(resizeWindow, QtAndroidWindowEmbedding)}); return success; } diff --git a/src/plugins/platforms/android/androidwindowembedding.h b/src/plugins/platforms/android/androidwindowembedding.h index f9d92d4afc1..4f3261a30bd 100644 --- a/src/plugins/platforms/android/androidwindowembedding.h +++ b/src/plugins/platforms/android/androidwindowembedding.h @@ -31,6 +31,8 @@ namespace QtAndroidWindowEmbedding Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(deleteWindow) void setWindowVisible(JNIEnv *, jclass, jlong window, jboolean visible); Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(setWindowVisible) + void resizeWindow(JNIEnv *, jclass, jlong windowRef, jint width, jint height); + Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(resizeWindow) }; QT_END_NAMESPACE