64QAndroidPlatformScreen::QAndroidPlatformScreen(
const QJniObject &displayObject)
65 : QObject(), QPlatformScreen()
69 if (qEnvironmentVariableIntValue(
"QT_ANDROID_RASTER_IMAGE_DEPTH") == 16) {
70 m_format = QImage::Format_RGB16;
73 m_format = QImage::Format_ARGB32_Premultiplied;
77 connect(
qGuiApp, &QGuiApplication::applicationStateChanged,
this,
78 &QAndroidPlatformScreen::applicationStateChanged);
80 if (!displayObject.isValid())
83 m_name = displayObject.callObjectMethod<jstring>(
"getName").toString();
84 m_refreshRate = displayObject.callMethod<jfloat>(
"getRefreshRate");
85 m_displayId = displayObject.callMethod<jint>(
"getDisplayId");
86 m_size = sizeForDisplayId(m_displayId);
87 m_availableGeometry = defaultAvailableGeometry();
89 const auto context = QNativeInterface::QAndroidApplication::context();
90 const auto resources = context.callMethod<QtJniTypes::Resources>(
"getResources");
91 const auto metrics = resources.callMethod<QtJniTypes::DisplayMetrics>(
"getDisplayMetrics");
92 m_xdpi = QtJniTypes::QtDisplayManager::callStaticMethod<jfloat>(
"getXDpi", metrics);
93 m_ydpi = QtJniTypes::QtDisplayManager::callStaticMethod<jfloat>(
"getYDpi", metrics);
98 setPhysicalSizeFromPixels(m_size);
100 if (QNativeInterface::QAndroidApplication::sdkVersion() >= 23) {
101 const QJniObject currentMode = displayObject.callObjectMethod<QtJniTypes::DisplayMode>(
"getMode");
102 m_currentMode = currentMode.callMethod<jint>(
"getModeId");
104 const QJniObject supportedModes = displayObject.callObjectMethod<QtJniTypes::DisplayMode[]>(
105 "getSupportedModes");
106 const auto modeArray = jobjectArray(supportedModes.object());
109 const auto size = env->GetArrayLength(modeArray);
110 for (jsize i = 0; i < size; ++i) {
111 const auto mode = QJniObject::fromLocalRef(env->GetObjectArrayElement(modeArray, i));
112 m_modes << QPlatformScreen::Mode {
113 .size = QSize { mode.callMethod<jint>(
"getPhysicalWidth"),
114 mode.callMethod<jint>(
"getPhysicalHeight") },
115 .refreshRate = mode.callMethod<jfloat>(
"getRefreshRate")
227 const bool isPortrait = size.height() > size.width();
228 const bool swapped = isPortrait != (nativeOrientation() == Qt::PortraitOrientation);
229 const qreal widthDPI = swapped ? m_ydpi : m_xdpi;
230 const qreal heightDPI = swapped ? m_xdpi : m_ydpi;
231 m_physicalSize = QSizeF(size.width() / widthDPI * Q_MM_PER_INCH,
232 size.height() / heightDPI * Q_MM_PER_INCH);
263 if (m_availableGeometry == rect)
266 QRect oldGeometry = m_availableGeometry;
268 m_availableGeometry = rect;
269 setSize(sizeForDisplayId(m_displayId));
270 resizeMaximizedWindows();
272 if (oldGeometry.width() == 0 && oldGeometry.height() == 0 && rect.width() > 0 && rect.height() > 0) {
273 QList<QWindow *> windows = QGuiApplication::allWindows();
274 for (
int i = 0; i < windows.size(); ++i) {
275 QWindow *w = windows.at(i);
277 QRect geometry = w->handle()->geometry();
278 if (geometry.width() > 0 && geometry.height() > 0)
279 QWindowSystemInterface::handleExposeEvent(w, QRect(QPoint(0, 0), geometry.size()));