Revision control
++ // Copyright (C) 2016 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
++ // Qt-Security score:significant reason:default
++
++ #ifndef QANDROIDEXTRAS_H
++ #define QANDROIDEXTRAS_H
++
++ //
++ // W A R N I N G
++ // -------------
++ //
++ // This file is not part of the Qt API. It exists purely as an
++ // implementation detail. This header file may change from version to
++ // version without notice, or even be removed.
++ //
++ // We mean it.
++ //
++
++ #include <jni.h>
++ #include <functional>
++
++ #include <QtCore/private/qglobal_p.h>
++ #include <QtCore/qjniobject.h>
++ #include <QtCore/private/qjnihelpers_p.h>
++ #include <QtCore/qcoreapplication.h>
++ #include <QtCore/qmap.h>
++
++ #if QT_CONFIG(future)
++ #include <QtCore/qfuture.h>
++ #endif
++
++ #include <memory>
++
++ QT_BEGIN_NAMESPACE
++
++ class QAndroidParcel;
++ class QAndroidBinderPrivate;
++ class QAndroidBinder;
++
++ class Q_CORE_EXPORT QAndroidBinder
++ {
++ public:
++ enum class CallType {
++ Normal = 0,
++ OneWay = 1
++ };
++
++ public:
++ explicit QAndroidBinder();
++ QAndroidBinder(const QJniObject &binder);
++
++ virtual ~QAndroidBinder();
++
++ virtual bool onTransact(int code, const QAndroidParcel &data,
++ const QAndroidParcel &reply, CallType flags);
++ bool transact(int code, const QAndroidParcel &data,
++ QAndroidParcel *reply = nullptr, CallType flags = CallType::Normal) const;
++
++ QJniObject handle() const;
++
++ private:
++ friend class QAndroidBinderPrivate;
++ friend class QAndroidParcelPrivate;
++ friend class QAndroidServicePrivate;
++ QSharedPointer<QAndroidBinderPrivate> d;
++ };
++
++ class QAndroidParcelPrivate;
++
++ class Q_CORE_EXPORT QAndroidParcel
++ {
++ public:
++ QAndroidParcel();
++ explicit QAndroidParcel(const QJniObject& parcel);
++ virtual ~QAndroidParcel();
++
++ void writeData(const QByteArray &data) const;
++ void writeVariant(const QVariant &value) const;
++ void writeBinder(const QAndroidBinder &binder) const;
++ void writeFileDescriptor(int fd) const;
++
++ QByteArray readData() const;
++ QVariant readVariant() const;
++ QAndroidBinder readBinder() const;
++ int readFileDescriptor() const;
++
++ QJniObject handle() const;
++
++ private:
++ friend class QAndroidParcelPrivate;
++ friend class QAndroidBinder;
++ QSharedPointer<QAndroidParcelPrivate> d;
++ };
++
++ class QAndroidActivityResultReceiverPrivate;
++
++ class Q_CORE_EXPORT QAndroidActivityResultReceiver
++ {
++ public:
++ QAndroidActivityResultReceiver();
++ virtual ~QAndroidActivityResultReceiver();
++ virtual void handleActivityResult(int receiverRequestCode, int resultCode,
++ const QJniObject &data) = 0;
++
++ private:
++ friend class QAndroidActivityResultReceiverPrivate;
++ Q_DISABLE_COPY(QAndroidActivityResultReceiver)
++
++ std::unique_ptr<QAndroidActivityResultReceiverPrivate> d;
++ };
++
++ class Q_CORE_EXPORT QAndroidServiceConnection
++ {
++ public:
++ QAndroidServiceConnection();
++ explicit QAndroidServiceConnection(const QJniObject &serviceConnection);
++ virtual ~QAndroidServiceConnection();
++
++ virtual void onServiceConnected(const QString &name,
++ const QAndroidBinder &serviceBinder) = 0;
++ virtual void onServiceDisconnected(const QString &name) = 0;
++
++ QJniObject handle() const;
++ private:
++ Q_DISABLE_COPY(QAndroidServiceConnection)
++ QJniObject m_handle;
++ };
++
++ class Q_CORE_EXPORT QAndroidIntent
++ {
++ public:
++ QAndroidIntent();
++ virtual ~QAndroidIntent();
++ explicit QAndroidIntent(const QJniObject &intent);
++ explicit QAndroidIntent(const QString &action);
++ explicit QAndroidIntent(const QJniObject &packageContext, const char *className);
++
++ void putExtra(const QString &key, const QByteArray &data);
++ QByteArray extraBytes(const QString &key);
++
++ void putExtra(const QString &key, const QVariant &value);
++ QVariant extraVariant(const QString &key);
++
++ QJniObject handle() const;
++
++ private:
++ QJniObject m_handle;
++ };
++
++ class QAndroidServicePrivate;
++
++ class Q_CORE_EXPORT QAndroidService : public QCoreApplication
++ {
++ Q_OBJECT
++
++ public:
++ QAndroidService(int &argc, char **argv
++ #ifndef Q_QDOC
++ , int flags = ApplicationFlags
++ #endif
++ );
++ QAndroidService(int &argc, char **argv,
++ const std::function<QAndroidBinder*(const QAndroidIntent &intent)> & binder
++ #ifndef Q_QDOC
++ , int flags = ApplicationFlags
++ #endif
++ );
++ virtual ~QAndroidService();
++
++ virtual QAndroidBinder* onBind(const QAndroidIntent &intent);
++
++ private:
++ friend class QAndroidServicePrivate;
++ Q_DISABLE_COPY(QAndroidService)
++
++ std::unique_ptr<QAndroidServicePrivate> d;
++ };
++
++ class QAndroidActivityCallbackResultReceiver: public QAndroidActivityResultReceiver
++ {
++ public:
++ QAndroidActivityCallbackResultReceiver();
++ void handleActivityResult(int receiverRequestCode, int resultCode,
++ const QJniObject &intent) override;
++ void registerCallback(int receiverRequestCode,
++ std::function<void(int, int, const QJniObject &)> callbackFunc);
++
++ static QAndroidActivityCallbackResultReceiver *instance();
++ private:
++ QMap<int, std::function<void(int, int, const QJniObject &data)>> callbackMap;
++
++ static QAndroidActivityCallbackResultReceiver *s_instance;
++ };
++
++ namespace QtAndroidPrivate
++ {
++ Q_CORE_EXPORT void startIntentSender(const QJniObject &intentSender,
++ int receiverRequestCode,
++ QAndroidActivityResultReceiver *resultReceiver = nullptr);
++ Q_CORE_EXPORT void startActivity(const QJniObject &intent,
++ int receiverRequestCode,
++ QAndroidActivityResultReceiver *resultReceiver = nullptr);
++ Q_CORE_EXPORT void startActivity(const QAndroidIntent &intent,
++ int receiverRequestCode,
++ QAndroidActivityResultReceiver *resultReceiver = nullptr);
++ Q_CORE_EXPORT void startActivity(const QJniObject &intent,
++ int receiverRequestCode,
++ std::function<void(int, int, const QJniObject &data)>
++ callbackFunc);
++
++ enum class BindFlag {
++ None = 0x00000000,
++ AutoCreate = 0x00000001,
++ DebugUnbind = 0x00000002,
++ NotForeground = 0x00000004,
++ AboveClient = 0x00000008,
++ AllowOomManagement = 0x00000010,
++ WaivePriority = 0x00000020,
++ Important = 0x00000040,
++ AdjustWithActivity = 0x00000080,
++ ExternalService = -2147483648 // 0x80000000
++
++ };
++ Q_DECLARE_FLAGS(BindFlags, BindFlag)
++
++ Q_CORE_EXPORT bool bindService(const QAndroidIntent &serviceIntent,
++ const QAndroidServiceConnection &serviceConnection,
++ BindFlags flags = BindFlag::None);
++
++ #if QT_CONFIG(permissions)
++ QT_REQUIRE_CONFIG(future);
++ enum PermissionResult {
++ Undetermined,
++ Authorized,
++ Denied
++ };
++
++ Q_CORE_EXPORT QFuture<QtAndroidPrivate::PermissionResult>
++ requestPermission(const QString &permission);
++ QFuture<QtAndroidPrivate::PermissionResult>
++ requestPermissions(const QStringList &permissions);
++ Q_CORE_EXPORT QFuture<QtAndroidPrivate::PermissionResult>
++ checkPermission(const QString &permission);
++ #endif
++
++ }
++
++ QT_END_NAMESPACE
++
++ #endif // QANDROIDEXTRAS_H