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); handleUiModeChange(m_activity.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK);
Display display = (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) QtDisplayManager.updateRefreshRate(m_activity);
? m_activity.getWindowManager().getDefaultDisplay()
: m_activity.getDisplay();
QtDisplayManager.handleRefreshRateChanged(QtDisplayManager.getRefreshRate(display));
m_layout.getViewTreeObserver().addOnPreDrawListener(() -> { m_layout.getViewTreeObserver().addOnPreDrawListener(() -> {
if (!m_inputDelegate.isKeyboardVisible()) if (!m_inputDelegate.isKeyboardVisible())

View File

@ -36,7 +36,7 @@ class QtDisplayManager {
int availableLeftPixels, int availableTopPixels, int availableLeftPixels, int availableTopPixels,
int availableWidthPixels, int availableHeightPixels, int availableWidthPixels, int availableHeightPixels,
double XDpi, double YDpi, double scaledDensity, double XDpi, double YDpi, double scaledDensity,
double density, float refreshRate); double density);
static native void handleOrientationChanged(int newRotation, int nativeOrientation); static native void handleOrientationChanged(int newRotation, int nativeOrientation);
static native void handleRefreshRateChanged(float refreshRate); static native void handleRefreshRateChanged(float refreshRate);
static native void handleUiDarkModeChanged(int newUiMode); static native void handleUiDarkModeChanged(int newUiMode);
@ -64,11 +64,7 @@ class QtDisplayManager {
@Override @Override
public void onDisplayChanged(int displayId) { public void onDisplayChanged(int displayId) {
Display display = (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) updateRefreshRate(m_activity);
? m_activity.getWindowManager().getDefaultDisplay()
: m_activity.getDisplay();
float refreshRate = getRefreshRate(display);
QtDisplayManager.handleRefreshRateChanged(refreshRate);
QtDisplayManager.handleScreenChanged(displayId); 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) static void handleOrientationChange(Activity activity)
{ {
int currentRotation = getDisplayRotation(activity); int currentRotation = getDisplayRotation(activity);
@ -108,11 +122,6 @@ class QtDisplayManager {
return Configuration.ORIENTATION_PORTRAIT; return Configuration.ORIENTATION_PORTRAIT;
} }
static float getRefreshRate(Display display)
{
return display != null ? display.getRefreshRate() : 60.0f;
}
void registerDisplayListener() void registerDisplayListener()
{ {
DisplayManager displayManager = DisplayManager displayManager =
@ -306,7 +315,7 @@ class QtDisplayManager {
setDisplayMetrics(maxWidth, maxHeight, insetLeft, insetTop, setDisplayMetrics(maxWidth, maxHeight, insetLeft, insetTop,
width, height, getXDpi(displayMetrics), getYDpi(displayMetrics), width, height, getXDpi(displayMetrics), getYDpi(displayMetrics),
scaledDensity, density, getRefreshRate(display)); scaledDensity, density);
} }
static float getXDpi(final DisplayMetrics metrics) { static float getXDpi(final DisplayMetrics metrics) {

View File

@ -116,6 +116,7 @@ class QtEmbeddedDelegate extends QtActivityDelegateBase
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics(); DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
QtDisplayManager.setApplicationDisplayMetrics(m_activity, metrics.widthPixels, QtDisplayManager.setApplicationDisplayMetrics(m_activity, metrics.widthPixels,
metrics.heightPixels); metrics.heightPixels);
QtDisplayManager.updateRefreshRate(m_activity);
}); });
} }

View File

@ -44,13 +44,12 @@ class QtServiceEmbeddedDelegate implements QtEmbeddedViewInterface, QtNative.App
final int insetLeft = 0; final int insetLeft = 0;
final int insetTop = 0; final int insetTop = 0;
final DisplayManager dm = m_service.getSystemService(DisplayManager.class);
QtDisplayManager.setDisplayMetrics( QtDisplayManager.setDisplayMetrics(
maxWidth, maxHeight, insetLeft, insetTop, maxWidth, maxHeight, maxWidth, maxHeight, insetLeft, insetTop, maxWidth, maxHeight,
QtDisplayManager.getXDpi(metrics), QtDisplayManager.getYDpi(metrics), QtDisplayManager.getXDpi(metrics), QtDisplayManager.getYDpi(metrics),
metrics.scaledDensity, metrics.density, metrics.scaledDensity, metrics.density);
QtDisplayManager.getRefreshRate(
dm.getDisplay(Display.DEFAULT_DISPLAY))); QtDisplayManager.updateRefreshRate(m_service);
}); });
} }
} }

View File

@ -533,7 +533,7 @@ static void setDisplayMetrics(JNIEnv * /*env*/, jclass /*clazz*/, jint screenWid
jint screenHeightPixels, jint availableLeftPixels, jint screenHeightPixels, jint availableLeftPixels,
jint availableTopPixels, jint availableWidthPixels, jint availableTopPixels, jint availableWidthPixels,
jint availableHeightPixels, jdouble xdpi, jdouble ydpi, jint availableHeightPixels, jdouble xdpi, jdouble ydpi,
jdouble scaledDensity, jdouble density, jfloat refreshRate) jdouble scaledDensity, jdouble density)
{ {
Q_UNUSED(availableLeftPixels) Q_UNUSED(availableLeftPixels)
Q_UNUSED(availableTopPixels) Q_UNUSED(availableTopPixels)
@ -558,7 +558,6 @@ static void setDisplayMetrics(JNIEnv * /*env*/, jclass /*clazz*/, jint screenWid
} else { } else {
m_androidPlatformIntegration->setScreenSizeParameters(physicalSize, screenSize, m_androidPlatformIntegration->setScreenSizeParameters(physicalSize, screenSize,
availableGeometry); availableGeometry);
m_androidPlatformIntegration->setRefreshRate(refreshRate);
} }
} }
Q_DECLARE_JNI_NATIVE_METHOD(setDisplayMetrics) Q_DECLARE_JNI_NATIVE_METHOD(setDisplayMetrics)