diff --git a/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java b/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java index b875459ea2a..01635aadfb4 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java @@ -143,7 +143,7 @@ public class QtActivityBase extends Activity QtNative.setApplicationState(QtNative.ApplicationState.ApplicationActive); if (QtNative.getStateDetails().isStarted) { m_delegate.displayManager().registerDisplayListener(); - QtNative.updateWindow(); + QtWindow.updateWindows(); // Suspending the app clears the immersive mode, so we need to set it again. m_delegate.displayManager().updateFullScreen(); } 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 685a708b7a6..577f60ba99a 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java @@ -90,7 +90,7 @@ class QtActivityDelegate extends QtActivityDelegateBase if (m_layout != null) { m_displayManager.setSystemUiVisibility(systemUiVisibility); m_layout.requestLayout(); - QtNative.updateWindow(); + QtWindow.updateWindows(); } }); } 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 381f2f17701..fb1ddd9907e 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java @@ -42,7 +42,7 @@ class QtEmbeddedDelegate extends QtActivityDelegateBase public void onActivityResumed(Activity activity) { if (m_activity == activity && m_stateDetails.isStarted) { QtNative.setApplicationState(ApplicationActive); - QtNative.updateWindow(); + QtWindow.updateWindows(); } } 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 771ec5d2e6f..461bf8a77a4 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtNative.java @@ -437,10 +437,6 @@ public class QtNative static native boolean updateNativeActivity(); // application methods - // window methods - static native void updateWindow(); - // window methods - // application methods static native void updateApplicationState(int state); static native void updateLocale(); diff --git a/src/android/jar/src/org/qtproject/qt/android/QtWindow.java b/src/android/jar/src/org/qtproject/qt/android/QtWindow.java index 19ad204a086..26536956fe4 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtWindow.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtWindow.java @@ -26,6 +26,7 @@ class QtWindow extends QtLayout implements QtSurfaceInterface { private static native void setSurface(int windowId, Surface surface); static native void windowFocusChanged(boolean hasFocus, int id); + static native void updateWindows(); QtWindow(Context context, boolean isForeignWindow, QtWindow parentWindow, QtInputConnection.QtInputConnectionListener listener) diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index cac1bb8c987..e6ca37de202 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -581,26 +581,6 @@ static void setDisplayMetrics(JNIEnv * /*env*/, jclass /*clazz*/, jint screenWid } Q_DECLARE_JNI_NATIVE_METHOD(setDisplayMetrics) -static void updateWindow(JNIEnv */*env*/, jobject /*thiz*/) -{ - if (!m_androidPlatformIntegration) - return; - - if (QGuiApplication::instance() != nullptr) { - const auto tlw = QGuiApplication::topLevelWindows(); - for (QWindow *w : tlw) { - - // Skip non-platform windows, e.g., offscreen windows. - if (!w->handle()) - continue; - - QRect availableGeometry = w->screen()->availableGeometry(); - if (w->geometry().width() > 0 && w->geometry().height() > 0 && availableGeometry.width() > 0 && availableGeometry.height() > 0) - QWindowSystemInterface::handleExposeEvent(w, QRegion(QRect(QPoint(), w->geometry().size()))); - } - } -} - static void updateApplicationState(JNIEnv */*env*/, jobject /*thiz*/, jint state) { QMutexLocker lock(&m_platformMutex); @@ -745,7 +725,6 @@ static JNINativeMethod methods[] = { { "quitQtCoreApplication", "()V", (void *)quitQtCoreApplication }, { "terminateQt", "()V", (void *)terminateQt }, { "waitForServiceSetup", "()V", (void *)waitForServiceSetup }, - { "updateWindow", "()V", (void *)updateWindow }, { "updateApplicationState", "(I)V", (void *)updateApplicationState }, { "onActivityResult", "(IILandroid/content/Intent;)V", (void *)onActivityResult }, { "onNewIntent", "(Landroid/content/Intent;)V", (void *)onNewIntent }, diff --git a/src/plugins/platforms/android/qandroidplatformwindow.cpp b/src/plugins/platforms/android/qandroidplatformwindow.cpp index 58fc68ee122..edbbbd95e07 100644 --- a/src/plugins/platforms/android/qandroidplatformwindow.cpp +++ b/src/plugins/platforms/android/qandroidplatformwindow.cpp @@ -382,6 +382,34 @@ void QAndroidPlatformWindow::windowFocusChanged(JNIEnv *env, jobject object, } } +static void updateWindows(JNIEnv *env, jobject object) +{ + Q_UNUSED(env) + Q_UNUSED(object) + + if (QGuiApplication::instance() != nullptr) { + const auto tlw = QGuiApplication::topLevelWindows(); + for (QWindow *w : tlw) { + + // Skip non-platform windows, e.g., offscreen windows. + if (!w->handle()) + continue; + + const QRect availableGeometry = w->screen()->availableGeometry(); + const QRect geometry = w->geometry(); + const bool isPositiveGeometry = (geometry.width() > 0 && geometry.height() > 0); + const bool isPositiveAvailableGeometry = + (availableGeometry.width() > 0 && availableGeometry.height() > 0); + + if (isPositiveGeometry && isPositiveAvailableGeometry) { + const QRegion region = QRegion(QRect(QPoint(), w->geometry().size())); + QWindowSystemInterface::handleExposeEvent(w, region); + } + } + } +} +Q_DECLARE_JNI_NATIVE_METHOD(updateWindows) + /* Due to calls originating from Android, it is possible for native methods to try to manipulate any given instance of QAndroidPlatformWindow when it is @@ -398,6 +426,7 @@ bool QAndroidPlatformWindow::registerNatives(QJniEnvironment &env) { if (!env.registerNativeMethods(QtJniTypes::Traits::className(), { + Q_JNI_NATIVE_METHOD(updateWindows), Q_JNI_NATIVE_SCOPED_METHOD(setSurface, QAndroidPlatformWindow), Q_JNI_NATIVE_SCOPED_METHOD(windowFocusChanged, QAndroidPlatformWindow) })) {