diff options
| author | Assam Boudjelthia <[email protected]> | 2025-08-30 04:59:52 +0300 |
|---|---|---|
| committer | Assam Boudjelthia <[email protected]> | 2025-09-06 01:27:38 +0300 |
| commit | e2a9ab46d39d442b198fe77d13153b8fc6b64a35 (patch) | |
| tree | 381642a97e1c2ccb742034e252b31b0ae4073813 /src/plugins/platforms/android | |
| parent | 357580c2253b2e1e5c09170a249cc59b2da30677 (diff) | |
Android: report margins only when window is under unsafe area
To avoid reporting margins/insets when it's not needed, like for some
older Android versions, or to avoid wrong or improperly handled resize
events, we only report the margins values for a window to reach the
safe, otherwise, we could end up with extra padding from Qt safe margins
and the system padding.
Also, to ensure the root view location is up-to-date and avoid going
into a race condition, we post() the safe margins reporting to the
root view that way we ensure it's done after the root view has gone
through the resize event.
On safeAreaMarginsChanged() JNI implementation, don't do JNI calls
to get the margin values unless the relevant platform window is found.
Fixes: QTBUG-135808
Pick-to: 6.9 6.10
Change-Id: Idda072b8ebbd019c54ae6ae45f672bc7abb195b7
Reviewed-by: Tor Arne Vestbø <[email protected]>
Diffstat (limited to 'src/plugins/platforms/android')
| -rw-r--r-- | src/plugins/platforms/android/qandroidplatformwindow.cpp | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/src/plugins/platforms/android/qandroidplatformwindow.cpp b/src/plugins/platforms/android/qandroidplatformwindow.cpp index 1989ecdee3c..de0271edb56 100644 --- a/src/plugins/platforms/android/qandroidplatformwindow.cpp +++ b/src/plugins/platforms/android/qandroidplatformwindow.cpp @@ -397,28 +397,33 @@ void QAndroidPlatformWindow::safeAreaMarginsChanged(JNIEnv *env, jobject object, if (!qGuiApp) return; - QMargins safeMargins; - if (insets.isValid()) { - safeMargins = QMargins( - insets.getField<int>("left"), - insets.getField<int>("top"), - insets.getField<int>("right"), - insets.getField<int>("bottom")); - } + if (!insets.isValid()) + return; + QAndroidPlatformWindow *pWindow = nullptr; for (QWindow *window : qGuiApp->allWindows()) { if (!window->handle()) continue; - QAndroidPlatformWindow *pWindow = static_cast<QAndroidPlatformWindow *>(window->handle()); - if (pWindow->nativeViewId() != id) - continue; - - if (safeMargins != pWindow->safeAreaMargins()) { - pWindow->setSafeAreaMargins(safeMargins); - QWindowSystemInterface::handleSafeAreaMarginsChanged(window); + QAndroidPlatformWindow *pw = static_cast<QAndroidPlatformWindow *>(window->handle()); + if (pw->nativeViewId() == id) { + pWindow = pw; break; } } + + if (!pWindow) + return; + + QMargins safeMargins = QMargins( + insets.getField<int>("left"), + insets.getField<int>("top"), + insets.getField<int>("right"), + insets.getField<int>("bottom")); + + if (safeMargins != pWindow->safeAreaMargins()) { + pWindow->setSafeAreaMargins(safeMargins); + QWindowSystemInterface::handleSafeAreaMarginsChanged(pWindow->window()); + } } static void updateWindows(JNIEnv *env, jobject object) |
