diff options
| author | Wojciech Błaszak <wojciech.blaszak@siili.com> | 2022-07-22 13:05:56 +0200 |
|---|---|---|
| committer | Petri Virkkunen <petri.virkkunen@qt.io> | 2022-10-26 15:32:52 +0300 |
| commit | fbf586db2c587e7ba83cf1bfe8e5b912310d6bdb (patch) | |
| tree | 3a59b5ad77fe4e0790d65050b0e56feb0b141ba2 /src/plugins/platforms/android/qandroidplatformintegration.cpp | |
| parent | c7b93d471d763b5e7986305deb4d0d83d7b69068 (diff) | |
QGuiApplication on Android can now detect multiple displays
- Extending QtNative.java with access to DisplayManager and get
details about available displays
- Extending Android Platform Integration with display's list
handling
- Change QAndroidPlatformScreen to initialize itself from QJniObject
representation of an android Display object
- Move initialization of Primary display from QAndroidPlatformScreen
to QAndroidPlatformIntegration
Change-Id: I3d8f97f5cf9f81bbecc8716c25ff323097e57a15
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Diffstat (limited to 'src/plugins/platforms/android/qandroidplatformintegration.cpp')
| -rw-r--r-- | src/plugins/platforms/android/qandroidplatformintegration.cpp | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/src/plugins/platforms/android/qandroidplatformintegration.cpp b/src/plugins/platforms/android/qandroidplatformintegration.cpp index 890f9787687..57546bdbca3 100644 --- a/src/plugins/platforms/android/qandroidplatformintegration.cpp +++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp @@ -56,6 +56,11 @@ Qt::ScreenOrientation QAndroidPlatformIntegration::m_nativeOrientation = Qt::Pri bool QAndroidPlatformIntegration::m_showPasswordEnabled = false; static bool m_running = false; +Q_DECLARE_JNI_CLASS(QtNative, "org/qtproject/qt/android/QtNative") +Q_DECLARE_JNI_CLASS(Display, "android/view/Display") + +Q_DECLARE_JNI_TYPE(List, "Ljava/util/List;") + void *QAndroidPlatformNativeInterface::nativeResourceForIntegration(const QByteArray &resource) { if (resource=="JavaVM") @@ -163,10 +168,33 @@ QAndroidPlatformIntegration::QAndroidPlatformIntegration(const QStringList ¶ if (Q_UNLIKELY(!eglBindAPI(EGL_OPENGL_ES_API))) qFatal("Could not bind GL_ES API"); - m_primaryScreen = new QAndroidPlatformScreen(); - QWindowSystemInterface::handleScreenAdded(m_primaryScreen); - m_primaryScreen->setSizeParameters(m_defaultPhysicalSize, m_defaultScreenSize, - m_defaultAvailableGeometry); + static const int primaryDisplayId = QJniObject::getStaticField<jint>( + QtJniTypes::className<QtJniTypes::Display>(), "DEFAULT_DISPLAY"); + + const QJniObject nativeDisplaysList = QJniObject::callStaticObjectMethod<QtJniTypes::List>( + QtJniTypes::className<QtJniTypes::QtNative>(), + "getAvailableDisplays"); + + const int numberOfAvailableDisplays = nativeDisplaysList.callMethod<jint>("size"); + for (int i = 0; i < numberOfAvailableDisplays; ++i) { + const QJniObject display = + nativeDisplaysList.callObjectMethod<jobject, jint>("get", jint(i)); + + const bool isPrimary = (primaryDisplayId == display.callMethod<jint>("getDisplayId")); + auto screen = new QAndroidPlatformScreen(display); + + if (isPrimary) + m_primaryScreen = screen; + + QWindowSystemInterface::handleScreenAdded(screen, isPrimary); + } + + if (numberOfAvailableDisplays == 0) { + // If no displays are found, add a dummy display + auto defaultScreen = new QAndroidPlatformScreen(QJniObject {}); + m_primaryScreen = defaultScreen; + QWindowSystemInterface::handleScreenAdded(defaultScreen, true); + } m_mainThread = QThread::currentThread(); |
