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

View File

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