Android: cleanup refresh rate handling between java and c++

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ø <tor.arne.vestbo@qt.io>
This commit is contained in:
Assam Boudjelthia 2025-01-06 16:10:24 +02:00
parent 2d2b9fea7d
commit 495f7cceb2
5 changed files with 27 additions and 22 deletions

View File

@ -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())

View File

@ -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) {

View File

@ -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);
});
}

View File

@ -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);
});
}
}

View File

@ -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)