48QModelIndex QAndroidItemModelProxy::index(
int row,
int column,
const QModelIndex &parent)
const
50 Q_ASSERT(jInstance.isValid());
51 const QMutexLocker<QRecursiveMutex> lock = getMutexLocker(
this);
52 JQtModelIndex jIndex = jInstance.callMethod<JQtModelIndex>(
53 "index", row, column, QAndroidModelIndexProxy::jInstance(parent));
54 return QAndroidModelIndexProxy::qInstance(jIndex);
75QHash<
int, QByteArray> QAndroidItemModelProxy::roleNames()
const
77 Q_ASSERT(jInstance.isValid());
78 const QMutexLocker<QRecursiveMutex> lock = getMutexLocker(
this);
80 QHash<
int, QByteArray> roleNames;
81 HashMap hashMap = jInstance.callMethod<HashMap>(
"roleNames");
82 Set set = hashMap.callMethod<Set>(
"keySet");
83 const QJniArray keyArray = set.callMethod<jobject[]>(
"toArray");
85 for (
const auto &key : keyArray) {
86 const QJniObject roleName = hashMap.callMethod<jobject>(
"get", key);
87 const int intKey = QJniObject(key).callMethod<jint>(
"intValue");
88 const QByteArray roleByteArray = String(roleName).toString().toLatin1();
89 roleNames.insert(intKey, roleByteArray);
125QModelIndex QAndroidItemModelProxy::sibling(
int row,
int column,
const QModelIndex &parent)
const
127 Q_ASSERT(jInstance.isValid());
128 const QMutexLocker<QRecursiveMutex> lock = getMutexLocker(
this);
129 return QAndroidModelIndexProxy::qInstance(jInstance.callMethod<JQtModelIndex>(
130 "sibling", row, column, QAndroidModelIndexProxy::jInstance(parent)));
138bool QAndroidItemModelProxy::setData(
const QModelIndex &index,
const QVariant &value,
int role)
140 Q_ASSERT(jInstance.isValid());
141 const QMutexLocker<QRecursiveMutex> lock = getMutexLocker(
this);
142 auto jIndex = QAndroidModelIndexProxy::jInstance(index);
143 auto jValue = QAndroidTypeConverter::toJavaObject(value, QJniEnvironment::getJniEnv());
144 return jInstance.callMethod<jboolean>(
"setData", jIndex, jValue, role);
161QAndroidItemModelProxy::createNativeProxy(QJniObject itemModel)
163 QAbstractItemModel *nativeProxy = nativeInstance(itemModel);
165 Q_ASSERT(QCoreApplication::instance());
167 nativeProxy =
new QAndroidItemModelProxy(itemModel);
168 QThread *qtMainThread = QCoreApplication::instance()->thread();
169 if (nativeProxy->thread() != qtMainThread)
170 nativeProxy->moveToThread(qtMainThread);
172 itemModel.callMethod<
void>(
"setNativeReference",
reinterpret_cast<jlong>(nativeProxy));
173 connect(nativeProxy, &QAndroidItemModelProxy::destroyed, nativeProxy, [](QObject *obj) {
174 auto proxy = qobject_cast<QAndroidItemModelProxy *>(obj);
176 const QMutexLocker<QRecursiveMutex> lock = getMutexLocker(proxy);
177 proxy->jInstance.callMethod<
void>(
"detachFromNative");
181 connect(nativeProxy, &QAndroidItemModelProxy::dataChanged, nativeProxy,
182 [nativeProxy](
const QModelIndex &topLeft,
const QModelIndex &bottomRight,
183 const QList<
int> &roles) {
184 auto proxy = qobject_cast<QAndroidItemModelProxy *>(nativeProxy);
186 QJniObject jInstance = proxy->jInstance;
187 const QMutexLocker<QRecursiveMutex> lock = getMutexLocker(proxy);
188 jInstance.callMethod<
void>(
"handleDataChanged",
189 QAndroidModelIndexProxy::jInstance(topLeft),
190 QAndroidModelIndexProxy::jInstance(bottomRight),
191 QJniArray<jint>(roles));
209jobject QAndroidItemModelProxy::jni_data(JNIEnv *env, jobject object, JQtModelIndex index,
212 const QModelIndex nativeIndex = QAndroidModelIndexProxy::qInstance(index);
213 const QVariant data =
214 invokeNativeMethod(env, object, &QAbstractItemModel::data, nativeIndex, role);
215 return QAndroidTypeConverter::toJavaObject(data, env);
218jobject QAndroidItemModelProxy::jni_index(JNIEnv *env, jobject object, jint row, jint column,
219 JQtModelIndex parent)
221 auto nativeParent = QAndroidModelIndexProxy::qInstance(parent);
222 const QModelIndex modelIndex =
223 invokeNativeMethod(env, object, &QAbstractItemModel::index, row, column, nativeParent);
224 return env->NewLocalRef(QAndroidModelIndexProxy::jInstance(modelIndex).object());
227jobject QAndroidItemModelProxy::jni_parent(JNIEnv *env, jobject object, JQtModelIndex index)
229 const QModelIndex nativeIndex = QAndroidModelIndexProxy::qInstance(index);
230 QModelIndex (QAbstractItemModel::*parentOverloadPtr)(
const QModelIndex &)
const =
231 &QAbstractItemModel::parent;
232 const QModelIndex parent = invokeNativeMethod(env, object, parentOverloadPtr, nativeIndex);
233 return env->NewLocalRef(QAndroidModelIndexProxy::jInstance(parent).object());
242jobject QAndroidItemModelProxy::jni_roleNames(JNIEnv *env, jobject object)
244 auto roleNames = invokeNativeImpl(env, object, &QAndroidItemModelProxy::defaultRoleNames,
245 &QAbstractItemModel::roleNames);
246 HashMap jRoleNames{};
247 for (
auto [role, roleName] : roleNames.asKeyValueRange()) {
248 const Integer jRole(role);
249 jRoleNames.callMethod<jobject>(
"put", jRole.object(), QString::fromUtf8(roleName));
251 return env->NewLocalRef(jRoleNames.object());
254jobject QAndroidItemModelProxy::jni_createIndex(JNIEnv *env, jobject object, jint row, jint column,
257 QModelIndex (QAndroidItemModelProxy::*createIndexPtr)(
int,
int, quintptr)
const =
258 &QAndroidItemModelProxy::createIndex;
259 const QModelIndex index =
260 invokeNativeProxyMethod(env, object, createIndexPtr, row, column, quintptr(id));
261 return env->NewLocalRef(QAndroidModelIndexProxy::jInstance(index).object());
264jboolean QAndroidItemModelProxy::jni_canFetchMore(JNIEnv *env, jobject object, JQtModelIndex parent)
266 return invokeNativeImpl(env, object, &QAndroidItemModelProxy::canFetchMoreDefault,
267 &QAbstractItemModel::canFetchMore,
268 QAndroidModelIndexProxy::qInstance(parent));
271void QAndroidItemModelProxy::jni_fetchMore(JNIEnv *env, jobject object, JQtModelIndex parent)
273 return invokeNativeImpl(env, object, &QAndroidItemModelProxy::fetchMoreDefault,
274 &QAbstractItemModel::fetchMore,
275 QAndroidModelIndexProxy::qInstance(parent));
278jboolean QAndroidItemModelProxy::jni_hasChildren(JNIEnv *env, jobject object, JQtModelIndex parent)
280 return invokeNativeImpl(env, object, &QAndroidItemModelProxy::hasChildrenDefault,
281 &QAbstractItemModel::hasChildren,
282 QAndroidModelIndexProxy::qInstance(parent));
285jboolean QAndroidItemModelProxy::jni_hasIndex(JNIEnv *env, jobject object, jint row, jint column,
286 JQtModelIndex parent)
288 return invokeNativeMethod(env, object, &QAbstractItemModel::hasIndex, row, column,
289 QAndroidModelIndexProxy::qInstance(parent));
292void QAndroidItemModelProxy::jni_beginInsertColumns(JNIEnv *env, jobject object,
293 JQtModelIndex parent, jint first, jint last)
296 invokeNativeProxyMethod(env, object, &QAndroidItemModelProxy::beginInsertColumns,
297 QAndroidModelIndexProxy::qInstance(parent), first, last);
300void QAndroidItemModelProxy::jni_beginInsertRows(JNIEnv *env, jobject object, JQtModelIndex parent,
301 jint first, jint last)
303 invokeNativeProxyMethod(env, object, &QAndroidItemModelProxy::beginInsertRows,
304 QAndroidModelIndexProxy::qInstance(parent), first, last);
307jboolean QAndroidItemModelProxy::jni_beginMoveColumns(JNIEnv *env, jobject object,
308 JQtModelIndex sourceParent, jint sourceFirst,
310 JQtModelIndex destinationParent,
311 jint destinationChild)
313 return invokeNativeProxyMethod(
314 env, object, &QAndroidItemModelProxy::beginMoveColumns,
315 QAndroidModelIndexProxy::qInstance(sourceParent), sourceFirst, sourceLast,
316 QAndroidModelIndexProxy::qInstance(destinationParent), destinationChild);
319jboolean QAndroidItemModelProxy::jni_beginMoveRows(JNIEnv *env, jobject object,
320 JQtModelIndex sourceParent, jint sourceFirst,
321 jint sourceLast, JQtModelIndex destinationParent,
322 jint destinationChild)
324 return invokeNativeProxyMethod(
325 env, object, &QAndroidItemModelProxy::beginMoveRows,
326 QAndroidModelIndexProxy::qInstance(sourceParent), sourceFirst, sourceLast,
327 QAndroidModelIndexProxy::qInstance(destinationParent), destinationChild);
330void QAndroidItemModelProxy::jni_beginRemoveColumns(JNIEnv *env, jobject object,
331 JQtModelIndex parent, jint first, jint last)
333 invokeNativeProxyMethod(env, object, &QAndroidItemModelProxy::beginRemoveColumns,
334 QAndroidModelIndexProxy::qInstance(parent), first, last);
337void QAndroidItemModelProxy::jni_beginRemoveRows(JNIEnv *env, jobject object, JQtModelIndex parent,
338 jint first, jint last)
340 invokeNativeProxyMethod(env, object, &QAndroidItemModelProxy::beginRemoveRows,
341 QAndroidModelIndexProxy::qInstance(parent), first, last);
384jobject QAndroidItemModelProxy::jni_sibling(JNIEnv *env, jobject object, jint row, jint column,
385 JQtModelIndex parent)
387 const QModelIndex index = invokeNativeImpl(env, object, &QAndroidItemModelProxy::siblingDefault,
388 &QAbstractItemModel::sibling, row, column,
389 QAndroidModelIndexProxy::qInstance(parent));
390 return env->NewLocalRef(QAndroidModelIndexProxy::jInstance(index).object());
393jboolean QAndroidItemModelProxy::jni_setData(JNIEnv *env, jobject object, JQtModelIndex index,
394 jobject value, jint role)
396 const QModelIndex nativeIndex = QAndroidModelIndexProxy::qInstance(index);
397 const QVariant qValue = QAndroidTypeConverter::toQVariant(QJniObject(value));
398 return invokeNativeImpl(env, object, &QAndroidItemModelProxy::setDataDefault,
399 &QAbstractItemModel::setData, nativeIndex, qValue, role);
402void QAndroidItemModelProxy::jni_dataChanged(JNIEnv *env, jobject object, JQtModelIndex topLeft,
403 JQtModelIndex bottomRight, QJniArray<jint> roles)
405 const QModelIndex nativeTopLeft = QAndroidModelIndexProxy::qInstance(topLeft);
406 const QModelIndex nativeBottomRight = QAndroidModelIndexProxy::qInstance(bottomRight);
407 const QList<
int> nativeRoles = roles.toContainer();
408 invokeNativeImpl(env, object, &QAndroidItemModelProxy::dataChanged,
409 &QAbstractItemModel::dataChanged, nativeTopLeft, nativeBottomRight,
413bool QAndroidItemModelProxy::registerAbstractNatives(QJniEnvironment &env)
415 return env.registerNativeMethods(
416 Traits<JQtAbstractItemModel>::className(),
417 { Q_JNI_NATIVE_SCOPED_METHOD(jni_roleNames, QAndroidItemModelProxy),
418 Q_JNI_NATIVE_SCOPED_METHOD(jni_canFetchMore, QAndroidItemModelProxy),
419 Q_JNI_NATIVE_SCOPED_METHOD(jni_createIndex, QAndroidItemModelProxy),
420 Q_JNI_NATIVE_SCOPED_METHOD(jni_fetchMore, QAndroidItemModelProxy),
421 Q_JNI_NATIVE_SCOPED_METHOD(jni_hasChildren, QAndroidItemModelProxy),
422 Q_JNI_NATIVE_SCOPED_METHOD(jni_hasIndex, QAndroidItemModelProxy),
423 Q_JNI_NATIVE_SCOPED_METHOD(jni_beginInsertColumns, QAndroidItemModelProxy),
424 Q_JNI_NATIVE_SCOPED_METHOD(jni_beginInsertRows, QAndroidItemModelProxy),
425 Q_JNI_NATIVE_SCOPED_METHOD(jni_beginMoveColumns, QAndroidItemModelProxy),
426 Q_JNI_NATIVE_SCOPED_METHOD(jni_beginMoveRows, QAndroidItemModelProxy),
427 Q_JNI_NATIVE_SCOPED_METHOD(jni_beginRemoveColumns, QAndroidItemModelProxy),
428 Q_JNI_NATIVE_SCOPED_METHOD(jni_beginRemoveRows, QAndroidItemModelProxy),
429 Q_JNI_NATIVE_SCOPED_METHOD(jni_beginResetModel, QAndroidItemModelProxy),
430 Q_JNI_NATIVE_SCOPED_METHOD(jni_endInsertColumns, QAndroidItemModelProxy),
431 Q_JNI_NATIVE_SCOPED_METHOD(jni_endInsertRows, QAndroidItemModelProxy),
432 Q_JNI_NATIVE_SCOPED_METHOD(jni_endMoveColumns, QAndroidItemModelProxy),
433 Q_JNI_NATIVE_SCOPED_METHOD(jni_endMoveRows, QAndroidItemModelProxy),
434 Q_JNI_NATIVE_SCOPED_METHOD(jni_endRemoveColumns, QAndroidItemModelProxy),
435 Q_JNI_NATIVE_SCOPED_METHOD(jni_endRemoveRows, QAndroidItemModelProxy),
436 Q_JNI_NATIVE_SCOPED_METHOD(jni_endResetModel, QAndroidItemModelProxy),
437 Q_JNI_NATIVE_SCOPED_METHOD(jni_sibling, QAndroidItemModelProxy),
438 Q_JNI_NATIVE_SCOPED_METHOD(jni_setData, QAndroidItemModelProxy),
439 Q_JNI_NATIVE_SCOPED_METHOD(jni_dataChanged, QAndroidItemModelProxy) });
442bool QAndroidItemModelProxy::registerProxyNatives(QJniEnvironment &env)
444 return env.registerNativeMethods(
445 Traits<JQtAndroidItemModelProxy>::className(),
446 { Q_JNI_NATIVE_SCOPED_METHOD(jni_columnCount, QAndroidItemModelProxy),
447 Q_JNI_NATIVE_SCOPED_METHOD(jni_data, QAndroidItemModelProxy),
448 Q_JNI_NATIVE_SCOPED_METHOD(jni_index, QAndroidItemModelProxy),
449 Q_JNI_NATIVE_SCOPED_METHOD(jni_parent, QAndroidItemModelProxy),
450 Q_JNI_NATIVE_SCOPED_METHOD(jni_rowCount, QAndroidItemModelProxy) });