diff --git a/dialer/package/contents/ui/Call/CallPage.qml b/dialer/package/contents/ui/Call/CallPage.qml index a9b8a331..c80c2345 100644 --- a/dialer/package/contents/ui/Call/CallPage.qml +++ b/dialer/package/contents/ui/Call/CallPage.qml @@ -28,7 +28,7 @@ import "../Dialpad" Item { id: callPage - property string status: ofonoWrapper.status + property string status: dialerUtils.callState property string providerId: ofonoWrapper.providerId @@ -168,10 +168,10 @@ Item { //STATUS_INCOMING visible: status == "incoming" onAccepted: { - ofonoWrapper.answer(); + dialerUtils.acceptCall(); } onRejected: { - ofonoWrapper.hangup(); + dialerUtils.rejectCall(); } } @@ -183,7 +183,7 @@ Item { Layout.fillWidth: true text: i18n("End Call") onClicked: { - tpCaller.hangUp(); + dialerUtils.hangUp(); } } } diff --git a/dialer/package/contents/ui/main.qml b/dialer/package/contents/ui/main.qml index 786845b5..618fb6b9 100644 --- a/dialer/package/contents/ui/main.qml +++ b/dialer/package/contents/ui/main.qml @@ -24,7 +24,6 @@ import QtQuick.Layouts 1.1 import QtQuick.LocalStorage 2.0 import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.extras 2.0 as PlasmaExtras -import org.kde.plasma.private.tpcaller 1.0 ApplicationWindow { id: root @@ -39,6 +38,7 @@ ApplicationWindow { property string providerId: ofonoWrapper.providerId //was the last call an incoming one? property bool isIncoming + //END PROPERTIES //BEGIN SIGNAL HANDLERS @@ -59,8 +59,7 @@ ApplicationWindow { //BEGIN FUNCTIONS function call(number) { - tpCaller.dial(number); - //ofonoWrapper.call(number); + dialerUtils.dial(number); } function insertCallInHistory(number, duration, callType) { @@ -149,19 +148,15 @@ ApplicationWindow { id: ofonoWrapper } - TpCaller { - id: tpCaller - } - //END MODELS //BEGIN UI PlasmaExtras.ConditionalLoader { anchors.fill: parent - when: root.visible && !tpCaller.callInProgress + when: root.visible && dialerUtils.callState == "idle" source: Qt.resolvedUrl("Dialer/DialPage.qml") - z: !tpCaller.callInProgress ? 2 : 0 - opacity: !tpCaller.callInProgress ? 1 : 0 + z: dialerUtils.callState == "idle" ? 2 : 0 + opacity: dialerUtils.callState == "idle" ? 1 : 0 Behavior on opacity { OpacityAnimator { duration: units.shortDuration @@ -172,10 +167,10 @@ ApplicationWindow { PlasmaExtras.ConditionalLoader { anchors.fill: parent - when: tpCaller.callInProgress + when: dialerUtils.callState != "idle" source: Qt.resolvedUrl("Call/CallPage.qml") - opacity: tpCaller.callInProgress ? 1 : 0 - z: tpCaller.callInProgress ? 2 : 0 + opacity: dialerUtils.callState != "idle" ? 1 : 0 + z: dialerUtils.callState != "idle" ? 2 : 0 Behavior on opacity { OpacityAnimator { duration: units.shortDuration diff --git a/dialer/src/dialerutils.cpp b/dialer/src/dialerutils.cpp index 3d93424a..5b07c7bf 100644 --- a/dialer/src/dialerutils.cpp +++ b/dialer/src/dialerutils.cpp @@ -21,17 +21,67 @@ #include #include +#include +#include +#include +#include +#include +#include +#include -DialerUtils::DialerUtils(QObject *parent) +DialerUtils::DialerUtils(const Tp::AccountPtr &simAccount, QObject *parent) : QObject(parent), - m_missedCalls(0) + m_missedCalls(0), + m_simAccount(simAccount) { + Tp::PendingReady *op = m_simAccount->becomeReady(Tp::Features() << Tp::Account::FeatureCore); + + connect(op, &Tp::PendingOperation::finished, [=](){ + if (op->isError()) { + qWarning() << "SIM card account failed to get ready:" << op->errorMessage(); + } else { + qDebug() << "SIM Account ready to use"; + } + }); } DialerUtils::~DialerUtils() { } +void DialerUtils::dial(const QString &number) +{ + // FIXME: this should be replaced by kpeople thing + auto pendingContact = m_simAccount->connection()->contactManager()->contactsForIdentifiers(QStringList() << number); + + connect(pendingContact, &Tp::PendingOperation::finished, [=](){ + if (pendingContact->contacts().size() < 1) { + qWarning() << " no contacts"; + return; + } + qDebug() << "Starting call..."; + Tp::PendingChannelRequest *pendingChannel = m_simAccount->ensureAudioCall(pendingContact->contacts().first()); + connect(pendingChannel, &Tp::PendingChannelRequest::finished, [=](){ + if (pendingChannel->isError()) { + qWarning() << "Error when requesting channel" << pendingChannel->errorMessage(); + } + }); + }); +} + +QString DialerUtils::callState() const +{ + return m_callState; +} + +void DialerUtils::setCallState(const QString &state) +{ + if (m_callState != state) { + m_callState = state; + Q_EMIT callStateChanged(); + } +} + void DialerUtils::notifyMissedCall(const QString &caller, const QString &description) { qWarning() << "Missed Call."; diff --git a/dialer/src/dialerutils.h b/dialer/src/dialerutils.h index 41cc218f..6856eb98 100644 --- a/dialer/src/dialerutils.h +++ b/dialer/src/dialerutils.h @@ -23,26 +23,39 @@ #include #include +#include + class DialerUtils : public QObject { Q_OBJECT + Q_PROPERTY(QString callState READ callState NOTIFY callStateChanged); public: - DialerUtils(QObject *parent = 0); + DialerUtils(const Tp::AccountPtr &simAccount, QObject *parent = 0); virtual ~DialerUtils(); + QString callState() const; + void setCallState(const QString &state); + Q_INVOKABLE void notifyMissedCall(const QString &caller, const QString &description); Q_INVOKABLE void resetMissedCalls(); Q_INVOKABLE void notifyRinging(); Q_INVOKABLE void stopRinging(); + Q_INVOKABLE void dial(const QString &number); Q_SIGNALS: void missedCallsActionTriggered(); + void callStateChanged(); + void acceptCall(); + void rejectCall(); + void hangUp(); private: QPointer m_callsNotification; QPointer m_ringingNotification; int m_missedCalls; + QString m_callState; + Tp::AccountPtr m_simAccount; }; diff --git a/dialer/src/main.cpp b/dialer/src/main.cpp index bb851d8e..5b53c823 100644 --- a/dialer/src/main.cpp +++ b/dialer/src/main.cpp @@ -72,6 +72,43 @@ int main(int argc, char **argv) parser.process(app); + Tp::registerTypes(); + + Tp::AccountFactoryPtr accountFactory = Tp::AccountFactory::create(QDBusConnection::sessionBus(), + Tp::Features() << Tp::Account::FeatureCore + ); + + Tp::ConnectionFactoryPtr connectionFactory = Tp::ConnectionFactory::create(QDBusConnection::sessionBus(), + Tp::Features() << Tp::Connection::FeatureCore + << Tp::Connection::FeatureSelfContact + << Tp::Connection::FeatureConnected + ); + + Tp::ChannelFactoryPtr channelFactory = Tp::ChannelFactory::create(QDBusConnection::sessionBus()); + channelFactory->addCommonFeatures(Tp::Channel::FeatureCore); + channelFactory->addFeaturesForCalls(Tp::Features() << Tp::CallChannel::FeatureContents + << Tp::CallChannel::FeatureCallState + << Tp::CallChannel::FeatureCallMembers + << Tp::CallChannel::FeatureLocalHoldState + ); + +// channelFactory->addFeaturesForTextChats(Tp::Features() << Tp::TextChannel::FeatureMessageQueue +// << Tp::TextChannel::FeatureMessageSentSignal +// << Tp::TextChannel::FeatureChatState +// << Tp::TextChannel::FeatureMessageCapabilities); + + Tp::ContactFactoryPtr contactFactory = Tp::ContactFactory::create(Tp::Features() << Tp::Contact::FeatureAlias + << Tp::Contact::FeatureAvatarData + ); + + Tp::ClientRegistrarPtr registrar = + Tp::ClientRegistrar::create(accountFactory, connectionFactory, + channelFactory, contactFactory); + + Tp::AccountPtr simAccount = Tp::Account::create(TP_QT_ACCOUNT_MANAGER_BUS_NAME, QStringLiteral("/org/freedesktop/Telepathy/Account/ofono/ofono/account0"), + connectionFactory, channelFactory); + + const QString packagePath("org.kde.phone.dialer"); //usually we have an ApplicationWindow here, so we do not need to create a window by ourselves @@ -81,7 +118,7 @@ int main(int argc, char **argv) obj->loadPackage(packagePath); obj->engine()->rootContext()->setContextProperty("commandlineArguments", parser.positionalArguments()); - DialerUtils *dialerUtils = new DialerUtils; + DialerUtils *dialerUtils = new DialerUtils(simAccount); obj->engine()->rootContext()->setContextProperty("dialerUtils", QVariant::fromValue(dialerUtils)); obj->completeInitialization(); @@ -90,6 +127,9 @@ int main(int argc, char **argv) return -1; } + Tp::SharedPtr callHandler(new CallHandler(dialerUtils)); + registrar->registerClient(Tp::AbstractClientPtr::dynamicCast(callHandler), "Phone.Dialer"); + KPluginMetaData data = obj->package().metadata(); // About data KAboutData aboutData(data.pluginId(), data.name(), data.version(), data.description(), KAboutLicense::byKeyword(data.license()).key()); @@ -133,36 +173,6 @@ int main(int argc, char **argv) qWarning() << "Error loading the ApplicationWindow"; } - Tp::AccountFactoryPtr accountFactory = Tp::AccountFactory::create(QDBusConnection::sessionBus(), - Tp::Features() << Tp::Account::FeatureCore - ); - - Tp::ConnectionFactoryPtr connectionFactory = Tp::ConnectionFactory::create(QDBusConnection::sessionBus(), - Tp::Features() << Tp::Connection::FeatureCore - << Tp::Connection::FeatureSelfContact - ); - - Tp::ChannelFactoryPtr channelFactory = Tp::ChannelFactory::create(QDBusConnection::sessionBus()); - channelFactory->addCommonFeatures(Tp::Channel::FeatureCore); - channelFactory->addFeaturesForCalls(Tp::Features() << Tp::CallChannel::FeatureContents - << Tp::CallChannel::FeatureCallState - << Tp::CallChannel::FeatureCallMembers - << Tp::CallChannel::FeatureLocalHoldState - ); - - Tp::ContactFactoryPtr contactFactory = Tp::ContactFactory::create(Tp::Features() << Tp::Contact::FeatureAlias - << Tp::Contact::FeatureAvatarData - ); - - -// app.setQuitOnLastWindowClosed(true); - - Tp::ClientRegistrarPtr registrar = - Tp::ClientRegistrar::create(accountFactory, connectionFactory, - channelFactory, contactFactory); - - Tp::SharedPtr callHandler(new CallHandler(dialerUtils)); - registrar->registerClient(Tp::AbstractClientPtr::dynamicCast(callHandler), "Phone.Dialer"); return app.exec(); }