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",
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();
696 : m_handle(
"android.content.Intent",
"()V")
716 : m_handle(
"android.content.Intent",
"(Ljava/lang/String;)V",
732 : m_handle(
"android/content/Intent",
"(Landroid/content/Context;Ljava/lang/Class;)V",
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);
760 auto array = m_handle.callObjectMethod(
"getByteArrayExtra",
"(Ljava/lang/String;)[B",
761 QJniObject::fromString(
key).
object());
765 auto sz = env->GetArrayLength(jarray(
array.object()));
767 env->GetByteArrayRegion(jbyteArray(
array.object()), 0, sz,
768 reinterpret_cast<jbyte *
>(
res.data()));
870 int receiverRequestCode,
874 if (resultReceiver != 0) {
877 activity.callMethod<
void>(
"startActivityForResult",
878 "(Landroid/content/Intent;I)V",
879 intent.object<jobject>(),
882 activity.callMethod<
void>(
"startActivity",
883 "(Landroid/content/Intent;)V",
884 intent.object<jobject>());
903 int receiverRequestCode,
916 int receiverRequestCode,
917 std::function<
void(
int,
int,
const QJniObject &
data)> callbackFunc)
940 int receiverRequestCode,
944 if (resultReceiver != 0) {
947 activity.callMethod<
void>(
"startIntentSenderForResult",
948 "(Landroid/content/IntentSender;ILandroid/content/Intent;III)V",
949 intentSender.object<jobject>(),
956 activity.callMethod<
void>(
"startIntentSender",
957 "(Landroid/content/IntentSender;Landroid/content/Intent;III)V",
958 intentSender.object<jobject>(),
989 return contextObj.callMethod<jboolean>(
991 "(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z",
992 serviceIntent.
handle().object(),
993 serviceConnection.
handle().object(),
1009 callbackMap[receiverRequestCode](receiverRequestCode, resultCode, intent);
1010 callbackMap.
remove(receiverRequestCode);
1021 int receiverRequestCode,
1022 std::function<
void(
int,
int,
const QJniObject &
data)> callbackFunc)
1024 callbackMap.
insert(receiverRequestCode, callbackFunc);
1033 return value == 0 ? QtAndroidPrivate::Authorized : QtAndroidPrivate::Denied;
1044 return counter.fetchAndAddRelaxed(1);
1055 jobjectArray permissions, jintArray grantResults)
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;
1067 g_pendingPermissionRequests->
erase(
it);
1070 const int size = env->GetArrayLength(permissions);
1072 env->GetIntArrayRegion(grantResults, 0,
size,
results.get());
1074 for (
int i = 0 ;
i <
size; ++
i) {
1090 result.reserve(permissions.size());
1092 for (
const QString &permission : permissions)
1093 result.push_back(QtAndroidPrivate::checkPermission(permission).result());
1107 g_pendingPermissionRequests->insert(requestCode, promise);
1110 QNativeInterface::QAndroidApplication::runOnAndroidMainThread([permissions, requestCode] {
1112 jclass clazz = env.findClass(
"java/lang/String");
1113 auto array = env->NewObjectArray(permissions.size(), clazz,
nullptr);
1116 for (
auto &perm : permissions)
1117 env->SetObjectArrayElement(
array,
index++, QJniObject::fromString(perm).object());
1120 "([Ljava/lang/String;I)V",
1123 env->DeleteLocalRef(
array);
1138QtAndroidPrivate::requestPermission(
const QString &permission)
1140 return requestPermissions({permission});
1144QtAndroidPrivate::requestPermissions(
const QStringList &permissions)
1147 if (permissions.isEmpty())
1161QtAndroidPrivate::checkPermission(
const QString &permission)
1166 "checkSelfPermission",
1167 "(Ljava/lang/String;)I",
1168 QJniObject::fromString(permission).
object());
1179 const JNINativeMethod
methods[] = {
1180 {
"sendRequestPermissionsResult",
"(I[Ljava/lang/String;[I)V",
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()
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.
T fetchAndAddRelaxed(T valueToAdd) noexcept
\inmodule QtCore\reentrant
qsizetype size() const noexcept
Returns the number of items in the hash.
const_iterator cend() const noexcept
iterator insert(const Key &key, const T &value)
size_type remove(const Key &key)
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
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()
bool registerPermissionNatives()
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
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)