Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qandroidextras.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qandroidextras_p.h"
5
6#include <QtCore/qbuffer.h>
7#include <QtCore/qdatastream.h>
8#include <QtCore/qjnienvironment.h>
9#include <QtCore/qvariant.h>
10#include <QtCore/qmutex.h>
11#include <QtCore/qtimer.h>
12#include <QtCore/qset.h>
13
14#if QT_CONFIG(future)
15#include <QtCore/qpromise.h>
16#endif
17
19
21{
22public:
24 explicit QAndroidParcelPrivate(const QJniObject& parcel);
25
26 void writeData(const QByteArray &data) const;
27 void writeBinder(const QAndroidBinder &binder) const;
28 void writeFileDescriptor(int fd) const;
29
30 QByteArray readData() const;
31 int readFileDescriptor() const;
33
34private:
35 friend class QAndroidBinder;
36 friend class QAndroidParcel;
38};
39
41{
42 explicit FileDescriptor(int fd = -1)
43 : handle("java/io/FileDescriptor")
44 {
45 QJniEnvironment().checkAndClearExceptions();
46 handle.setField("descriptor", fd);
47 }
48
50};
51
53 : handle(QJniObject::callStaticObjectMethod("android/os/Parcel","obtain",
54 "()Landroid/os/Parcel;").object())
55{}
56
60
62{
63 if (data.isEmpty())
64 return;
65
66 QJniEnvironment().checkAndClearExceptions();
68 jbyteArray array = env->NewByteArray(data.size());
69 env->SetByteArrayRegion(array, 0, data.length(),
70 reinterpret_cast<const jbyte*>(data.constData()));
71 handle.callMethod<void>("writeByteArray", "([B)V", array);
72 env->DeleteLocalRef(array);
73}
74
76{
77 QJniEnvironment().checkAndClearExceptions();
78 handle.callMethod<void>("writeStrongBinder", "(Landroid/os/IBinder;)V",
79 binder.handle().object());
80}
81
83{
84 QJniEnvironment().checkAndClearExceptions();
85 handle.callMethod<void>("writeFileDescriptor", "(Ljava/io/FileDescriptor;)V",
86 FileDescriptor(fd).handle.object());
87}
88
90{
91 QJniEnvironment().checkAndClearExceptions();
92 auto array = handle.callObjectMethod("createByteArray", "()[B");
94 auto sz = env->GetArrayLength(jbyteArray(array.object()));
96 env->GetByteArrayRegion(jbyteArray(array.object()), 0, sz,
97 reinterpret_cast<jbyte *>(res.data()));
98 return res;
99}
100
102{
103 QJniEnvironment().checkAndClearExceptions();
104 auto parcelFD = handle.callObjectMethod("readFileDescriptor",
105 "()Landroid/os/ParcelFileDescriptor;");
106 if (parcelFD.isValid())
107 return parcelFD.callMethod<jint>("getFd", "()I");
108 return -1;
109}
110
112{
113 QJniEnvironment().checkAndClearExceptions();
114 auto strongBinder = handle.callObjectMethod("readStrongBinder", "()Landroid/os/IBinder;");
115 return QAndroidBinder(strongBinder.object());
116}
117
141
146 : d(new QAndroidParcelPrivate(parcel))
147{
148
149}
150
154
159{
160 d->writeData(data);
161}
162
168{
169 QByteArray buff;
171 stream << value;
172 d->writeData(buff);
173}
174
180{
181 d->writeBinder(binder);
182}
183
191
196{
197 return d->readData();
198}
199
204{
207 stream >> res;
208 return res;
209}
210
215{
216 return d->readBinder();
217}
218
223{
224 return d->readFileDescriptor();
225}
226
231{
232 return d->handle;
233}
234
235
236
267{
268public:
270 : handle("org/qtproject/qt/android/extras/QtAndroidBinder", "(J)V", jlong(binder))
271 , m_isQtAndroidBinder(true)
272 {
273 QJniEnvironment().checkAndClearExceptions();
274 }
275
276 explicit QAndroidBinderPrivate(const QJniObject &binder)
277 : handle(binder), m_isQtAndroidBinder(false) {};
278 void setDeleteListener(const std::function<void()> &func) { m_deleteListener = func; }
280 {
281 if (m_isQtAndroidBinder) {
282 QJniEnvironment().checkAndClearExceptions();
283 handle.callMethod<void>("setId", "(J)V", jlong(0));
284 if (m_deleteListener)
285 m_deleteListener();
286 }
287 }
288
289private:
291 std::function<void()> m_deleteListener;
292 bool m_isQtAndroidBinder;
293 friend class QAndroidBinder;
294};
295
305
312 : d(new QAndroidBinderPrivate(binder))
313{
314}
315
319
334bool QAndroidBinder::onTransact(int /*code*/, const QAndroidParcel &/*data*/,
335 const QAndroidParcel &/*reply*/, CallType /*flags*/)
336{
337 return false;
338}
339
357{
358 QJniEnvironment().checkAndClearExceptions();
359 return d->handle.callMethod<jboolean>("transact",
360 "(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z",
361 jint(code), data.d->handle.object(),
362 reply ? reply->d->handle.object() : nullptr,
363 jint(flags));
364}
365
370{
371 return d->handle;
372}
373
374
375
376
399 : m_handle("org/qtproject/qt/android/extras/QtAndroidServiceConnection", "(J)V", jlong(this))
400{
401}
402
411 : m_handle(serviceConnection)
412{
413}
414
416{
417 m_handle.callMethod<void>("setId", "(J)V", jlong(this));
418}
419
424{
425 return m_handle;
426}
427
454Q_CONSTINIT static QBasicAtomicInteger<uint> nextUniqueActivityRequestCode = Q_BASIC_ATOMIC_INITIALIZER(0);
455
456// Get a unique activity request code.
458{
459 constexpr uint ReservedForQtOffset = 0x1000; // Reserve all request codes under 0x1000 for Qt
460
461 const uint requestCodeBase = nextUniqueActivityRequestCode.fetchAndAddRelaxed(1);
462 if (requestCodeBase == uint(INT_MAX) - ReservedForQtOffset)
463 qWarning("Unique activity request code has wrapped. Unexpected behavior may occur.");
464
465 const int requestCode = static_cast<int>(requestCodeBase + ReservedForQtOffset);
466 return requestCode;
467}
468
470{
471public:
473 mutable QHash<int, int> localToGlobalRequestCode;
474 mutable QHash<int, int> globalToLocalRequestCode;
475
476 int globalRequestCode(int localRequestCode) const
477 {
478 const auto oldSize = localToGlobalRequestCode.size();
479 auto &e = localToGlobalRequestCode[localRequestCode];
480 if (localToGlobalRequestCode.size() != oldSize) {
481 // new entry, populate:
485 }
486 return e;
487 }
488
489 bool handleActivityResult(jint requestCode, jint resultCode, jobject data)
490 {
491 const auto it = std::as_const(globalToLocalRequestCode).find(requestCode);
493 q->handleActivityResult(*it, resultCode, QJniObject(data));
494 return true;
495 }
496
497 return false;
498 }
499
501 {
502 return publicObject->d.data();
503 }
504};
505
529
537
553{
554public:
556 const std::function<QAndroidBinder*(const QAndroidIntent&)> &binder ={})
557 : m_service(service)
558 , m_binder(binder)
559 {
561 }
562
564 {
566 while (!m_binders.empty()) {
567 auto it = m_binders.begin();
568 lock.unlock();
569 delete (*it);
570 lock.relock();
571 }
572 }
573
574 // OnBindListener interface
575 jobject onBind(jobject intent) override
576 {
577 auto qai = QAndroidIntent(intent);
578 auto binder = m_binder ? m_binder(qai) : m_service->onBind(qai);
579 if (binder) {
580 {
582 binder->d->setDeleteListener([this, binder]{binderDestroied(binder);});
583 m_binders.insert(binder);
584 }
585 return binder->handle().object();
586 }
587 return nullptr;
588 }
589
590private:
591 void binderDestroied(QAndroidBinder* obj)
592 {
595 }
596
597public:
599 std::function<QAndroidBinder *(const QAndroidIntent &)> m_binder;
601 QSet<QAndroidBinder*> m_binders;
602};
603
627
630QAndroidService::QAndroidService(int &argc, char **argv, int flags)
631 : QCoreApplication (argc, argv, QtAndroidPrivate::acuqireServiceSetup(flags))
633{
634}
635
644
647QAndroidService::QAndroidService(int &argc, char **argv,
648 const std::function<QAndroidBinder*(const QAndroidIntent&)> &binder,
649 int flags)
650 : QCoreApplication (argc, argv, QtAndroidPrivate::acuqireServiceSetup(flags))
651 , d(new QAndroidServicePrivate{this, binder})
652{
653}
654
657
671{
672 return nullptr;
673}
674
675static jboolean onTransact(JNIEnv */*env*/, jclass /*cls*/, jlong id, jint code, jobject data,
676 jobject reply, jint flags)
677{
678 if (!id)
679 return false;
680
681 return reinterpret_cast<QAndroidBinder*>(id)->onTransact(
683}
684
685static void onServiceConnected(JNIEnv */*env*/, jclass /*cls*/, jlong id, jstring name,
686 jobject service)
687{
688 if (!id)
689 return;
690
691 return reinterpret_cast<QAndroidServiceConnection *>(id)->onServiceConnected(
692 QJniObject(name).toString(), QAndroidBinder(service));
693}
694
695static void onServiceDisconnected(JNIEnv */*env*/, jclass /*cls*/, jlong id, jstring name)
696{
697 if (!id)
698 return;
699
700 return reinterpret_cast<QAndroidServiceConnection *>(id)->onServiceDisconnected(
701 QJniObject(name).toString());
702}
703
705{
706 static const JNINativeMethod methods[] = {
707 {"onTransact", "(JILandroid/os/Parcel;Landroid/os/Parcel;I)Z", (void *)onTransact},
708 {"onServiceConnected", "(JLjava/lang/String;Landroid/os/IBinder;)V", (void *)onServiceConnected},
709 {"onServiceDisconnected", "(JLjava/lang/String;)V", (void *)onServiceDisconnected}
710 };
711
712 return env.registerNativeMethods("org/qtproject/qt/android/extras/QtNative", methods, 3);
713}
714
735 : m_handle("android.content.Intent", "()V")
736{
737
738}
739
742
747 : m_handle(intent)
748{
749}
750
755 : m_handle("android.content.Intent", "(Ljava/lang/String;)V",
756 QJniObject::fromString(action).object())
757{
758 QJniEnvironment().checkAndClearExceptions();
759}
760
770QAndroidIntent::QAndroidIntent(const QJniObject &packageContext, const char *className)
771 : m_handle("android/content/Intent", "(Landroid/content/Context;Ljava/lang/Class;)V",
772 packageContext.object(), QJniEnvironment().findClass(className))
773{
774 QJniEnvironment().checkAndClearExceptions();
775}
776
781{
782 QJniEnvironment().checkAndClearExceptions();
783 QJniEnvironment env;
784 jbyteArray array = env->NewByteArray(data.size());
785 env->SetByteArrayRegion(array, 0, data.length(),
786 reinterpret_cast<const jbyte*>(data.constData()));
787 m_handle.callObjectMethod("putExtra", "(Ljava/lang/String;[B)Landroid/content/Intent;",
788 QJniObject::fromString(key).object(), array);
789 env->DeleteLocalRef(array);
790 QJniEnvironment().checkAndClearExceptions();
791}
792
797{
798 QJniEnvironment().checkAndClearExceptions();
799 auto array = m_handle.callObjectMethod("getByteArrayExtra", "(Ljava/lang/String;)[B",
800 QJniObject::fromString(key).object());
801 if (!array.isValid() || !array.object())
802 return QByteArray();
803 QJniEnvironment env;
804 auto sz = env->GetArrayLength(jarray(array.object()));
806 env->GetByteArrayRegion(jbyteArray(array.object()), 0, sz,
807 reinterpret_cast<jbyte *>(res.data()));
808 QJniEnvironment().checkAndClearExceptions();
809
810 return res;
811}
812
817{
818 QByteArray buff;
820 stream << value;
821 putExtra(key, buff);
822}
823
834
839{
840 return m_handle;
841}
842
843
844
909 int receiverRequestCode,
910 QAndroidActivityResultReceiver *resultReceiver)
911{
913 if (resultReceiver != 0) {
916 activity.callMethod<void>("startActivityForResult",
917 "(Landroid/content/Intent;I)V",
918 intent.object<jobject>(),
919 resultReceiverD->globalRequestCode(receiverRequestCode));
920 } else {
921 activity.callMethod<void>("startActivity",
922 "(Landroid/content/Intent;)V",
923 intent.object<jobject>());
924 }
925}
926
942 int receiverRequestCode,
943 QAndroidActivityResultReceiver *resultReceiver)
944{
945 startActivity(intent.handle(), receiverRequestCode, resultReceiver);
946}
947
955 int receiverRequestCode,
956 std::function<void(int, int, const QJniObject &data)> callbackFunc)
957{
959 QAndroidActivityCallbackResultReceiver::instance()->registerCallback(receiverRequestCode,
960 callbackFunc);
962}
963
979 int receiverRequestCode,
980 QAndroidActivityResultReceiver *resultReceiver)
981{
983 if (resultReceiver != 0) {
986 activity.callMethod<void>("startIntentSenderForResult",
987 "(Landroid/content/IntentSender;ILandroid/content/Intent;III)V",
988 intentSender.object<jobject>(),
989 resultReceiverD->globalRequestCode(receiverRequestCode),
990 0, // fillInIntent
991 0, // flagsMask
992 0, // flagsValues
993 0); // extraFlags
994 } else {
995 activity.callMethod<void>("startIntentSender",
996 "(Landroid/content/IntentSender;Landroid/content/Intent;III)V",
997 intentSender.object<jobject>(),
998 0, // fillInIntent
999 0, // flagsMask
1000 0, // flagsValues
1001 0); // extraFlags
1002
1003 }
1004
1005}
1006
1024 const QAndroidServiceConnection &serviceConnection, BindFlags flags)
1025{
1026 QJniEnvironment().checkAndClearExceptions();
1028 return contextObj.callMethod<jboolean>(
1029 "bindService",
1030 "(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z",
1031 serviceIntent.handle().object(),
1032 serviceConnection.handle().object(),
1033 jint(flags));
1034}
1035
1036QAndroidActivityCallbackResultReceiver * QAndroidActivityCallbackResultReceiver::s_instance = nullptr;
1037
1043
1045 int resultCode,
1046 const QJniObject &intent)
1047{
1048 callbackMap[receiverRequestCode](receiverRequestCode, resultCode, intent);
1049 callbackMap.remove(receiverRequestCode);
1050}
1051
1053 if (!s_instance) {
1054 s_instance = new QAndroidActivityCallbackResultReceiver();
1055 }
1056 return s_instance;
1057}
1058
1060 int receiverRequestCode,
1061 std::function<void(int, int, const QJniObject &data)> callbackFunc)
1062{
1063 callbackMap.insert(receiverRequestCode, callbackFunc);
1064}
1065
1066// Permissions API
1067
1068static const char qtNativeClassName[] = "org/qtproject/qt/android/QtNative";
1069
1070QtAndroidPrivate::PermissionResult resultFromAndroid(jint value)
1071{
1072 return value == 0 ? QtAndroidPrivate::Authorized : QtAndroidPrivate::Denied;
1073}
1074
1076 = QHash<int, QSharedPointer<QPromise<QtAndroidPrivate::PermissionResult>>>;
1080static int nextRequestCode()
1081{
1082 Q_CONSTINIT static QBasicAtomicInt counter = Q_BASIC_ATOMIC_INITIALIZER(0);
1083 return counter.fetchAndAddRelaxed(1);
1084}
1085
1093static void sendRequestPermissionsResult(JNIEnv *env, jobject *obj, jint requestCode,
1094 jobjectArray permissions, jintArray grantResults)
1095{
1096 Q_UNUSED(obj);
1097
1099 auto it = g_pendingPermissionRequests->constFind(requestCode);
1100 if (it == g_pendingPermissionRequests->constEnd()) {
1101 qWarning() << "Found no valid pending permission request for request code" << requestCode;
1102 return;
1103 }
1104
1105 auto request = *it;
1106 g_pendingPermissionRequests->erase(it);
1107 locker.unlock();
1108
1109 const int size = env->GetArrayLength(permissions);
1110 std::unique_ptr<jint[]> results(new jint[size]);
1111 env->GetIntArrayRegion(grantResults, 0, size, results.get());
1112
1113 for (int i = 0 ; i < size; ++i) {
1114 QtAndroidPrivate::PermissionResult result = resultFromAndroid(results[i]);
1115 request->addResult(result, i);
1116 }
1117
1119 request->finish();
1120}
1121
1122QFuture<QtAndroidPrivate::PermissionResult>
1123requestPermissionsInternal(const QStringList &permissions)
1124{
1125 // No mechanism to request permission for SDK version below 23, because
1126 // permissions defined in the manifest are granted at install time.
1128 QList<QtAndroidPrivate::PermissionResult> result;
1129 result.reserve(permissions.size());
1130 // ### can we kick off all checkPermission()s, and whenAll() collect results?
1131 for (const QString &permission : permissions)
1132 result.push_back(QtAndroidPrivate::checkPermission(permission).result());
1134 }
1135
1137 return QtFuture::makeReadyValueFuture(QtAndroidPrivate::Denied);
1138
1139 QSharedPointer<QPromise<QtAndroidPrivate::PermissionResult>> promise;
1140 promise.reset(new QPromise<QtAndroidPrivate::PermissionResult>());
1141 QFuture<QtAndroidPrivate::PermissionResult> future = promise->future();
1142 promise->start();
1143
1144 const int requestCode = nextRequestCode();
1146 g_pendingPermissionRequests->insert(requestCode, promise);
1147 locker.unlock();
1148
1149 QNativeInterface::QAndroidApplication::runOnAndroidMainThread([permissions, requestCode] {
1150 QJniEnvironment env;
1151 jclass clazz = env.findClass("java/lang/String");
1152 auto array = env->NewObjectArray(permissions.size(), clazz, nullptr);
1153 int index = 0;
1154
1155 for (auto &perm : permissions)
1156 env->SetObjectArrayElement(array, index++, QJniObject::fromString(perm).object());
1157
1158 QJniObject(QtAndroidPrivate::activity()).callMethod<void>("requestPermissions",
1159 "([Ljava/lang/String;I)V",
1160 array,
1161 requestCode);
1162 env->DeleteLocalRef(array);
1163 });
1164
1165 return future;
1166}
1167
1176QFuture<QtAndroidPrivate::PermissionResult>
1177QtAndroidPrivate::requestPermission(const QString &permission)
1178{
1179 return requestPermissions({permission});
1180}
1181
1182QFuture<QtAndroidPrivate::PermissionResult>
1183QtAndroidPrivate::requestPermissions(const QStringList &permissions)
1184{
1185 // avoid the uneccessary call and response to an empty permission string
1186 if (permissions.isEmpty())
1187 return QtFuture::makeReadyValueFuture(QtAndroidPrivate::Denied);
1188 return requestPermissionsInternal(permissions);
1189}
1190
1199QFuture<QtAndroidPrivate::PermissionResult>
1200QtAndroidPrivate::checkPermission(const QString &permission)
1201{
1202 QtAndroidPrivate::PermissionResult result = Denied;
1203 if (!permission.isEmpty()) {
1204 auto res = QJniObject::callStaticMethod<jint>(qtNativeClassName,
1205 "checkSelfPermission",
1206 "(Ljava/lang/String;)I",
1207 QJniObject::fromString(permission).object());
1209 }
1211}
1214{
1216 return true;
1217
1218 const JNINativeMethod methods[] = {
1219 {"sendRequestPermissionsResult", "(I[Ljava/lang/String;[I)V",
1220 reinterpret_cast<void *>(sendRequestPermissionsResult)
1221 }};
1222
1223 return env.registerNativeMethods(qtNativeClassName, methods, 1);
1224}
1225
1227
1228#include "moc_qandroidextras_p.cpp"
static JNINativeMethod methods[]
void handleActivityResult(int receiverRequestCode, int resultCode, const QJniObject &intent) override
Reimplement this function to get activity results after starting an activity using either QtAndroidPr...
static QAndroidActivityCallbackResultReceiver * instance()
void registerCallback(int receiverRequestCode, std::function< void(int, int, const QJniObject &)> callbackFunc)
QAndroidActivityResultReceiver * q
int globalRequestCode(int localRequestCode) const
bool handleActivityResult(jint requestCode, jint resultCode, jobject data)
static QAndroidActivityResultReceiverPrivate * get(QAndroidActivityResultReceiver *publicObject)
\inheaderfile QtCore/private/qandroidextras_p.h \preliminary \inmodule QtCorePrivate
QAndroidBinderPrivate(const QJniObject &binder)
void setDeleteListener(const std::function< void()> &func)
QAndroidBinderPrivate(QAndroidBinder *binder)
\inheaderfile QtCore/private/qandroidextras_p.h \preliminary \inmodule QtCorePrivate
QJniObject handle() const
The return value is useful to call other Java API which are not covered by this wrapper.
virtual bool onTransact(int code, const QAndroidParcel &data, const QAndroidParcel &reply, CallType flags)
Default implementation is a stub that returns false.
CallType
This enum is used with \l QAndroidBinder::transact() to describe the mode in which the IPC call is pe...
bool transact(int code, const QAndroidParcel &data, QAndroidParcel *reply=nullptr, CallType flags=CallType::Normal) const
Performs an IPC call.
virtual ~QAndroidBinder()
QAndroidBinder()
Creates a new object which can be used to perform IPC.
\inheaderfile QtCore/private/qandroidextras_p.h \preliminary \inmodule QtCorePrivate
QAndroidIntent()
Create a new intent.
virtual ~QAndroidIntent()
QVariant extraVariant(const QString &key)
Returns the extra key data from the Intent extras as a QVariant.
void putExtra(const QString &key, const QByteArray &data)
Sets the key with the data in the Intent extras.
QByteArray extraBytes(const QString &key)
Returns the extra key data from the Intent extras.
QJniObject handle() const
The return value is useful to call other Java API which are not covered by this wrapper.
void writeBinder(const QAndroidBinder &binder) const
QAndroidBinder readBinder() const
void writeData(const QByteArray &data) const
QByteArray readData() const
void writeFileDescriptor(int fd) const
\inheaderfile QtCore/private/qandroidextras_p.h \preliminary \inmodule QtCorePrivate
QVariant readVariant() const
Returns the data as a QVariant.
QAndroidBinder readBinder() const
Returns the binder as a QAndroidBinder.
void writeBinder(const QAndroidBinder &binder) const
Writes a binder object.
QAndroidParcel()
Creates a new object.
QJniObject handle() const
The return value is useful to call other Java API which are not covered by this wrapper.
QByteArray readData() const
Returns the data as a QByteArray.
void writeVariant(const QVariant &value) const
Writes the provided value.
void writeFileDescriptor(int fd) const
Writes the provided fd.
virtual ~QAndroidParcel()
void writeData(const QByteArray &data) const
Writes the provided data as a byte array.
int readFileDescriptor() const
Returns the file descriptor.
\inheaderfile QtCore/private/qandroidextras_p.h \preliminary \inmodule QtCorePrivate
QJniObject handle() const
returns the underline QJniObject
QAndroidServiceConnection()
Creates a new object.
QAndroidService * m_service
QSet< QAndroidBinder * > m_binders
QAndroidServicePrivate(QAndroidService *service, const std::function< QAndroidBinder *(const QAndroidIntent &)> &binder={})
std::function< QAndroidBinder *(const QAndroidIntent &) m_binder)
jobject onBind(jobject intent) override
\inheaderfile QtCore/private/qandroidextras_p.h \preliminary \inmodule QtCorePrivate
QAndroidService(int &argc, char **argv, int flags=ApplicationFlags)
virtual ~QAndroidService()
virtual QAndroidBinder * onBind(const QAndroidIntent &intent)
The user must override this method and to return a binder.
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore
\inmodule QtCore\reentrant
Definition qdatastream.h:46
\inmodule QtCore
Definition qhash.h:820
qsizetype size() const noexcept
Returns the number of items in the hash.
Definition qhash.h:927
const_iterator cend() const noexcept
Definition qhash.h:1218
\inmodule QtCore
\inmodule QtCore
\inmodule QtCore
Definition qmutex.h:313
void unlock() noexcept
Unlocks this mutex locker.
Definition qmutex.h:319
\inmodule QtCore
Definition qmutex.h:281
\inmodule QtCore
Definition qobject.h:103
T * data() const noexcept
Returns the value of the pointer referenced by this object.
bool remove(const T &value)
Definition qset.h:63
iterator begin()
Definition qset.h:136
const_iterator constEnd() const noexcept
Definition qset.h:143
iterator erase(const_iterator i)
Definition qset.h:145
const_iterator constFind(const T &value) const
Definition qset.h:161
iterator find(const T &value)
Definition qset.h:159
iterator insert(const T &value)
Definition qset.h:155
bool empty() const
Definition qset.h:177
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:192
bool singleShot
whether the timer is a single-shot timer
Definition qtimer.h:22
\inmodule QtCore
Definition qvariant.h:65
#define this
Definition dialogs.cpp:9
QSet< QString >::iterator it
Combined button and popup list for selecting options.
\preliminary \inmodule QtCorePrivate
Q_CORE_EXPORT jint androidSdkVersion()
Q_CORE_EXPORT bool acquireAndroidDeadlockProtector()
Q_CORE_EXPORT void startIntentSender(const QJniObject &intentSender, int receiverRequestCode, QAndroidActivityResultReceiver *resultReceiver=nullptr)
Q_CORE_EXPORT QtJniTypes::Context context()
bool registerExtrasNatives(QJniEnvironment &env)
bool registerPermissionNatives(QJniEnvironment &env)
Q_CORE_EXPORT void startActivity(const QJniObject &intent, int receiverRequestCode, QAndroidActivityResultReceiver *resultReceiver=nullptr)
Q_CORE_EXPORT QtJniTypes::Activity activity()
Q_CORE_EXPORT bool bindService(const QAndroidIntent &serviceIntent, const QAndroidServiceConnection &serviceConnection, BindFlags flags=BindFlag::None)
Q_CORE_EXPORT void releaseAndroidDeadlockProtector()
Q_CORE_EXPORT void setOnBindListener(OnBindListener *listener)
Q_CORE_EXPORT void unregisterActivityResultListener(ActivityResultListener *listener)
Q_CORE_EXPORT void registerActivityResultListener(ActivityResultListener *listener)
static QFuture< std::decay_t< T > > makeReadyValueFuture(T &&value)
static QFuture< ContainedType< Container > > makeReadyRangeFuture(Container &&container)
static Q_CONSTINIT QBasicAtomicInteger< uint > nextUniqueActivityRequestCode
QFuture< QtAndroidPrivate::PermissionResult > requestPermissionsInternal(const QStringList &permissions)
static jboolean onTransact(JNIEnv *, jclass, jlong id, jint code, jobject data, jobject reply, jint flags)
QtAndroidPrivate::PermissionResult resultFromAndroid(jint value)
static int nextRequestCode()
static void onServiceConnected(JNIEnv *, jclass, jlong id, jstring name, jobject service)
static const char qtNativeClassName[]
static void onServiceDisconnected(JNIEnv *, jclass, jlong id, jstring name)
static Q_CONSTINIT QBasicMutex g_pendingPermissionRequestsMutex
static void sendRequestPermissionsResult(JNIEnv *env, jobject *obj, jint requestCode, jobjectArray permissions, jintArray grantResults)
static int uniqueActivityRequestCode()
#define Q_BASIC_ATOMIC_INITIALIZER(a)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
EGLStreamKHR stream
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
#define qWarning
Definition qlogging.h:166
GLuint64 GLenum void * handle
GLuint64 key
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLuint index
[2]
GLenum GLuint id
[7]
GLuint object
[3]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLbitfield flags
GLuint64 GLenum GLint fd
GLuint name
GLuint counter
GLhandleARB obj
[2]
GLenum func
Definition qopenglext.h:663
GLuint res
GLenum array
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
GLuint64EXT * result
[6]
static bool fromString(const QMetaObject *mo, QString s, Allocate &&allocate)
#define Q_UNUSED(x)
unsigned int uint
Definition qtypes.h:34
const char className[16]
[1]
Definition qwizard.cpp:100
QFuture< void > future
[5]
QReadWriteLock lock
[0]
QNetworkRequest request(url)
QNetworkReply * reply
FileDescriptor(int fd=-1)