Qt 6.x
The Qt SDK
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
58 : handle(parcel)
59{}
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
138 : d(new QAndroidParcelPrivate())
139{
140}
141
146 : d(new QAndroidParcelPrivate(parcel))
147{
148
149}
150
152{
153}
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
188{
190}
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
303{
304}
305
312 : d(new QAndroidBinderPrivate(binder))
313{
314}
315
317{
318}
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
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:
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
525{
526 d->q = this;
528}
529
534{
536}
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;
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
656{}
657
671{
672 return nullptr;
673}
674
675
696 : m_handle("android.content.Intent", "()V")
697{
698
699}
700
702{}
703
708 : m_handle(intent)
709{
710}
711
716 : m_handle("android.content.Intent", "(Ljava/lang/String;)V",
717 QJniObject::fromString(action).object())
718{
719 QJniEnvironment().checkAndClearExceptions();
720}
721
731QAndroidIntent::QAndroidIntent(const QJniObject &packageContext, const char *className)
732 : m_handle("android/content/Intent", "(Landroid/content/Context;Ljava/lang/Class;)V",
733 packageContext.object(), QJniEnvironment().findClass(className))
734{
735 QJniEnvironment().checkAndClearExceptions();
736}
737
742{
743 QJniEnvironment().checkAndClearExceptions();
744 QJniEnvironment env;
745 jbyteArray array = env->NewByteArray(data.size());
746 env->SetByteArrayRegion(array, 0, data.length(),
747 reinterpret_cast<const jbyte*>(data.constData()));
748 m_handle.callObjectMethod("putExtra", "(Ljava/lang/String;[B)Landroid/content/Intent;",
749 QJniObject::fromString(key).object(), array);
750 env->DeleteLocalRef(array);
751 QJniEnvironment().checkAndClearExceptions();
752}
753
758{
759 QJniEnvironment().checkAndClearExceptions();
760 auto array = m_handle.callObjectMethod("getByteArrayExtra", "(Ljava/lang/String;)[B",
761 QJniObject::fromString(key).object());
762 if (!array.isValid() || !array.object())
763 return QByteArray();
764 QJniEnvironment env;
765 auto sz = env->GetArrayLength(jarray(array.object()));
767 env->GetByteArrayRegion(jbyteArray(array.object()), 0, sz,
768 reinterpret_cast<jbyte *>(res.data()));
769 QJniEnvironment().checkAndClearExceptions();
770
771 return res;
772}
773
778{
779 QByteArray buff;
781 stream << value;
782 putExtra(key, buff);
783}
784
789{
792 stream >> res;
793 return res;
794}
795
800{
801 return m_handle;
802}
803
804
805
870 int receiverRequestCode,
871 QAndroidActivityResultReceiver *resultReceiver)
872{
874 if (resultReceiver != 0) {
877 activity.callMethod<void>("startActivityForResult",
878 "(Landroid/content/Intent;I)V",
879 intent.object<jobject>(),
880 resultReceiverD->globalRequestCode(receiverRequestCode));
881 } else {
882 activity.callMethod<void>("startActivity",
883 "(Landroid/content/Intent;)V",
884 intent.object<jobject>());
885 }
886}
887
903 int receiverRequestCode,
904 QAndroidActivityResultReceiver *resultReceiver)
905{
906 startActivity(intent.handle(), receiverRequestCode, resultReceiver);
907}
908
916 int receiverRequestCode,
917 std::function<void(int, int, const QJniObject &data)> callbackFunc)
918{
921 callbackFunc);
923}
924
940 int receiverRequestCode,
941 QAndroidActivityResultReceiver *resultReceiver)
942{
944 if (resultReceiver != 0) {
947 activity.callMethod<void>("startIntentSenderForResult",
948 "(Landroid/content/IntentSender;ILandroid/content/Intent;III)V",
949 intentSender.object<jobject>(),
950 resultReceiverD->globalRequestCode(receiverRequestCode),
951 0, // fillInIntent
952 0, // flagsMask
953 0, // flagsValues
954 0); // extraFlags
955 } else {
956 activity.callMethod<void>("startIntentSender",
957 "(Landroid/content/IntentSender;Landroid/content/Intent;III)V",
958 intentSender.object<jobject>(),
959 0, // fillInIntent
960 0, // flagsMask
961 0, // flagsValues
962 0); // extraFlags
963
964 }
965
966}
967
985 const QAndroidServiceConnection &serviceConnection, BindFlags flags)
986{
987 QJniEnvironment().checkAndClearExceptions();
989 return contextObj.callMethod<jboolean>(
990 "bindService",
991 "(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z",
992 serviceIntent.handle().object(),
993 serviceConnection.handle().object(),
994 jint(flags));
995}
996
997QAndroidActivityCallbackResultReceiver * QAndroidActivityCallbackResultReceiver::s_instance = nullptr;
998
1001 , callbackMap()
1002{
1003}
1004
1006 int resultCode,
1007 const QJniObject &intent)
1008{
1009 callbackMap[receiverRequestCode](receiverRequestCode, resultCode, intent);
1010 callbackMap.remove(receiverRequestCode);
1011}
1012
1014 if (!s_instance) {
1015 s_instance = new QAndroidActivityCallbackResultReceiver();
1016 }
1017 return s_instance;
1018}
1019
1021 int receiverRequestCode,
1022 std::function<void(int, int, const QJniObject &data)> callbackFunc)
1023{
1024 callbackMap.insert(receiverRequestCode, callbackFunc);
1025}
1026
1027// Permissions API
1028
1029static const char qtNativeClassName[] = "org/qtproject/qt/android/QtNative";
1030
1031QtAndroidPrivate::PermissionResult resultFromAndroid(jint value)
1032{
1033 return value == 0 ? QtAndroidPrivate::Authorized : QtAndroidPrivate::Denied;
1034}
1035
1040
1042{
1043 Q_CONSTINIT static QBasicAtomicInt counter = Q_BASIC_ATOMIC_INITIALIZER(0);
1044 return counter.fetchAndAddRelaxed(1);
1045}
1046
1054static void sendRequestPermissionsResult(JNIEnv *env, jobject *obj, jint requestCode,
1055 jobjectArray permissions, jintArray grantResults)
1056{
1057 Q_UNUSED(obj);
1058
1060 auto it = g_pendingPermissionRequests->constFind(requestCode);
1061 if (it == g_pendingPermissionRequests->constEnd()) {
1062 qWarning() << "Found no valid pending permission request for request code" << requestCode;
1063 return;
1064 }
1065
1066 auto request = *it;
1067 g_pendingPermissionRequests->erase(it);
1068 locker.unlock();
1069
1070 const int size = env->GetArrayLength(permissions);
1071 std::unique_ptr<jint[]> results(new jint[size]);
1072 env->GetIntArrayRegion(grantResults, 0, size, results.get());
1073
1074 for (int i = 0 ; i < size; ++i) {
1075 QtAndroidPrivate::PermissionResult result = resultFromAndroid(results[i]);
1076 request->addResult(result, i);
1077 }
1078
1080 request->finish();
1081}
1082
1085{
1086 // No mechanism to request permission for SDK version below 23, because
1087 // permissions defined in the manifest are granted at install time.
1090 result.reserve(permissions.size());
1091 // ### can we kick off all checkPermission()s, and whenAll() collect results?
1092 for (const QString &permission : permissions)
1093 result.push_back(QtAndroidPrivate::checkPermission(permission).result());
1095 }
1096
1098 return QtFuture::makeReadyValueFuture(QtAndroidPrivate::Denied);
1099
1103 promise->start();
1104
1105 const int requestCode = nextRequestCode();
1107 g_pendingPermissionRequests->insert(requestCode, promise);
1108 locker.unlock();
1109
1110 QNativeInterface::QAndroidApplication::runOnAndroidMainThread([permissions, requestCode] {
1111 QJniEnvironment env;
1112 jclass clazz = env.findClass("java/lang/String");
1113 auto array = env->NewObjectArray(permissions.size(), clazz, nullptr);
1114 int index = 0;
1115
1116 for (auto &perm : permissions)
1117 env->SetObjectArrayElement(array, index++, QJniObject::fromString(perm).object());
1118
1119 QJniObject(QtAndroidPrivate::activity()).callMethod<void>("requestPermissions",
1120 "([Ljava/lang/String;I)V",
1121 array,
1122 requestCode);
1123 env->DeleteLocalRef(array);
1124 });
1125
1126 return future;
1127}
1128
1138QtAndroidPrivate::requestPermission(const QString &permission)
1139{
1140 return requestPermissions({permission});
1141}
1142
1144QtAndroidPrivate::requestPermissions(const QStringList &permissions)
1145{
1146 // avoid the uneccessary call and response to an empty permission string
1147 if (permissions.isEmpty())
1148 return QtFuture::makeReadyValueFuture(QtAndroidPrivate::Denied);
1149 return requestPermissionsInternal(permissions);
1150}
1151
1161QtAndroidPrivate::checkPermission(const QString &permission)
1162{
1163 QtAndroidPrivate::PermissionResult result = Denied;
1164 if (!permission.isEmpty()) {
1165 auto res = QJniObject::callStaticMethod<jint>(qtNativeClassName,
1166 "checkSelfPermission",
1167 "(Ljava/lang/String;)I",
1168 QJniObject::fromString(permission).object());
1170 }
1172}
1173
1175{
1177 return true;
1178
1179 const JNINativeMethod methods[] = {
1180 {"sendRequestPermissionsResult", "(I[Ljava/lang/String;[I)V",
1181 reinterpret_cast<void *>(sendRequestPermissionsResult)
1182 }};
1183
1184 QJniEnvironment env;
1185 return env.registerNativeMethods(qtNativeClassName, methods, 1);
1186}
1187
1189
1190#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.
T fetchAndAddRelaxed(T valueToAdd) noexcept
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore
\inmodule QtCore\reentrant
Definition qdatastream.h:30
\inmodule QtCore
Definition qhash.h:818
qsizetype size() const noexcept
Returns the number of items in the hash.
Definition qhash.h:925
const_iterator cend() const noexcept
Definition qhash.h:1208
\inmodule QtCore
\inmodule QtCore
Definition qlist.h:74
iterator insert(const Key &key, const T &value)
Definition qmap.h:687
size_type remove(const Key &key)
Definition qmap.h:299
\inmodule QtCore
Definition qmutex.h:317
void unlock() noexcept
Unlocks this mutex locker.
Definition qmutex.h:323
\inmodule QtCore
Definition qmutex.h:285
\inmodule QtCore
Definition qobject.h:90
T * data() const noexcept
Returns the value of the pointer referenced by this object.
Definition qset.h:18
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
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:1083
bool singleShot
whether the timer is a single-shot timer
Definition qtimer.h:22
\inmodule QtCore
Definition qvariant.h:64
#define this
Definition dialogs.cpp:9
double e
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()
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)
QtAndroidPrivate::PermissionResult resultFromAndroid(jint value)
static int nextRequestCode()
static const char qtNativeClassName[]
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
EGLStreamKHR stream
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
#define qWarning
Definition qlogging.h:162
GLuint64 GLenum void * handle
GLuint64 key
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLuint index
[2]
GLuint object
[3]
GLbitfield flags
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLuint64 GLenum GLint fd
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:29
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)