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