diff --git a/src/voip/CallManager.cpp b/src/voip/CallManager.cpp
index feb06835..5479ba31 100644
--- a/src/voip/CallManager.cpp
+++ b/src/voip/CallManager.cpp
@@ -54,6 +54,27 @@ std::vector<std::string>
getTurnURIs(const mtx::responses::TurnServer &turnServer);
}
+CallManager *
+CallManager::create(QQmlEngine *qmlEngine, QJSEngine *)
+{
+ // The instance has to exist before it is used. We cannot replace it.
+ auto instance = ChatPage::instance()->callManager();
+ Q_ASSERT(instance);
+
+ // The engine has to have the same thread affinity as the singleton.
+ Q_ASSERT(qmlEngine->thread() == instance->thread());
+
+ // There can only be one engine accessing the singleton.
+ static QJSEngine *s_engine = nullptr;
+ if (s_engine)
+ Q_ASSERT(qmlEngine == s_engine);
+ else
+ s_engine = qmlEngine;
+
+ QJSEngine::setObjectOwnership(instance, QJSEngine::CppOwnership);
+ return instance;
+}
+
CallManager::CallManager(QObject *parent)
: QObject(parent)
, session_(WebRTCSession::instance())
diff --git a/src/voip/CallManager.h b/src/voip/CallManager.h
index bbc7a903..e84b79c9 100644
--- a/src/voip/CallManager.h
+++ b/src/voip/CallManager.h
@@ -9,6 +9,7 @@
#include <QMediaPlayer>
#include <QObject>
+#include <QQmlEngine>
#include <QString>
#include <QStringList>
#include <QTimer>
@@ -29,6 +30,10 @@ class QUrl;
class CallManager final : public QObject
{
Q_OBJECT
+
+ QML_ELEMENT
+ QML_SINGLETON
+
Q_PROPERTY(bool haveCallInvite READ haveCallInvite NOTIFY newInviteState)
Q_PROPERTY(bool isOnCall READ isOnCall NOTIFY newCallState)
Q_PROPERTY(bool isOnCallOnOtherDevice READ isOnCallOnOtherDevice NOTIFY newCallDeviceState)
@@ -49,6 +54,8 @@ class CallManager final : public QObject
public:
CallManager(QObject *);
+ static CallManager *create(QQmlEngine *qmlEngine, QJSEngine *);
+
bool haveCallInvite() const { return haveCallInvite_; }
bool isOnCall() const { return (session_.state() != webrtc::State::DISCONNECTED); }
bool isOnCallOnOtherDevice() const { return (isOnCallOnOtherDevice_ != ""); }
diff --git a/src/voip/WebRTCSession.cpp b/src/voip/WebRTCSession.cpp
index c40b39a4..ff459bf9 100644
--- a/src/voip/WebRTCSession.cpp
+++ b/src/voip/WebRTCSession.cpp
@@ -48,26 +48,26 @@ using webrtc::State;
WebRTCSession::WebRTCSession()
: devices_(CallDevices::instance())
{
- qmlRegisterUncreatableMetaObject(webrtc::staticMetaObject,
- "im.nheko",
- 1,
- 0,
- "CallType",
- QStringLiteral("Can't instantiate enum"));
+ // qmlRegisterUncreatableMetaObject(webrtc::staticMetaObject,
+ // "im.nheko",
+ // 1,
+ // 0,
+ // "CallType",
+ // QStringLiteral("Can't instantiate enum"));
- qmlRegisterUncreatableMetaObject(webrtc::staticMetaObject,
- "im.nheko",
- 1,
- 0,
- "ScreenShareType",
- QStringLiteral("Can't instantiate enum"));
+ // qmlRegisterUncreatableMetaObject(webrtc::staticMetaObject,
+ // "im.nheko",
+ // 1,
+ // 0,
+ // "ScreenShareType",
+ // QStringLiteral("Can't instantiate enum"));
- qmlRegisterUncreatableMetaObject(webrtc::staticMetaObject,
- "im.nheko",
- 1,
- 0,
- "WebRTCState",
- QStringLiteral("Can't instantiate enum"));
+ // qmlRegisterUncreatableMetaObject(webrtc::staticMetaObject,
+ // "im.nheko",
+ // 1,
+ // 0,
+ // "WebRTCState",
+ // QStringLiteral("Can't instantiate enum"));
connect(this, &WebRTCSession::stateChanged, this, &WebRTCSession::setState);
init();
diff --git a/src/voip/WebRTCSession.h b/src/voip/WebRTCSession.h
index 82753372..3357bff7 100644
--- a/src/voip/WebRTCSession.h
+++ b/src/voip/WebRTCSession.h
@@ -8,6 +8,7 @@
#include <vector>
#include <QObject>
+#include <QQmlEngine>
#include "mtx/events/voip.hpp"
@@ -17,6 +18,7 @@ class QQuickItem;
namespace webrtc {
Q_NAMESPACE
+QML_NAMED_ELEMENT(Voip)
enum class CallType
{
|