From: Arun Ravindran <ext-arun.1.ravind...@nokia.com> Added handling of multipart property in the call proxy, call item and callitem model by adding a signal to be emited for the property changes. This signal is handled in call manager now. Removed the usage of multiparty call items and call names from call manager. Also re arranged the GetCalls() and GetProperties() because
When dialer starts, it creates the ofono binding objects (modem manager, call manager etc). The call manager get the current call list and calls updateCallItems() from getCallsFinished() function. The updateCallItems() in fact send the signals for handling incoming call alert in the UI. But by this time no UI component is connected for this signal. The UI components are connected after receiving the connected() signal from call manager. The connected signal is sent after GetProperties() return. But calls are updated after GetCalls(), since GetProperties() did not complete the call manager is not online. I think this has come because we initially had GetProperties() function only from call manager and no GetCalls(). --- src/callitem.cpp | 13 ++++++ src/callitem.h | 4 ++ src/callitemmodel.cpp | 8 ++++ src/callitemmodel.h | 1 + src/callmanager.cpp | 108 ++++++++++++------------------------------------ src/callmanager.h | 7 +-- src/callproxy.cpp | 14 ++++++- src/callproxy.h | 4 ++ src/dialerkeypad.cpp | 9 ++-- 9 files changed, 77 insertions(+), 91 deletions(-) diff --git a/src/callitem.cpp b/src/callitem.cpp index d33f359..ff056dd 100644 --- a/src/callitem.cpp +++ b/src/callitem.cpp @@ -80,6 +80,7 @@ void CallItem::init() model()->setCall(call); connect(call,SIGNAL(stateChanged()),this,SLOT(callStateChanged())); connect(call,SIGNAL(dataChanged()),this,SLOT(callDataChanged())); + connect(call,SIGNAL(multiPartyChanged()),this,SLOT(callMultiPartyChanged())); } else qCritical("Invalid CallProxy instance!"); } else @@ -331,3 +332,15 @@ void CallItem::ringtoneStatusChanged(QMediaPlayer::MediaStatus status) m_ringtone->play(); } } + +bool CallItem::multiparty() +{ + TRACE + return (isValid())?model()->multiparty():false; +} + +void CallItem::callMultiPartyChanged() +{ + TRACE + emit multiPartyChanged(); +} diff --git a/src/callitem.h b/src/callitem.h index ae19b78..e0b79c9 100644 --- a/src/callitem.h +++ b/src/callitem.h @@ -33,6 +33,7 @@ class CallItem: public MWidgetController Q_PROPERTY(CallItemModel::CallDisconnectReason reason READ reason) Q_PROPERTY(int duration READ duration) Q_PROPERTY(QDateTime startTime READ startTime) + Q_PROPERTY(bool multiparty READ multiparty) Q_PROPERTY(PeopleItem* peopleItem READ peopleItem WRITE setPeopleItem) Q_PROPERTY(CallProxy* callProxy READ callProxy) @@ -53,6 +54,7 @@ public: CallProxy *callProxy() const; bool isValid(); bool isValid() const; + bool multiparty(); public Q_SLOTS: void init(); @@ -66,12 +68,14 @@ Q_SIGNALS: void clicked(); void stateChanged(); void dataChanged(); + void multiPartyChanged(); private Q_SLOTS: void callStateChanged(); void callDataChanged(); void callDisconnected(const QString &reason); void ringtoneStatusChanged(QMediaPlayer::MediaStatus status); + void callMultiPartyChanged(); private: QVariant itemChange(GraphicsItemChange change, const QVariant &val); diff --git a/src/callitemmodel.cpp b/src/callitemmodel.cpp index 2c6c6ea..af75505 100644 --- a/src/callitemmodel.cpp +++ b/src/callitemmodel.cpp @@ -155,3 +155,11 @@ bool CallItemModel::disconnected() const { return (stateType() == STATE_DISCONNECTED); } + +bool CallItemModel::multiparty() const +{ + if (call() && call()->isValid()) + return call()->multiparty(); + else + return false; +} diff --git a/src/callitemmodel.h b/src/callitemmodel.h index 538fbc2..f2d94d9 100644 --- a/src/callitemmodel.h +++ b/src/callitemmodel.h @@ -69,6 +69,7 @@ public: bool incoming() const; bool waiting() const; bool disconnected() const; + bool multiparty() const; CallItemModel::CallState stateType() const; CallItemModel::CallDisconnectReason reasonType() const; }; diff --git a/src/callmanager.cpp b/src/callmanager.cpp index 0a92068..ac8e4ab 100644 --- a/src/callmanager.cpp +++ b/src/callmanager.cpp @@ -30,9 +30,6 @@ CallManager::CallManager(const QString &modemPath) QDBusPendingReply<QVariantMap> propsReply; QDBusPendingCallWatcher *calls_watcher, *props_watcher; - callsReply = GetCalls(); - calls_watcher = new QDBusPendingCallWatcher(callsReply); - // unsync, but feel relief about recursion in manager proxy. #if 0 // Force this to be sync to ensure we have initial properties @@ -44,12 +41,17 @@ CallManager::CallManager(const QString &modemPath) propsReply = GetProperties(); props_watcher = new QDBusPendingCallWatcher(propsReply); - connect(calls_watcher, - SIGNAL(finished(QDBusPendingCallWatcher*)), - SLOT(getCallsFinished(QDBusPendingCallWatcher*))); connect(props_watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), SLOT(getPropertiesFinished(QDBusPendingCallWatcher*))); + + callsReply = GetCalls(); + calls_watcher = new QDBusPendingCallWatcher(callsReply); + + connect(calls_watcher, + SIGNAL(finished(QDBusPendingCallWatcher*)), + SLOT(getCallsFinished(QDBusPendingCallWatcher*))); + connect(this, SIGNAL(CallAdded(const QDBusObjectPath&, const QVariantMap&)), SLOT(callAdded(const QDBusObjectPath&, const QVariantMap&))); @@ -86,10 +88,16 @@ QList<QString> CallManager::callsAsStrings() const return m_calls; } -QList<CallItem *> CallManager::multipartyCalls() const +bool CallManager::multipartyCalls() const { TRACE - return m_multipartyCallItems; + int call_count =0; + foreach (CallItem *c, m_callItems) { + if(c->multiparty()) + call_count++; + } + qDebug()<<"Call Count: "<<call_count; + return call_count>=2?true:false; } QList<QString> CallManager::multipartyCallsAsStrings() const @@ -406,6 +414,7 @@ void CallManager::updateCallItems() qDebug() << QString("Purging all CallItems"); foreach (CallItem *item, m_callItems) { disconnect(item, SIGNAL(stateChanged())); + disconnect(item, SIGNAL(multiPartyChanged())); delete item; } m_callItems.clear(); @@ -424,6 +433,7 @@ void CallManager::updateCallItems() if (!m_calls.contains(item->path())) { qDebug() << QString("Removing old CallItem %1").arg(item->path()); disconnect(item, SIGNAL(stateChanged())); + disconnect(item, SIGNAL(multiPartyChanged())); delete item; iter.remove(); changed = true; @@ -445,6 +455,7 @@ void CallManager::updateCallItems() qDebug() << QString("Inserting new CallItem %1").arg(callPath); CallItem *call = new CallItem(callPath); connect (call, SIGNAL(stateChanged()), SLOT(callStateChanged())); + connect (call, SIGNAL(multiPartyChanged()),SLOT(callMultiPartyChanged())); m_callItems << call; // NOTE: Must explicity bubble this up since incoming and waiting @@ -494,51 +505,6 @@ void CallManager::lostIncomingCall(CallItem *call) qCritical() << QString("Lost: Incoming Call resource"); } -void CallManager::updateMultipartyCallItems() -{ - TRACE - - // If ofono multiparty call list is empty (no calls), empty our - // multiparty CallItem list too. - if (m_multipartyCalls.isEmpty() && !m_multipartyCallItems.isEmpty()) { - qDebug() << QString("Purging all multiparty CallItems"); - foreach (CallItem *item, m_multipartyCallItems) delete item; - m_multipartyCallItems.clear(); - return; - } - - // Remove CallItems that are not in the ofono "calls" list - QMutableListIterator<CallItem*> iter(m_multipartyCallItems); - while (iter.hasNext()) { - CallItem *item = iter.next(); - // This item is not in the ofono list, remove it - if (!m_multipartyCalls.contains(item->path())) { - qDebug() << QString("Removing old multiparty CallItem %1") - .arg(item->path()); - delete item; - iter.remove(); - } - } - - // Insert new CallItems for paths in the ofono "calls" list we are missing - foreach (QString callPath, m_multipartyCalls) { - bool matchFound = false; - foreach (CallItem *item, m_multipartyCallItems) { - // This call is not in our CallItem list, insert it - if (item->path() == callPath) { - matchFound = true; - break; - } - } - // Insert a new CallItem - if (!matchFound) { - m_multipartyCallItems << new CallItem(callPath); - qDebug() << QString("Inserting new multiparty CallItem %1") - .arg(callPath); - } - } -} - void CallManager::setCalls(QList<QDBusObjectPath> calls) { TRACE @@ -551,18 +517,6 @@ void CallManager::setCalls(QList<QDBusObjectPath> calls) updateCallItems(); } -void CallManager::setMultipartyCalls(QList<QDBusObjectPath> calls) -{ - TRACE - - m_multipartyCalls.clear(); - - foreach (QDBusObjectPath c, calls) - m_multipartyCalls << QString(c.path()); - - updateMultipartyCallItems(); -} - void CallManager::getPropertiesFinished(QDBusPendingCallWatcher *watcher) { TRACE @@ -626,13 +580,9 @@ void CallManager::getCallsFinished(QDBusPendingCallWatcher *watcher) QList<QDBusObjectPath> calls, mpcalls; foreach (OfonoPathProperties p, props) { calls << p.path; - if (p.properties["Multiparty"].toBool()) { - mpcalls << p.path; - } } setCalls(calls); - setMultipartyCalls(mpcalls); } void CallManager::callAdded(const QDBusObjectPath &in0,const QVariantMap &in1) @@ -640,18 +590,12 @@ void CallManager::callAdded(const QDBusObjectPath &in0,const QVariantMap &in1) TRACE QString path = in0.path(); - bool isMultiparty = in1["Multiparty"].toBool(); qDebug() << QString("CallAdded: \"%1\"").arg(path); m_calls << path; updateCallItems(); - - if (isMultiparty) { - m_multipartyCalls << path; - updateMultipartyCallItems(); - } } void CallManager::callRemoved(const QDBusObjectPath &in0) @@ -665,11 +609,6 @@ void CallManager::callRemoved(const QDBusObjectPath &in0) m_calls.removeAt(m_calls.indexOf(path)); updateCallItems(); - - if (m_multipartyCalls.contains(path)) { - m_multipartyCalls.removeAt(m_multipartyCalls.indexOf(path)); - updateMultipartyCallItems(); - } } void CallManager::dialFinished(QDBusPendingCallWatcher *watcher) @@ -821,7 +760,6 @@ void CallManager::propertyChanged(const QString &in0, const QDBusVariant &in1) } else if (in0 == "MultipartyCalls") { QList<QDBusObjectPath> calls; calls = qdbus_cast<QList<QDBusObjectPath> >(in1.variant()); - setMultipartyCalls(calls); } else if (in0 == "EmergencyNumbers") { qDebug() << QString("TODO: Handle EmergencyNumber..."); } else @@ -838,6 +776,14 @@ void CallManager::callStateChanged() emit callsChanged(); } +void CallManager::callMultiPartyChanged() +{ + TRACE + CallItem *call = dynamic_cast<CallItem *>(sender()); + qDebug()<<"Multiparty Info: " <<call->multiparty(); + emit callsChanged(); +} + QStringList CallManager::dumpProperties() { m_properties.clear(); diff --git a/src/callmanager.h b/src/callmanager.h index 86ee1f6..1ee12e2 100644 --- a/src/callmanager.h +++ b/src/callmanager.h @@ -26,7 +26,7 @@ class CallManager: public org::ofono::VoiceCallManager Q_OBJECT Q_PROPERTY(QList<CallItem *> calls READ calls) - Q_PROPERTY(QList<CallItem *> multipartyCalls READ multipartyCalls) + Q_PROPERTY(bool multipartyCalls READ multipartyCalls) public: CallManager(const QString &modemPath); @@ -35,7 +35,7 @@ public: QList<CallItem *> calls() const; QList<QString> callsAsStrings() const; - QList<CallItem *> multipartyCalls() const; + bool multipartyCalls() const; QList<QString> multipartyCallsAsStrings() const; CallItem *activeCall() const; CallItem *heldCall() const; @@ -95,9 +95,7 @@ Q_SIGNALS: private Q_SLOTS: void updateCallItems(); - void updateMultipartyCallItems(); void setCalls(QList<QDBusObjectPath> calls); - void setMultipartyCalls(QList<QDBusObjectPath> calls); void getPropertiesFinished(QDBusPendingCallWatcher *watcher); void getCallsFinished(QDBusPendingCallWatcher *watcher); void callAdded(const QDBusObjectPath &in0, const QVariantMap &in1); @@ -114,6 +112,7 @@ private Q_SLOTS: void sendTonesFinished(QDBusPendingCallWatcher *watcher); void propertyChanged(const QString &in0, const QDBusVariant &in1); void callStateChanged(); + void callMultiPartyChanged(); void proceedCallDial(const QString number); void deniedCallDial(); diff --git a/src/callproxy.cpp b/src/callproxy.cpp index 5d1689c..72ad84a 100644 --- a/src/callproxy.cpp +++ b/src/callproxy.cpp @@ -20,7 +20,8 @@ CallProxy::CallProxy(const QString &callPath) m_state(QString()), m_startTime(QDateTime()), m_reason(QString()), - m_connected(false) + m_connected(false), + m_multiparty(false) { TRACE @@ -107,6 +108,12 @@ QString CallProxy::reason() const return m_reason; } +bool CallProxy::multiparty() const +{ + TRACE + return m_multiparty; +} + void CallProxy::answer() { TRACE @@ -202,6 +209,7 @@ void CallProxy::getPropertiesFinished(QDBusPendingCallWatcher *watcher) m_name = qdbus_cast<QString>(props["Name"]); m_state = qdbus_cast<QString>(props["State"]); l_start = qdbus_cast<QString>(props["StartTime"]); + m_multiparty = qdbus_cast<bool>(props["Multiparty"]); setStartTimeFromString(l_start); @@ -253,6 +261,9 @@ void CallProxy::propertyChanged(const QString &in0, const QDBusVariant &in1) } else if (in0 == "StartTime") { if (!m_startTime.isValid()) // No start time set yet setStartTimeFromString(qdbus_cast<QString>(in1.variant())); + } else if (in0 == "Multiparty") { + m_multiparty = qdbus_cast<bool>(in1.variant()); + emit multiPartyChanged(); } else { qDebug() << QString("Unexpected property \"%1\" changed...").arg(in0); } @@ -303,6 +314,7 @@ QStringList CallProxy::dumpProperties() m_properties << QString("<li>State: %1</li>").arg(m_state); m_properties << QString("<li>StartTime: %1</li>") .arg(m_startTime.toString()); + m_properties << QString("<ul><li>Multiparty: %1</li>").arg((int)m_multiparty); if (!m_reason.isEmpty()) m_properties << QString("<li>DisconnectReason: %1</li></ul>") .arg(m_reason); diff --git a/src/callproxy.h b/src/callproxy.h index 67e71ed..e69b81f 100644 --- a/src/callproxy.h +++ b/src/callproxy.h @@ -30,6 +30,7 @@ class CallProxy: public org::ofono::VoiceCall Q_PROPERTY(QDateTime startTime READ startTime) Q_PROPERTY(int duration READ duration) Q_PROPERTY(QString reason READ reason) + Q_PROPERTY(bool multiparty READ multiparty) public: CallProxy(const QString &callPath); @@ -42,6 +43,7 @@ public: QDateTime startTime() const; int duration() const; QString reason() const; + bool multiparty() const; QStringList dumpProperties(); @@ -61,6 +63,7 @@ Q_SIGNALS: void callDisconnected(const QString &reason); void stateChanged(); void dataChanged(); + void multiPartyChanged(); private Q_SLOTS: // Slots to handle asyncronous DBus replies @@ -87,6 +90,7 @@ private: QDateTime m_startTime; QString m_reason; bool m_connected; + bool m_multiparty; Q_DISABLE_COPY(CallProxy) }; diff --git a/src/dialerkeypad.cpp b/src/dialerkeypad.cpp index 7eb3a4e..a125158 100644 --- a/src/dialerkeypad.cpp +++ b/src/dialerkeypad.cpp @@ -224,7 +224,7 @@ void DialerKeyPad::updateButtonStates() if (cm && cm->isValid()) haveCalls = ((cm->calls().length() > 0) || - (cm->multipartyCalls().length() > 0)); + (cm->multipartyCalls())); // Sync up the dial/hangup button state m_call->setChecked(haveCalls); @@ -264,7 +264,7 @@ void DialerKeyPad::updateButtonStates() // Sync up the merge button state if (cm && cm->isValid()) { - if (cm->multipartyCalls().length() > 0) + if (cm->multipartyCalls()) //% "Add" m_nway->setText(qtTrId("xx_add")); else @@ -752,8 +752,7 @@ void DialerKeyPad::callPressed(bool checked) c = cm->alertingCall(); if (c) { - if (cm->multipartyCalls().length() && - cm->multipartyCallsAsStrings().contains(c->path())) { + if (cm->multipartyCalls()) { qDebug() << "Hanging up MultipartyCall"; cm->hangupMultipartyCall(); } @@ -834,7 +833,7 @@ void DialerKeyPad::nwayPressed(bool checked) // If there is already a MultipartyCall, then we want to add an new // participant - if (cm->multipartyCalls().length() > 0) + if (cm->multipartyCalls()) if (cm->activeCall() && cm->heldCall()) qCritical() << QString("Can't add participant all lines busy!"); else -- 1.7.0.4 _______________________________________________ MeeGo-handset mailing list MeeGo-handset@lists.meego.com http://lists.meego.com/listinfo/meego-handset