Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qandroidextras_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 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// Qt-Security score:significant reason:default
4
5#ifndef QANDROIDEXTRAS_H
6#define QANDROIDEXTRAS_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <jni.h>
20#include <functional>
21
22#include <QtCore/private/qglobal_p.h>
23#include <QtCore/qjniobject.h>
24#include <QtCore/private/qjnihelpers_p.h>
25#include <QtCore/qcoreapplication.h>
26#include <QtCore/qmap.h>
27
28#if QT_CONFIG(future)
29#include <QtCore/qfuture.h>
30#endif
31
32#include <memory>
33
34QT_BEGIN_NAMESPACE
35
36class QAndroidParcel;
38class QAndroidBinder;
39
40class Q_CORE_EXPORT QAndroidBinder
41{
42public:
43 enum class CallType {
44 Normal = 0,
45 OneWay = 1
46 };
47
48public:
49 explicit QAndroidBinder();
50 QAndroidBinder(const QJniObject &binder);
51
52 virtual ~QAndroidBinder();
53
54 virtual bool onTransact(int code, const QAndroidParcel &data,
55 const QAndroidParcel &reply, CallType flags);
56 bool transact(int code, const QAndroidParcel &data,
57 QAndroidParcel *reply = nullptr, CallType flags = CallType::Normal) const;
58
59 QJniObject handle() const;
60
61private:
62 friend class QAndroidBinderPrivate;
63 friend class QAndroidParcelPrivate;
64 friend class QAndroidServicePrivate;
65 QSharedPointer<QAndroidBinderPrivate> d;
66};
67
69
70class Q_CORE_EXPORT QAndroidParcel
71{
72public:
73 QAndroidParcel();
74 explicit QAndroidParcel(const QJniObject& parcel);
75 virtual ~QAndroidParcel();
76
77 void writeData(const QByteArray &data) const;
78 void writeVariant(const QVariant &value) const;
79 void writeBinder(const QAndroidBinder &binder) const;
80 void writeFileDescriptor(int fd) const;
81
82 QByteArray readData() const;
83 QVariant readVariant() const;
84 QAndroidBinder readBinder() const;
85 int readFileDescriptor() const;
86
87 QJniObject handle() const;
88
89private:
90 friend class QAndroidParcelPrivate;
91 friend class QAndroidBinder;
92 QSharedPointer<QAndroidParcelPrivate> d;
93};
94
96
98{
99public:
100 QAndroidActivityResultReceiver();
101 virtual ~QAndroidActivityResultReceiver();
102 virtual void handleActivityResult(int receiverRequestCode, int resultCode,
103 const QJniObject &data) = 0;
104
105private:
106 friend class QAndroidActivityResultReceiverPrivate;
107 Q_DISABLE_COPY(QAndroidActivityResultReceiver)
108
109 std::unique_ptr<QAndroidActivityResultReceiverPrivate> d;
110};
111
112class Q_CORE_EXPORT QAndroidServiceConnection
113{
114public:
115 QAndroidServiceConnection();
116 explicit QAndroidServiceConnection(const QJniObject &serviceConnection);
117 virtual ~QAndroidServiceConnection();
118
119 virtual void onServiceConnected(const QString &name,
120 const QAndroidBinder &serviceBinder) = 0;
121 virtual void onServiceDisconnected(const QString &name) = 0;
122
123 QJniObject handle() const;
124private:
125 Q_DISABLE_COPY(QAndroidServiceConnection)
126 QJniObject m_handle;
127};
128
129class Q_CORE_EXPORT QAndroidIntent
130{
131public:
132 QAndroidIntent();
133 virtual ~QAndroidIntent();
134 explicit QAndroidIntent(const QJniObject &intent);
135 explicit QAndroidIntent(const QString &action);
136 explicit QAndroidIntent(const QJniObject &packageContext, const char *className);
137
138 void putExtra(const QString &key, const QByteArray &data);
139 QByteArray extraBytes(const QString &key);
140
141 void putExtra(const QString &key, const QVariant &value);
142 QVariant extraVariant(const QString &key);
143
144 QJniObject handle() const;
145
146private:
147 QJniObject m_handle;
148};
149
151
152class Q_CORE_EXPORT QAndroidService : public QCoreApplication
153{
154 Q_OBJECT
155
156public:
157 QAndroidService(int &argc, char **argv
158#ifndef Q_QDOC
159 , int flags = ApplicationFlags
160#endif
161 );
162 QAndroidService(int &argc, char **argv,
163 const std::function<QAndroidBinder*(const QAndroidIntent &intent)> & binder
164#ifndef Q_QDOC
165 , int flags = ApplicationFlags
166#endif
167 );
168 virtual ~QAndroidService();
169
170 virtual QAndroidBinder* onBind(const QAndroidIntent &intent);
171
172private:
173 friend class QAndroidServicePrivate;
174 Q_DISABLE_COPY(QAndroidService)
175
176 std::unique_ptr<QAndroidServicePrivate> d;
177};
178
180{
181public:
183 void handleActivityResult(int receiverRequestCode, int resultCode,
184 const QJniObject &intent) override;
185 void registerCallback(int receiverRequestCode,
186 std::function<void(int, int, const QJniObject &)> callbackFunc);
187
189private:
190 QMap<int, std::function<void(int, int, const QJniObject &data)>> callbackMap;
191
193};
194
195namespace QtAndroidPrivate
196{
197 Q_CORE_EXPORT void startIntentSender(const QJniObject &intentSender,
198 int receiverRequestCode,
199 QAndroidActivityResultReceiver *resultReceiver = nullptr);
200 Q_CORE_EXPORT void startActivity(const QJniObject &intent,
201 int receiverRequestCode,
202 QAndroidActivityResultReceiver *resultReceiver = nullptr);
203 Q_CORE_EXPORT void startActivity(const QAndroidIntent &intent,
204 int receiverRequestCode,
205 QAndroidActivityResultReceiver *resultReceiver = nullptr);
206 Q_CORE_EXPORT void startActivity(const QJniObject &intent,
207 int receiverRequestCode,
208 std::function<void(int, int, const QJniObject &data)>
209 callbackFunc);
210
211 enum class BindFlag {
212 None = 0x00000000,
213 AutoCreate = 0x00000001,
214 DebugUnbind = 0x00000002,
215 NotForeground = 0x00000004,
216 AboveClient = 0x00000008,
217 AllowOomManagement = 0x00000010,
218 WaivePriority = 0x00000020,
219 Important = 0x00000040,
220 AdjustWithActivity = 0x00000080,
221 ExternalService = -2147483648 // 0x80000000
222
223 };
224 Q_DECLARE_FLAGS(BindFlags, BindFlag)
225
226 Q_CORE_EXPORT bool bindService(const QAndroidIntent &serviceIntent,
227 const QAndroidServiceConnection &serviceConnection,
228 BindFlags flags = BindFlag::None);
229
230#if QT_CONFIG(permissions)
232 enum PermissionResult {
235 Denied
236 };
237
244#endif
245
246}
247
248QT_END_NAMESPACE
249
250#endif // QANDROIDEXTRAS_H
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)
int globalRequestCode(int localRequestCode) const
QAndroidActivityResultReceiver * q
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
\inheaderfile QtCore/private/qandroidextras_p.h \preliminary \inmodule QtCorePrivate
void writeBinder(const QAndroidBinder &binder) const
QAndroidBinder readBinder() const
void writeData(const QByteArray &data) const
QAndroidParcelPrivate(const QJniObject &parcel)
QByteArray readData() const
void writeFileDescriptor(int fd) const
\inheaderfile QtCore/private/qandroidextras_p.h \preliminary \inmodule QtCorePrivate
\inheaderfile QtCore/private/qandroidextras_p.h \preliminary \inmodule QtCorePrivate
QSet< QAndroidBinder * > m_binders
std::function< QAndroidBinder *(const QAndroidIntent &)> m_binder
QAndroidServicePrivate(QAndroidService *service, const std::function< QAndroidBinder *(const QAndroidIntent &)> &binder={})
QAndroidService * m_service
jobject onBind(jobject intent) override
\inheaderfile QtCore/private/qandroidextras_p.h \preliminary \inmodule QtCorePrivate
Combined button and popup list for selecting options.
\preliminary \inmodule QtCorePrivate
Q_CORE_EXPORT void startIntentSender(const QJniObject &intentSender, int receiverRequestCode, QAndroidActivityResultReceiver *resultReceiver=nullptr)
bool registerExtrasNatives(QJniEnvironment &env)
Q_CORE_EXPORT void startActivity(const QJniObject &intent, int receiverRequestCode, QAndroidActivityResultReceiver *resultReceiver=nullptr)
Q_CORE_EXPORT bool bindService(const QAndroidIntent &serviceIntent, const QAndroidServiceConnection &serviceConnection, BindFlags flags=BindFlag::None)
Q_CORE_EXPORT void startActivity(const QJniObject &intent, int receiverRequestCode, std::function< void(int, int, const QJniObject &data)> callbackFunc)
static jboolean onTransact(JNIEnv *, jclass, jlong id, jint code, jobject data, jobject reply, jint flags)
static void onServiceConnected(JNIEnv *, jclass, jlong id, jstring name, jobject service)
static void onServiceDisconnected(JNIEnv *, jclass, jlong id, jstring name)
static int uniqueActivityRequestCode()
FileDescriptor(int fd=-1)