23#include <QGuiApplication>
24#include <QOffscreenSurface>
25#include <QOpenGLContext>
27#include <QtCore/QJniObject>
28#include <QtGui/private/qeglpbuffer_p.h>
29#include <QtGui/private/qguiapplication_p.h>
30#include <QtGui/private/qoffscreensurface_p.h>
31#include <QtGui/private/qrhibackingstore_p.h>
32#include <qpa/qplatformoffscreensurface.h>
33#include <qpa/qplatformwindow.h>
34#include <qpa/qwindowsysteminterface.h>
43#include <QtGui/qpa/qplatforminputcontextfactory_p.h>
49Q_CONSTINIT
QSize QAndroidPlatformIntegration::m_defaultScreenSize =
QSize(320, 455);
50Q_CONSTINIT
QRect QAndroidPlatformIntegration::m_defaultAvailableGeometry =
QRect(0, 0, 320, 455);
51Q_CONSTINIT
QSize QAndroidPlatformIntegration::m_defaultPhysicalSize =
QSize(50, 71);
56bool QAndroidPlatformIntegration::m_showPasswordEnabled =
false;
68 const QJniObject display = QtJniTypes::QtDisplayManager::callStaticMethod<QtJniTypes::Display>(
75static bool isValidAndroidContextForRendering()
85 if (resource==
"JavaVM")
87 if (resource ==
"QtActivity") {
91 if (resource ==
"QtService") {
95 if (resource ==
"AndroidStyleData") {
104 if (resource ==
"AndroidStandardPalette") {
110 if (resource ==
"AndroidQWidgetFonts") {
116 if (resource ==
"AndroidDeviceName") {
126 if (resource ==
"vkSurface") {
143 if (resource ==
"eglcontext")
144 return platformContext->eglContext();
145 else if (resource ==
"eglconfig")
146 return platformContext->eglConfig();
147 else if (resource ==
"egldisplay")
148 return platformContext->eglDisplay();
162#if QT_CONFIG(accessibility)
167 api->flushPendingUpdates();
179 m_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
180 if (
Q_UNLIKELY(m_eglDisplay == EGL_NO_DISPLAY))
181 qFatal(
"Could not open egl display");
184 if (
Q_UNLIKELY(!eglInitialize(m_eglDisplay, &major, &minor)))
185 qFatal(
"Could not initialize egl display");
187 if (
Q_UNLIKELY(!eglBindAPI(EGL_OPENGL_ES_API)))
188 qFatal(
"Could not bind GL_ES API");
190 using namespace QtJniTypes;
191 m_primaryDisplayId = Display::getStaticField<jint>(
"DEFAULT_DISPLAY");
192 const QJniObject nativeDisplaysList = QtDisplayManager::callStaticMethod<List>(
195 const int numberOfAvailableDisplays = nativeDisplaysList.callMethod<jint>(
"size");
196 for (
int i = 0;
i < numberOfAvailableDisplays; ++
i) {
198 nativeDisplaysList.callObjectMethod<jobject, jint>(
"get", jint(
i));
199 const int displayId =
display.callMethod<jint>(
"getDisplayId");
200 const bool isPrimary = (m_primaryDisplayId == displayId);
207 m_screens[displayId] =
screen;
210 if (numberOfAvailableDisplays == 0) {
222#ifndef QT_NO_CLIPBOARD
228#if QT_CONFIG(accessibility)
233 if (!javaActivity.isValid())
236 if (javaActivity.isValid()) {
237 QJniObject resources = javaActivity.callObjectMethod(
"getResources",
"()Landroid/content/res/Resources;");
238 QJniObject configuration = resources.callObjectMethod(
"getConfiguration",
"()Landroid/content/res/Configuration;");
240 int touchScreen = configuration.getField<jint>(
"touchscreen");
241 if (touchScreen == QJniObject::getStaticField<jint>(
"android/content/res/Configuration",
"TOUCHSCREEN_FINGER")
242 || touchScreen == QJniObject::getStaticField<jint>(
"android/content/res/Configuration",
"TOUCHSCREEN_STYLUS"))
244 QJniObject pm = javaActivity.callObjectMethod(
"getPackageManager",
"()Landroid/content/pm/PackageManager;");
246 int maxTouchPoints = 1;
247 if (pm.callMethod<jboolean>(
"hasSystemFeature",
"(Ljava/lang/String;)Z",
248 QJniObject::getStaticObjectField(
"android/content/pm/PackageManager",
249 "FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND",
250 "Ljava/lang/String;").object())) {
252 }
else if (pm.callMethod<jboolean>(
"hasSystemFeature",
"(Ljava/lang/String;)Z",
253 QJniObject::getStaticObjectField(
"android/content/pm/PackageManager",
254 "FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT",
255 "Ljava/lang/String;").object())) {
257 }
else if (pm.callMethod<jboolean>(
"hasSystemFeature",
"(Ljava/lang/String;)Z",
258 QJniObject::getStaticObjectField(
"android/content/pm/PackageManager",
259 "FEATURE_TOUCHSCREEN_MULTITOUCH",
260 "Ljava/lang/String;").object())) {
280 auto contentResolver = javaActivity.callObjectMethod(
"getContentResolver",
"()Landroid/content/ContentResolver;");
281 Q_ASSERT(contentResolver.isValid());
282 QJniObject txtShowPassValue = QJniObject::callStaticObjectMethod(
283 "android/provider/Settings$System",
285 "(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;",
286 contentResolver.object(),
287 QJniObject::getStaticObjectField(
"android/provider/Settings$System",
288 "TEXT_SHOW_PASSWORD",
289 "Ljava/lang/String;").object());
290 if (txtShowPassValue.isValid()) {
292 const int txtShowPass = txtShowPassValue.toString().toInt(&
ok);
293 m_showPasswordEnabled =
ok ? (txtShowPass == 1) :
false;
304 static bool needsWorkaround =
308 return needsWorkaround;
314 if (icStrs.isEmpty())
327 return isValidAndroidContextForRendering();
329 return isValidAndroidContextForRendering();
353 if (!isValidAndroidContextForRendering())
356 format.setAlphaBufferSize(8);
357 format.setRedBufferSize(8);
358 format.setGreenBufferSize(8);
359 format.setBlueBufferSize(8);
366 return QEGLPlatformContext::createFrom<QAndroidPlatformOpenGLContext>(
context,
display, m_eglDisplay, shareContext);
375 format.setAlphaBufferSize(8);
376 format.setRedBufferSize(8);
377 format.setGreenBufferSize(8);
378 format.setBlueBufferSize(8);
396 if (!isValidAndroidContextForRendering())
419 if (m_eglDisplay != EGL_NO_DISPLAY)
420 eglTerminate(m_eglDisplay);
422 delete m_androidPlatformNativeInterface;
424 delete m_androidSystemLocale;
426#ifndef QT_NO_CLIPBOARD
427 delete m_androidPlatformClipboard;
438#ifndef QT_NO_CLIPBOARD
441 return m_androidPlatformClipboard;
447 return m_inputContext.
data();
452 return m_androidPlatformNativeInterface;
457 return m_androidPlatformServices;
465 return m_showPasswordEnabled ? 1500 : 0;
497 int availableWidth,
int availableHeight,
498 int physicalWidth,
int physicalHeight,
499 int screenWidth,
int screenHeight)
501 m_defaultAvailableGeometry =
QRect(availableLeft, availableTop,
502 availableWidth, availableHeight);
503 m_defaultPhysicalSize =
QSize(physicalWidth, physicalHeight);
504 m_defaultScreenSize =
QSize(screenWidth, screenHeight);
510 m_orientation = currentOrientation;
511 m_nativeOrientation = nativeOrientation;
516 if (m_primaryScreen) {
518 m_defaultAvailableGeometry);
522#if QT_CONFIG(accessibility)
523QPlatformAccessibility *QAndroidPlatformIntegration::accessibility()
const
525 return m_accessibility;
560 const QSize &screenSize,
561 const QRect &availableGeometry)
563 if (m_primaryScreen) {
580 if (
result.first->second ==
nullptr) {
582 it->second = createScreenForDisplayId(displayId);
583 if (
it->second ==
nullptr)
585 const bool isPrimary = (m_primaryDisplayId == displayId);
587 m_primaryScreen =
it->second;
590 qWarning() <<
"Display with id" << displayId <<
"already exists.";
596 auto it = m_screens.
find(displayId);
597 if (
it == m_screens.
end() ||
it->second ==
nullptr) {
608 auto it = m_screens.
find(displayId);
610 if (
it == m_screens.
end())
613 if (
it->second !=
nullptr)
static void postEvent(QObject *receiver, QEvent *event, int priority=Qt::NormalEventPriority)
A pbuffer-based implementation of QPlatformOffscreenSurface for EGL.
An EGL context implementation.
iterator erase(iterator it)
iterator find(const Key &key)
std::pair< iterator, bool > insert(const Key &key, const T &value)
static QPlatformIntegration * platformIntegration()
static QOffscreenSurfacePrivate * get(QOffscreenSurface *surface)
QSurfaceFormat requestedFormat() const
Returns the requested surfaceformat of this offscreen surface.
static QPlatformInputContext * create()
static QStringList requested()
The QPlatformInputContext class abstracts the input method dependent data and composing state.
The QPlatformOpenGLContext class provides an abstraction for native GL contexts.
The QPointingDevice class describes a device from which mouse, touch or tablet events originate.
\inmodule QtCore\reentrant
T * data() const noexcept
Returns the value of the pointer referenced by this object.
void reset(T *other=nullptr) noexcept(noexcept(Cleanup::cleanup(std::declval< T * >())))
Deletes the existing object it is pointing to (if any), and sets its pointer to other.
\macro QT_RESTRICTED_CAST_FROM_ASCII
int compare(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
static QThread * currentThread()
The QVulkanInstance class represents a native Vulkan instance, enabling Vulkan rendering onto a QSurf...
static void registerInputDevice(const QInputDevice *device)
static void handleScreenAdded(QPlatformScreen *screen, bool isPrimary=false)
Should be called by the implementation whenever a new screen is added.
static void handleScreenRemoved(QPlatformScreen *screen)
Should be called by the implementation whenever a screen is removed.
QSet< QString >::iterator it
struct wl_display * display
Combined button and popup list for selecting options.
Q_CORE_EXPORT QtJniTypes::Context context()
Q_CORE_EXPORT QtJniTypes::Activity activity()
Q_CORE_EXPORT QtJniTypes::Service service()
void setAndroidPlatformIntegration(QAndroidPlatformIntegration *androidPlatformIntegration)
QBasicMutex * platformInterfaceMutex()
QList< QString > QStringList
Constructs a string list that contains the given string, str.
typedef EGLDisplay(EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC)(EGLenum platform
Q_CORE_EXPORT jobject qt_androidActivity()
Q_CORE_EXPORT jobject qt_androidService()
#define Q_ARG(Type, data)
GLfloat GLfloat GLfloat w
[0]
GLint GLsizei GLsizei height
GLint GLsizei GLsizei GLenum format
QT_BEGIN_NAMESPACE Q_DECLARE_JNI_CLASS(Environment, "android/os/Environment")
static QT_BEGIN_NAMESPACE QVariant hint(QPlatformIntegration::StyleHint h)
#define QT_CONFIG(feature)
if(qFloatDistance(a, b)<(1<< 7))
[0]
QNetworkRequestFactory api
[0]
static QJsonObject loadStyleData()