From 495f7cceb221df25c4c627ebcee997c8a659aa40 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Mon, 6 Jan 2025 16:10:24 +0200 Subject: [PATCH] Android: cleanup refresh rate handling between java and c++ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keep refresh rate calculation and handling in one place and one method that various delegates call with a context. Also, don't try to update the refresh rate each time with setDisplayMetrics() beacuse refresh rate updates are done under the display listener's onDisplayChanged(). Task-number: QTBUG-132716 Change-Id: I689c7a1c350695c27efc6d1bcc9c159855736e43 Reviewed-by: Tor Arne Vestbø --- .../qt/android/QtActivityDelegate.java | 5 +-- .../qt/android/QtDisplayManager.java | 33 ++++++++++++------- .../qt/android/QtEmbeddedDelegate.java | 1 + .../qt/android/QtServiceEmbeddedDelegate.java | 7 ++-- .../platforms/android/androidjnimain.cpp | 3 +- 5 files changed, 27 insertions(+), 22 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 fc8b4355a89..c7fa840be78 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java @@ -145,10 +145,7 @@ class QtActivityDelegate extends QtActivityDelegateBase handleUiModeChange(m_activity.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK); - Display display = (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) - ? m_activity.getWindowManager().getDefaultDisplay() - : m_activity.getDisplay(); - QtDisplayManager.handleRefreshRateChanged(QtDisplayManager.getRefreshRate(display)); + QtDisplayManager.updateRefreshRate(m_activity); m_layout.getViewTreeObserver().addOnPreDrawListener(() -> { if (!m_inputDelegate.isKeyboardVisible()) diff --git a/src/android/jar/src/org/qtproject/qt/android/QtDisplayManager.java b/src/android/jar/src/org/qtproject/qt/android/QtDisplayManager.java index 77c7bf16b32..ab15684e702 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtDisplayManager.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtDisplayManager.java @@ -36,7 +36,7 @@ class QtDisplayManager { int availableLeftPixels, int availableTopPixels, int availableWidthPixels, int availableHeightPixels, double XDpi, double YDpi, double scaledDensity, - double density, float refreshRate); + double density); static native void handleOrientationChanged(int newRotation, int nativeOrientation); static native void handleRefreshRateChanged(float refreshRate); static native void handleUiDarkModeChanged(int newUiMode); @@ -64,11 +64,7 @@ class QtDisplayManager { @Override public void onDisplayChanged(int displayId) { - Display display = (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) - ? m_activity.getWindowManager().getDefaultDisplay() - : m_activity.getDisplay(); - float refreshRate = getRefreshRate(display); - QtDisplayManager.handleRefreshRateChanged(refreshRate); + updateRefreshRate(m_activity); QtDisplayManager.handleScreenChanged(displayId); } @@ -79,6 +75,24 @@ class QtDisplayManager { }; } + @SuppressWarnings("deprecation") + static void updateRefreshRate(Context context) + { + Display display; + Activity activity = (Activity) context; + if (activity != null) { + display = (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) + ? activity.getWindowManager().getDefaultDisplay() + : activity.getDisplay(); + } else { + final DisplayManager dm = context.getSystemService(DisplayManager.class); + display = dm.getDisplay(Display.DEFAULT_DISPLAY); + } + + float refreshRate = display != null ? display.getRefreshRate() : 60.0f; + QtDisplayManager.handleRefreshRateChanged(refreshRate); + } + static void handleOrientationChange(Activity activity) { int currentRotation = getDisplayRotation(activity); @@ -108,11 +122,6 @@ class QtDisplayManager { return Configuration.ORIENTATION_PORTRAIT; } - static float getRefreshRate(Display display) - { - return display != null ? display.getRefreshRate() : 60.0f; - } - void registerDisplayListener() { DisplayManager displayManager = @@ -306,7 +315,7 @@ class QtDisplayManager { setDisplayMetrics(maxWidth, maxHeight, insetLeft, insetTop, width, height, getXDpi(displayMetrics), getYDpi(displayMetrics), - scaledDensity, density, getRefreshRate(display)); + scaledDensity, density); } static float getXDpi(final DisplayMetrics metrics) { 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 67175370e6f..016d4b39b75 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtEmbeddedDelegate.java @@ -116,6 +116,7 @@ class QtEmbeddedDelegate extends QtActivityDelegateBase DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics(); QtDisplayManager.setApplicationDisplayMetrics(m_activity, metrics.widthPixels, metrics.heightPixels); + QtDisplayManager.updateRefreshRate(m_activity); }); } diff --git a/src/android/jar/src/org/qtproject/qt/android/QtServiceEmbeddedDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtServiceEmbeddedDelegate.java index d4489ca8081..adf83368832 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtServiceEmbeddedDelegate.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtServiceEmbeddedDelegate.java @@ -44,13 +44,12 @@ class QtServiceEmbeddedDelegate implements QtEmbeddedViewInterface, QtNative.App final int insetLeft = 0; final int insetTop = 0; - final DisplayManager dm = m_service.getSystemService(DisplayManager.class); QtDisplayManager.setDisplayMetrics( maxWidth, maxHeight, insetLeft, insetTop, maxWidth, maxHeight, QtDisplayManager.getXDpi(metrics), QtDisplayManager.getYDpi(metrics), - metrics.scaledDensity, metrics.density, - QtDisplayManager.getRefreshRate( - dm.getDisplay(Display.DEFAULT_DISPLAY))); + metrics.scaledDensity, metrics.density); + + QtDisplayManager.updateRefreshRate(m_service); }); } } diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index 29757a5a3a4..a89ab8b7ad0 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -533,7 +533,7 @@ static void setDisplayMetrics(JNIEnv * /*env*/, jclass /*clazz*/, jint screenWid jint screenHeightPixels, jint availableLeftPixels, jint availableTopPixels, jint availableWidthPixels, jint availableHeightPixels, jdouble xdpi, jdouble ydpi, - jdouble scaledDensity, jdouble density, jfloat refreshRate) + jdouble scaledDensity, jdouble density) { Q_UNUSED(availableLeftPixels) Q_UNUSED(availableTopPixels) @@ -558,7 +558,6 @@ static void setDisplayMetrics(JNIEnv * /*env*/, jclass /*clazz*/, jint screenWid } else { m_androidPlatformIntegration->setScreenSizeParameters(physicalSize, screenSize, availableGeometry); - m_androidPlatformIntegration->setRefreshRate(refreshRate); } } Q_DECLARE_JNI_NATIVE_METHOD(setDisplayMetrics)