diff --git a/src/corelib/CMakeLists.txt b/src/corelib/CMakeLists.txt index 304cd365631..8ccb3947c1a 100644 --- a/src/corelib/CMakeLists.txt +++ b/src/corelib/CMakeLists.txt @@ -1071,6 +1071,8 @@ qt_internal_extend_target(Core CONDITION ANDROID kernel/qjnihelpers.cpp kernel/qjnihelpers_p.h platform/android/qandroidextras_p.h platform/android/qandroidextras.cpp platform/android/qandroidnativeinterface.cpp + platform/android/qandroidtypes_p.h + platform/android/qandroidtypeconverter_p.h NO_UNITY_BUILD_SOURCES platform/android/qandroidextras.cpp # qtNativeClassName conflicts with similar symbols in android headers diff --git a/src/corelib/platform/android/qandroidtypeconverter_p.h b/src/corelib/platform/android/qandroidtypeconverter_p.h new file mode 100644 index 00000000000..1bde5a5464e --- /dev/null +++ b/src/corelib/platform/android/qandroidtypeconverter_p.h @@ -0,0 +1,99 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QANDROIDTYPECONVERTER_P_H +#define QANDROIDTYPECONVERTER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#include +#include + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +namespace QAndroidTypeConverter +{ + [[maybe_unused]] static QVariant toQVariant(const QJniObject &object) + { + using namespace QtJniTypes; + if (!object.isValid()) + return QVariant{}; + const QByteArray classname(object.className()); + + if (classname == Traits::className()) + return object.toString(); + else if (classname == Traits::className()) + return object.callMethod("intValue"); + else if (classname == Traits::className()) + return QVariant::fromValue(object.callMethod("longValue")); + else if (classname == Traits::className()) + return object.callMethod("doubleValue"); + else if (classname == Traits::className()) + return object.callMethod("floatValue"); + else if (classname == Traits::className()) + return QVariant::fromValue(object.callMethod("booleanValue")); + else { + QJniEnvironment env; + const jclass className = env.findClass(Traits::className()); + if (env->IsInstanceOf(object.object(), className)) + return QVariant::fromValue(QAndroidItemModelProxy::createNativeProxy(object)); + } + + return QVariant{}; + } + + [[maybe_unused]] Q_REQUIRED_RESULT static jobject toJavaObject(const QVariant &var, JNIEnv *env) + { + Q_ASSERT(env); + switch (var.typeId()) { + case QMetaType::Type::Int: + return env->NewLocalRef(QJniObject::construct( + get(var)) + .object()); + case QMetaType::Type::Long: + case QMetaType::Type::LongLong: + return env->NewLocalRef(QJniObject::construct( + get(var)) + .object()); + case QMetaType::Type::Double: + return env->NewLocalRef(QJniObject::construct( + get(var)) + .object()); + case QMetaType::Type::Float: + return env->NewLocalRef(QJniObject::construct( + get(var)) + .object()); + case QMetaType::Type::Bool: + return env->NewLocalRef(QJniObject::construct( + get(var)) + .object()); + case QMetaType::Type::QString: + return env->NewLocalRef( + QJniObject::fromString(get(var)).object()); + default: + if (var.canConvert()) { + return env->NewLocalRef( + QAndroidItemModelProxy::createProxy(var.value()) + .object()); + } else + return nullptr; + } + return nullptr; + } +}; + +QT_END_NAMESPACE + +#endif // QANDROIDTYPECONVERTER_P_H diff --git a/src/corelib/platform/android/qandroidtypes_p.h b/src/corelib/platform/android/qandroidtypes_p.h new file mode 100644 index 00000000000..e2c25f6965b --- /dev/null +++ b/src/corelib/platform/android/qandroidtypes_p.h @@ -0,0 +1,43 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QANDROIDTYPES_P_H +#define QANDROIDTYPES_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +#ifndef QT_DECLARE_JNI_CLASS_STANDARD_TYPES +Q_DECLARE_JNI_CLASS(Void, "java/lang/Void"); +Q_DECLARE_JNI_CLASS(Integer, "java/lang/Integer"); +Q_DECLARE_JNI_CLASS(Long, "java/lang/Long"); +Q_DECLARE_JNI_CLASS(Double, "java/lang/Double"); +Q_DECLARE_JNI_CLASS(Float, "java/lang/Float"); +Q_DECLARE_JNI_CLASS(Boolean, "java/lang/Boolean"); +Q_DECLARE_JNI_CLASS(String, "java/lang/String"); +Q_DECLARE_JNI_CLASS(Class, "java/lang/Class"); + +Q_DECLARE_JNI_CLASS(HashMap, "java/util/HashMap") +Q_DECLARE_JNI_CLASS(Set, "java/util/Set") +#endif + +Q_DECLARE_JNI_CLASS(JQtAbstractItemModel, "org/qtproject/qt/android/QtAbstractItemModel") +Q_DECLARE_JNI_CLASS(JQtAndroidItemModelProxy, "org/qtproject/qt/android/QtAndroidItemModelProxy") +Q_DECLARE_JNI_CLASS(JQtModelIndex, "org/qtproject/qt/android/QtModelIndex") + +QT_END_NAMESPACE + +#endif // QANDROIDTYPES_P_H