Android: de-duplicate display size calculation code

Same logic for calculating the display's size is done in few places
while being simple duplication, this de-duplicate it.

Task-number: QTBUG-132716
Change-Id: I9e65a271fdce1769316f4e05012faf7f194b81b1
Reviewed-by: Petri Virkkunen <petri.virkkunen@qt.io>
This commit is contained in:
Assam Boudjelthia 2025-01-06 17:00:15 +02:00
parent 95c21244cc
commit 9920c33500
2 changed files with 22 additions and 34 deletions

View File

@ -251,21 +251,25 @@ class QtDisplayManager {
}
@UsedFromNativeCode
static Size getDisplaySize(Context displayContext, Display display)
@SuppressWarnings("deprecation")
static Size getDisplaySize(Context context, Display display)
{
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
DisplayMetrics realMetrics = new DisplayMetrics();
display.getRealMetrics(realMetrics);
return new Size(realMetrics.widthPixels, realMetrics.heightPixels);
}
if (display == null || context == null)
return new Size(0, 0);
Context windowsContext = displayContext.createWindowContext(
WindowManager.LayoutParams.TYPE_APPLICATION, null);
WindowManager windowManager =
(WindowManager) windowsContext.getSystemService(Context.WINDOW_SERVICE);
WindowMetrics windowsMetrics = windowManager.getCurrentWindowMetrics();
Rect bounds = windowsMetrics.getBounds();
return new Size(bounds.width(), bounds.height());
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
final DisplayMetrics metrics = new DisplayMetrics();
display.getRealMetrics(metrics);
return new Size(metrics.widthPixels, metrics.heightPixels);
} else {
Context displayContext = context.createDisplayContext(display);
Context windowsContext = displayContext.createWindowContext(
WindowManager.LayoutParams.TYPE_APPLICATION, null);
WindowManager windowManager = (WindowManager) windowsContext.getSystemService(
Context.WINDOW_SERVICE);
Rect bounds = windowManager.getMaximumWindowMetrics().getBounds();
return new Size(bounds.width(), bounds.height());
}
}
static void setApplicationDisplayMetrics(Activity activity, int width, int height)
@ -274,28 +278,14 @@ class QtDisplayManager {
return;
final WindowInsets rootInsets = activity.getWindow().getDecorView().getRootWindowInsets();
final WindowManager windowManager = activity.getWindowManager();
Display display = QtDisplayManager.getDisplay(activity);
int insetLeft;
int insetTop;
int maxWidth;
int maxHeight;
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
final DisplayMetrics maxMetrics = new DisplayMetrics();
display.getRealMetrics(maxMetrics);
maxWidth = maxMetrics.widthPixels;
maxHeight = maxMetrics.heightPixels;
insetLeft = rootInsets.getStableInsetLeft();
insetTop = rootInsets.getStableInsetTop();
} else {
final WindowMetrics maxMetrics = windowManager.getMaximumWindowMetrics();
maxWidth = maxMetrics.getBounds().width();
maxHeight = maxMetrics.getBounds().height();
insetLeft = rootInsets.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()).left;
insetTop = rootInsets.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()).top;
}
@ -305,7 +295,8 @@ class QtDisplayManager {
double density = displayMetrics.density;
double scaledDensity = displayMetrics.scaledDensity;
setDisplayMetrics(maxWidth, maxHeight, insetLeft, insetTop,
Size displaySize = getDisplaySize(activity, QtDisplayManager.getDisplay(activity));
setDisplayMetrics(displaySize.getWidth(), displaySize.getHeight(), insetLeft, insetTop,
width, height, getXDpi(displayMetrics), getYDpi(displayMetrics),
scaledDensity, density);
}

View File

@ -87,16 +87,13 @@ QAndroidPlatformScreen::QAndroidPlatformScreen(const QJniObject &displayObject)
m_refreshRate = displayObject.callMethod<jfloat>("getRefreshRate");
m_displayId = displayObject.callMethod<jint>("getDisplayId");
const QJniObject context = QNativeInterface::QAndroidApplication::context();
const auto displayContext = context.callMethod<QtJniTypes::Context>("createDisplayContext",
displayObject.object<QtJniTypes::Display>());
const auto context = QNativeInterface::QAndroidApplication::context();
const auto sizeObj = QtJniTypes::QtDisplayManager::callStaticMethod<QtJniTypes::Size>(
"getDisplaySize", displayContext,
"getDisplaySize", context,
displayObject.object<QtJniTypes::Display>());
m_size = QSize(sizeObj.callMethod<int>("getWidth"), sizeObj.callMethod<int>("getHeight"));
const auto resources = displayContext.callMethod<QtJniTypes::Resources>("getResources");
const auto resources = context.callMethod<QtJniTypes::Resources>("getResources");
const auto metrics = resources.callMethod<QtJniTypes::DisplayMetrics>("getDisplayMetrics");
const float xdpi = metrics.getField<float>("xdpi");
const float ydpi = metrics.getField<float>("ydpi");