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>
15#include <QtCore/qpromise.h>
43 :
handle(
"java/io/FileDescriptor")
54 "()Landroid/os/Parcel;").
object())
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);
78 handle.callMethod<
void>(
"writeStrongBinder",
"(Landroid/os/IBinder;)V",
79 binder.handle().object());
85 handle.callMethod<
void>(
"writeFileDescriptor",
"(Ljava/io/FileDescriptor;)V",
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()));
104 auto parcelFD =
handle.callObjectMethod(
"readFileDescriptor",
105 "()Landroid/os/ParcelFileDescriptor;");
106 if (parcelFD.isValid())
107 return parcelFD.callMethod<jint>(
"getFd",
"()I");
114 auto strongBinder =
handle.callObjectMethod(
"readStrongBinder",
"()Landroid/os/IBinder;");
270 :
handle(
"org/qtproject/qt/android/extras/QtAndroidBinder",
"(J)V", jlong(binder))
271 , m_isQtAndroidBinder(true)
281 if (m_isQtAndroidBinder) {
283 handle.callMethod<
void>(
"setId",
"(J)V", jlong(0));
284 if (m_deleteListener)
291 std::function<
void()> m_deleteListener;
292 bool m_isQtAndroidBinder;
359 return d->handle.callMethod<jboolean>(
"transact",
360 "(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z",
361 jint(code),
data.d->handle.object(),
399 : m_handle(
"org/qtproject/qt/android/extras/QtAndroidServiceConnection",
"(J)V", jlong(
this))
411 : m_handle(serviceConnection)
417 m_handle.callMethod<
void>(
"setId",
"(J)V", jlong(
this));
459 constexpr uint ReservedForQtOffset = 0x1000;
462 if (requestCodeBase ==
uint(INT_MAX) - ReservedForQtOffset)
463 qWarning(
"Unique activity request code has wrapped. Unexpected behavior may occur.");
465 const int requestCode =
static_cast<int>(requestCodeBase + ReservedForQtOffset);
502 return publicObject->d.data();
582 binder->d->setDeleteListener([
this, binder]{binderDestroied(binder);});
585 return binder->handle().object();
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},
712 return env.registerNativeMethods(
"org/qtproject/qt/android/extras/QtNative",
methods, 3);
735 : m_handle(
"android.content.Intent",
"()V")
755 : m_handle(
"android.content.Intent",
"(Ljava/lang/String;)V",
771 : m_handle(
"android/content/Intent",
"(Landroid/content/Context;Ljava/lang/Class;)V",
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);
799 auto array = m_handle.callObjectMethod(
"getByteArrayExtra",
"(Ljava/lang/String;)[B",
800 QJniObject::fromString(
key).
object());
804 auto sz = env->GetArrayLength(jarray(
array.object()));
806 env->GetByteArrayRegion(jbyteArray(
array.object()), 0, sz,
807 reinterpret_cast<jbyte *
>(
res.data()));
909 int receiverRequestCode,
913 if (resultReceiver != 0) {
916 activity.callMethod<
void>(
"startActivityForResult",
917 "(Landroid/content/Intent;I)V",
918 intent.object<jobject>(),
919 resultReceiverD->globalRequestCode(receiverRequestCode));
921 activity.callMethod<
void>(
"startActivity",
922 "(Landroid/content/Intent;)V",
923 intent.object<jobject>());
942 int receiverRequestCode,
945 startActivity(intent.handle(), receiverRequestCode, resultReceiver);
955 int receiverRequestCode,
956 std::function<
void(
int,
int,
const QJniObject &
data)> callbackFunc)
979 int receiverRequestCode,
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),
995 activity.callMethod<
void>(
"startIntentSender",
996 "(Landroid/content/IntentSender;Landroid/content/Intent;III)V",
997 intentSender.object<jobject>(),
1028 return contextObj.callMethod<jboolean>(
1030 "(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z",
1031 serviceIntent.handle().object(),
1032 serviceConnection.handle().object(),
1048 callbackMap[receiverRequestCode](receiverRequestCode, resultCode, intent);
1049 callbackMap.remove(receiverRequestCode);
1060 int receiverRequestCode,
1061 std::function<
void(
int,
int,
const QJniObject &
data)> callbackFunc)
1063 callbackMap.insert(receiverRequestCode, callbackFunc);
1072 return value == 0 ? QtAndroidPrivate::Authorized : QtAndroidPrivate::Denied;
1076 = QHash<int, QSharedPointer<QPromise<QtAndroidPrivate::PermissionResult>>>;
1083 return counter.fetchAndAddRelaxed(1);
1094 jobjectArray permissions, jintArray grantResults)
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;
1106 g_pendingPermissionRequests->
erase(
it);
1109 const int size = env->GetArrayLength(permissions);
1111 env->GetIntArrayRegion(grantResults, 0,
size,
results.get());
1113 for (
int i = 0 ;
i <
size; ++
i) {
1122QFuture<QtAndroidPrivate::PermissionResult>
1128 QList<QtAndroidPrivate::PermissionResult>
result;
1129 result.reserve(permissions.size());
1131 for (
const QString &permission : permissions)
1132 result.push_back(QtAndroidPrivate::checkPermission(permission).result());
1139 QSharedPointer<QPromise<QtAndroidPrivate::PermissionResult>> promise;
1140 promise.reset(
new QPromise<QtAndroidPrivate::PermissionResult>());
1141 QFuture<QtAndroidPrivate::PermissionResult>
future = promise->future();
1146 g_pendingPermissionRequests->insert(requestCode, promise);
1149 QNativeInterface::QAndroidApplication::runOnAndroidMainThread([permissions, requestCode] {
1151 jclass clazz = env.findClass(
"java/lang/String");
1152 auto array = env->NewObjectArray(permissions.size(), clazz,
nullptr);
1155 for (
auto &perm : permissions)
1156 env->SetObjectArrayElement(
array,
index++, QJniObject::fromString(perm).object());
1159 "([Ljava/lang/String;I)V",
1162 env->DeleteLocalRef(
array);
1176QFuture<QtAndroidPrivate::PermissionResult>
1177QtAndroidPrivate::requestPermission(
const QString &permission)
1179 return requestPermissions({permission});
1182QFuture<QtAndroidPrivate::PermissionResult>
1183QtAndroidPrivate::requestPermissions(
const QStringList &permissions)
1186 if (permissions.isEmpty())
1199QFuture<QtAndroidPrivate::PermissionResult>
1200QtAndroidPrivate::checkPermission(
const QString &permission)
1205 "checkSelfPermission",
1206 "(Ljava/lang/String;)I",
1207 QJniObject::fromString(permission).
object());
1218 const JNINativeMethod
methods[] = {
1219 {
"sendRequestPermissionsResult",
"(I[Ljava/lang/String;[I)V",
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()
QAndroidActivityCallbackResultReceiver()
void registerCallback(int receiverRequestCode, std::function< void(int, int, const QJniObject &)> callbackFunc)
QAndroidActivityResultReceiver * q
int globalRequestCode(int localRequestCode) const
QHash< int, int > globalToLocalRequestCode
bool handleActivityResult(jint requestCode, jint resultCode, jobject data)
static QAndroidActivityResultReceiverPrivate * get(QAndroidActivityResultReceiver *publicObject)
QHash< int, int > localToGlobalRequestCode
\inheaderfile QtCore/private/qandroidextras_p.h \preliminary \inmodule QtCorePrivate
virtual ~QAndroidActivityResultReceiver()
QAndroidActivityResultReceiver()
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
friend class QAndroidBinder
int readFileDescriptor() 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.
virtual ~QAndroidServiceConnection()
~QAndroidServicePrivate()
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\reentrant
qsizetype size() const noexcept
Returns the number of items in the hash.
const_iterator cend() const noexcept
void unlock() noexcept
Unlocks this mutex locker.
T * data() const noexcept
Returns the value of the pointer referenced by this object.
bool remove(const T &value)
const_iterator constEnd() const noexcept
iterator erase(const_iterator i)
const_iterator constFind(const T &value) const
iterator find(const T &value)
iterator insert(const T &value)
\macro QT_RESTRICTED_CAST_FROM_ASCII
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
bool singleShot
whether the timer is a single-shot timer
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)()
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
GLuint64 GLenum void * handle
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLdouble GLdouble GLdouble GLdouble q
static bool fromString(const QMetaObject *mo, QString s, Allocate &&allocate)
const char className[16]
[1]
QFuture< void > future
[5]
QNetworkRequest request(url)
FileDescriptor(int fd=-1)