47QModelIndex QAndroidItemModelProxy::index(
int row,
int column,
const QModelIndex &parent)
const
49 Q_ASSERT(jInstance.isValid());
50 const QMutexLocker<QRecursiveMutex> lock = getMutexLocker(
this);
51 JQtModelIndex jIndex = jInstance.callMethod<JQtModelIndex>(
52 "index", row, column, QAndroidModelIndexProxy::jInstance(parent));
53 return QAndroidModelIndexProxy::qInstance(jIndex);
74QHash<
int, QByteArray> QAndroidItemModelProxy::roleNames()
const
76 Q_ASSERT(jInstance.isValid());
77 const QMutexLocker<QRecursiveMutex> lock = getMutexLocker(
this);
79 QHash<
int, QByteArray> roleNames;
80 HashMap hashMap = jInstance.callMethod<HashMap>(
"roleNames");
81 Set set = hashMap.callMethod<Set>(
"keySet");
82 const QJniArray keyArray = set.callMethod<jobject[]>(
"toArray");
84 for (
const auto &key : keyArray) {
85 const QJniObject roleName = hashMap.callMethod<jobject>(
"get", key);
86 const int intKey = QJniObject(key).callMethod<jint>(
"intValue");
87 const QByteArray roleByteArray = String(roleName).toString().toLatin1();
88 roleNames.insert(intKey, roleByteArray);
124QModelIndex QAndroidItemModelProxy::sibling(
int row,
int column,
const QModelIndex &parent)
const
126 Q_ASSERT(jInstance.isValid());
127 const QMutexLocker<QRecursiveMutex> lock = getMutexLocker(
this);
128 return QAndroidModelIndexProxy::qInstance(jInstance.callMethod<JQtModelIndex>(
129 "sibling", row, column, QAndroidModelIndexProxy::jInstance(parent)));
137bool QAndroidItemModelProxy::setData(
const QModelIndex &index,
const QVariant &value,
int role)
139 Q_ASSERT(jInstance.isValid());
140 const QMutexLocker<QRecursiveMutex> lock = getMutexLocker(
this);
141 auto jIndex = QAndroidModelIndexProxy::jInstance(index);
142 auto jValue = QAndroidTypeConverter::toJavaObject(value, QJniEnvironment::getJniEnv());
143 return jInstance.callMethod<jboolean>(
"setData", jIndex, jValue, role);
160QAndroidItemModelProxy::createNativeProxy(QJniObject itemModel)
162 QAbstractItemModel *nativeProxy = nativeInstance(itemModel);
164 Q_ASSERT(QCoreApplication::instance());
166 nativeProxy =
new QAndroidItemModelProxy(itemModel);
167 QThread *qtMainThread = QCoreApplication::instance()->thread();
168 if (nativeProxy->thread() != qtMainThread)
169 nativeProxy->moveToThread(qtMainThread);
171 itemModel.callMethod<
void>(
"setNativeReference",
reinterpret_cast<jlong>(nativeProxy));
172 connect(nativeProxy, &QAndroidItemModelProxy::destroyed, nativeProxy, [](QObject *obj) {
173 auto proxy = qobject_cast<QAndroidItemModelProxy *>(obj);
175 const QMutexLocker<QRecursiveMutex> lock = getMutexLocker(proxy);
176 proxy->jInstance.callMethod<
void>(
"detachFromNative");
180 connect(nativeProxy, &QAndroidItemModelProxy::dataChanged, nativeProxy,
181 [nativeProxy](
const QModelIndex &topLeft,
const QModelIndex &bottomRight,
182 const QList<
int> &roles) {
183 auto proxy = qobject_cast<QAndroidItemModelProxy *>(nativeProxy);
185 QJniObject jInstance = proxy->jInstance;
186 const QMutexLocker<QRecursiveMutex> lock = getMutexLocker(proxy);
187 jInstance.callMethod<
void>(
"handleDataChanged",
188 QAndroidModelIndexProxy::jInstance(topLeft),
189 QAndroidModelIndexProxy::jInstance(bottomRight),
190 QJniArray<jint>(roles));
208jobject QAndroidItemModelProxy::jni_data(JNIEnv *env, jobject object, JQtModelIndex index,
211 const QModelIndex nativeIndex = QAndroidModelIndexProxy::qInstance(index);
212 const QVariant data =
213 invokeNativeMethod(env, object, &QAbstractItemModel::data, nativeIndex, role);
214 return QAndroidTypeConverter::toJavaObject(data, env);
217jobject QAndroidItemModelProxy::jni_index(JNIEnv *env, jobject object, jint row, jint column,
218 JQtModelIndex parent)
220 auto nativeParent = QAndroidModelIndexProxy::qInstance(parent);
221 const QModelIndex modelIndex =
222 invokeNativeMethod(env, object, &QAbstractItemModel::index, row, column, nativeParent);
223 return env->NewLocalRef(QAndroidModelIndexProxy::jInstance(modelIndex).object());
226jobject QAndroidItemModelProxy::jni_parent(JNIEnv *env, jobject object, JQtModelIndex index)
228 const QModelIndex nativeIndex = QAndroidModelIndexProxy::qInstance(index);
229 QModelIndex (QAbstractItemModel::*parentOverloadPtr)(
const QModelIndex &)
const =
230 &QAbstractItemModel::parent;
231 const QModelIndex parent = invokeNativeMethod(env, object, parentOverloadPtr, nativeIndex);
232 return env->NewLocalRef(QAndroidModelIndexProxy::jInstance(parent).object());
241jobject QAndroidItemModelProxy::jni_roleNames(JNIEnv *env, jobject object)
243 auto roleNames = invokeNativeImpl(env, object, &QAndroidItemModelProxy::defaultRoleNames,
244 &QAbstractItemModel::roleNames);
245 HashMap jRoleNames{};
246 for (
auto [role, roleName] : roleNames.asKeyValueRange()) {
247 const Integer jRole(role);
248 jRoleNames.callMethod<jobject>(
"put", jRole.object(), QString::fromUtf8(roleName));
250 return env->NewLocalRef(jRoleNames.object());
253jobject QAndroidItemModelProxy::jni_createIndex(JNIEnv *env, jobject object, jint row, jint column,
256 QModelIndex (QAndroidItemModelProxy::*createIndexPtr)(
int,
int, quintptr)
const =
257 &QAndroidItemModelProxy::createIndex;
258 const QModelIndex index =
259 invokeNativeProxyMethod(env, object, createIndexPtr, row, column, quintptr(id));
260 return env->NewLocalRef(QAndroidModelIndexProxy::jInstance(index).object());
263jboolean QAndroidItemModelProxy::jni_canFetchMore(JNIEnv *env, jobject object, JQtModelIndex parent)
265 return invokeNativeImpl(env, object, &QAndroidItemModelProxy::canFetchMoreDefault,
266 &QAbstractItemModel::canFetchMore,
267 QAndroidModelIndexProxy::qInstance(parent));
270void QAndroidItemModelProxy::jni_fetchMore(JNIEnv *env, jobject object, JQtModelIndex parent)
272 return invokeNativeImpl(env, object, &QAndroidItemModelProxy::fetchMoreDefault,
273 &QAbstractItemModel::fetchMore,
274 QAndroidModelIndexProxy::qInstance(parent));
277jboolean QAndroidItemModelProxy::jni_hasChildren(JNIEnv *env, jobject object, JQtModelIndex parent)
279 return invokeNativeImpl(env, object, &QAndroidItemModelProxy::hasChildrenDefault,
280 &QAbstractItemModel::hasChildren,
281 QAndroidModelIndexProxy::qInstance(parent));
284jboolean QAndroidItemModelProxy::jni_hasIndex(JNIEnv *env, jobject object, jint row, jint column,
285 JQtModelIndex parent)
287 return invokeNativeMethod(env, object, &QAbstractItemModel::hasIndex, row, column,
288 QAndroidModelIndexProxy::qInstance(parent));
291void QAndroidItemModelProxy::jni_beginInsertColumns(JNIEnv *env, jobject object,
292 JQtModelIndex parent, jint first, jint last)
295 invokeNativeProxyMethod(env, object, &QAndroidItemModelProxy::beginInsertColumns,
296 QAndroidModelIndexProxy::qInstance(parent), first, last);
299void QAndroidItemModelProxy::jni_beginInsertRows(JNIEnv *env, jobject object, JQtModelIndex parent,
300 jint first, jint last)
302 invokeNativeProxyMethod(env, object, &QAndroidItemModelProxy::beginInsertRows,
303 QAndroidModelIndexProxy::qInstance(parent), first, last);
306jboolean QAndroidItemModelProxy::jni_beginMoveColumns(JNIEnv *env, jobject object,
307 JQtModelIndex sourceParent, jint sourceFirst,
309 JQtModelIndex destinationParent,
310 jint destinationChild)
312 return invokeNativeProxyMethod(
313 env, object, &QAndroidItemModelProxy::beginMoveColumns,
314 QAndroidModelIndexProxy::qInstance(sourceParent), sourceFirst, sourceLast,
315 QAndroidModelIndexProxy::qInstance(destinationParent), destinationChild);
318jboolean QAndroidItemModelProxy::jni_beginMoveRows(JNIEnv *env, jobject object,
319 JQtModelIndex sourceParent, jint sourceFirst,
320 jint sourceLast, JQtModelIndex destinationParent,
321 jint destinationChild)
323 return invokeNativeProxyMethod(
324 env, object, &QAndroidItemModelProxy::beginMoveRows,
325 QAndroidModelIndexProxy::qInstance(sourceParent), sourceFirst, sourceLast,
326 QAndroidModelIndexProxy::qInstance(destinationParent), destinationChild);
329void QAndroidItemModelProxy::jni_beginRemoveColumns(JNIEnv *env, jobject object,
330 JQtModelIndex parent, jint first, jint last)
332 invokeNativeProxyMethod(env, object, &QAndroidItemModelProxy::beginRemoveColumns,
333 QAndroidModelIndexProxy::qInstance(parent), first, last);
336void QAndroidItemModelProxy::jni_beginRemoveRows(JNIEnv *env, jobject object, JQtModelIndex parent,
337 jint first, jint last)
339 invokeNativeProxyMethod(env, object, &QAndroidItemModelProxy::beginRemoveRows,
340 QAndroidModelIndexProxy::qInstance(parent), first, last);
383jobject QAndroidItemModelProxy::jni_sibling(JNIEnv *env, jobject object, jint row, jint column,
384 JQtModelIndex parent)
386 const QModelIndex index = invokeNativeImpl(env, object, &QAndroidItemModelProxy::siblingDefault,
387 &QAbstractItemModel::sibling, row, column,
388 QAndroidModelIndexProxy::qInstance(parent));
389 return env->NewLocalRef(QAndroidModelIndexProxy::jInstance(index).object());
392jboolean QAndroidItemModelProxy::jni_setData(JNIEnv *env, jobject object, JQtModelIndex index,
393 jobject value, jint role)
395 const QModelIndex nativeIndex = QAndroidModelIndexProxy::qInstance(index);
396 const QVariant qValue = QAndroidTypeConverter::toQVariant(QJniObject(value));
397 return invokeNativeImpl(env, object, &QAndroidItemModelProxy::setDataDefault,
398 &QAbstractItemModel::setData, nativeIndex, qValue, role);
401void QAndroidItemModelProxy::jni_dataChanged(JNIEnv *env, jobject object, JQtModelIndex topLeft,
402 JQtModelIndex bottomRight, QJniArray<jint> roles)
404 const QModelIndex nativeTopLeft = QAndroidModelIndexProxy::qInstance(topLeft);
405 const QModelIndex nativeBottomRight = QAndroidModelIndexProxy::qInstance(bottomRight);
406 const QList<
int> nativeRoles = roles.toContainer();
407 invokeNativeImpl(env, object, &QAndroidItemModelProxy::dataChanged,
408 &QAbstractItemModel::dataChanged, nativeTopLeft, nativeBottomRight,
412bool QAndroidItemModelProxy::registerAbstractNatives(QJniEnvironment &env)
414 return env.registerNativeMethods(
415 Traits<JQtAbstractItemModel>::className(),
416 { Q_JNI_NATIVE_SCOPED_METHOD(jni_roleNames, QAndroidItemModelProxy),
417 Q_JNI_NATIVE_SCOPED_METHOD(jni_canFetchMore, QAndroidItemModelProxy),
418 Q_JNI_NATIVE_SCOPED_METHOD(jni_createIndex, QAndroidItemModelProxy),
419 Q_JNI_NATIVE_SCOPED_METHOD(jni_fetchMore, QAndroidItemModelProxy),
420 Q_JNI_NATIVE_SCOPED_METHOD(jni_hasChildren, QAndroidItemModelProxy),
421 Q_JNI_NATIVE_SCOPED_METHOD(jni_hasIndex, QAndroidItemModelProxy),
422 Q_JNI_NATIVE_SCOPED_METHOD(jni_beginInsertColumns, QAndroidItemModelProxy),
423 Q_JNI_NATIVE_SCOPED_METHOD(jni_beginInsertRows, QAndroidItemModelProxy),
424 Q_JNI_NATIVE_SCOPED_METHOD(jni_beginMoveColumns, QAndroidItemModelProxy),
425 Q_JNI_NATIVE_SCOPED_METHOD(jni_beginMoveRows, QAndroidItemModelProxy),
426 Q_JNI_NATIVE_SCOPED_METHOD(jni_beginRemoveColumns, QAndroidItemModelProxy),
427 Q_JNI_NATIVE_SCOPED_METHOD(jni_beginRemoveRows, QAndroidItemModelProxy),
428 Q_JNI_NATIVE_SCOPED_METHOD(jni_beginResetModel, QAndroidItemModelProxy),
429 Q_JNI_NATIVE_SCOPED_METHOD(jni_endInsertColumns, QAndroidItemModelProxy),
430 Q_JNI_NATIVE_SCOPED_METHOD(jni_endInsertRows, QAndroidItemModelProxy),
431 Q_JNI_NATIVE_SCOPED_METHOD(jni_endMoveColumns, QAndroidItemModelProxy),
432 Q_JNI_NATIVE_SCOPED_METHOD(jni_endMoveRows, QAndroidItemModelProxy),
433 Q_JNI_NATIVE_SCOPED_METHOD(jni_endRemoveColumns, QAndroidItemModelProxy),
434 Q_JNI_NATIVE_SCOPED_METHOD(jni_endRemoveRows, QAndroidItemModelProxy),
435 Q_JNI_NATIVE_SCOPED_METHOD(jni_endResetModel, QAndroidItemModelProxy),
436 Q_JNI_NATIVE_SCOPED_METHOD(jni_sibling, QAndroidItemModelProxy),
437 Q_JNI_NATIVE_SCOPED_METHOD(jni_setData, QAndroidItemModelProxy),
438 Q_JNI_NATIVE_SCOPED_METHOD(jni_dataChanged, QAndroidItemModelProxy) });
441bool QAndroidItemModelProxy::registerProxyNatives(QJniEnvironment &env)
443 return env.registerNativeMethods(
444 Traits<JQtAndroidItemModelProxy>::className(),
445 { Q_JNI_NATIVE_SCOPED_METHOD(jni_columnCount, QAndroidItemModelProxy),
446 Q_JNI_NATIVE_SCOPED_METHOD(jni_data, QAndroidItemModelProxy),
447 Q_JNI_NATIVE_SCOPED_METHOD(jni_index, QAndroidItemModelProxy),
448 Q_JNI_NATIVE_SCOPED_METHOD(jni_parent, QAndroidItemModelProxy),
449 Q_JNI_NATIVE_SCOPED_METHOD(jni_rowCount, QAndroidItemModelProxy) });