Commit 2a57613e authored by Emmanuel Lepage's avatar Emmanuel Lepage

[#7023] Add the ability to load an abstract contact backend in the library to...

[#7023] Add the ability to load an abstract contact backend in the library to resolve more data, polish code
parent 3c239f26
......@@ -65,6 +65,7 @@ TreeWidgetCallModel* SFLPhone::model()
if (!m_pModel) {
m_pModel = new TreeWidgetCallModel(TreeWidgetCallModel::ActiveCall);
m_pModel->initCall();
m_pModel->initContact(AkonadiBackend::getInstance());
}
return m_pModel;
}
......
......@@ -24,6 +24,8 @@
#include "callmanager_interface_singleton.h"
#include "configurationmanager_interface_singleton.h"
#include "ContactBackend.h"
#include "Contact.h"
const call_state Call::actionPerformedStateMap [11][5] =
......@@ -94,6 +96,13 @@ const function Call::stateChangedFunctionMap[11][6] =
const char * Call::historyIcons[3] = {ICON_HISTORY_INCOMING, ICON_HISTORY_OUTGOING, ICON_HISTORY_MISSED};
ContactBackend* Call::m_pContactBackend = 0;
void Call::setContactBackend(ContactBackend* be)
{
m_pContactBackend = be;
}
///Constructor
Call::Call(call_state startState, QString callId, QString peerName, QString peerNumber, QString account)
: conference(false)
......@@ -318,13 +327,13 @@ QString Call::getStartTimeStamp() const
///Get the number where the call have been transferred
QString Call::getTransferNumber() const
{
return transferNumber;
return m_pTransferNumber;
}
///Get the call / peer number
QString Call::getCallNumber() const
{
return callNumber;
return m_pCallNumber;
}
///Return the call id
......@@ -416,13 +425,13 @@ bool Call::isSecure() const {
///Set the transfer number
void Call::setTransferNumber(QString number)
{
transferNumber = number;
m_pTransferNumber = number;
}
///Set the call number
void Call::setCallNumber(QString number)
{
callNumber = number;
m_pCallNumber = number;
emit changed();
}
......@@ -544,9 +553,9 @@ void Call::refuse()
void Call::acceptTransf()
{
CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
qDebug() << "Accepting call and transfering it to number : " << transferNumber << ". callId : " << m_pCallId;
qDebug() << "Accepting call and transfering it to number : " << m_pTransferNumber << ". callId : " << m_pCallId;
callManager.accept(m_pCallId);
callManager.transfer(m_pCallId, transferNumber);
callManager.transfer(m_pCallId, m_pTransferNumber);
// m_pHistoryState = TRANSFERED;
}
......@@ -595,17 +604,19 @@ void Call::call()
this->m_pAccount = CallModelConvenience::getCurrentAccountId();
}
if(!m_pAccount.isEmpty()) {
qDebug() << "Calling " << callNumber << " with account " << m_pAccount << ". callId : " << m_pCallId;
callManager.placeCall(m_pAccount, m_pCallId, callNumber);
qDebug() << "Calling " << m_pCallNumber << " with account " << m_pAccount << ". callId : " << m_pCallId;
callManager.placeCall(m_pAccount, m_pCallId, m_pCallNumber);
this->m_pAccount = m_pAccount;
this->m_pPeerPhoneNumber = callNumber;
// Contact * contact = findContactForNumberInKAddressBook(peerPhoneNumber); //TODO port
// if(contact) this->m_pPeerName = contact->getNickName();
this->m_pPeerPhoneNumber = m_pCallNumber;
if (m_pContactBackend) {
Contact* contact = m_pContactBackend->getContactByPhone(m_pPeerPhoneNumber);
m_pPeerName = contact->getFormattedName();
}
this->m_pStartTime = new QDateTime(QDateTime::currentDateTime());
this->m_pHistoryState = OUTGOING;
}
else {
qDebug() << "Trying to call " << transferNumber << " with no account registered . callId : " << m_pCallId;
qDebug() << "Trying to call " << m_pTransferNumber << " with no account registered . callId : " << m_pCallId;
this->m_pHistoryState = NONE;
throw "No account registered!";
}
......@@ -615,8 +626,8 @@ void Call::call()
void Call::transfer()
{
CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
qDebug() << "Transfering call to number : " << transferNumber << ". callId : " << m_pCallId;
callManager.transfer(m_pCallId, transferNumber);
qDebug() << "Transfering call to number : " << m_pTransferNumber << ". callId : " << m_pCallId;
callManager.transfer(m_pCallId, m_pTransferNumber);
this->m_pStopTime = new QDateTime(QDateTime::currentDateTime());
}
......@@ -694,10 +705,10 @@ void Call::appendText(QString str)
switch (currentState) {
case CALL_STATE_TRANSFER :
case CALL_STATE_TRANSF_HOLD :
editNumber = &transferNumber;
editNumber = &m_pTransferNumber;
break;
case CALL_STATE_DIALING :
editNumber = &callNumber;
editNumber = &m_pCallNumber;
break;
default :
qDebug() << "Backspace on call not editable. Doing nothing.";
......@@ -717,10 +728,10 @@ void Call::backspaceItemText()
switch (currentState) {
case CALL_STATE_TRANSFER :
case CALL_STATE_TRANSF_HOLD :
editNumber = &transferNumber;
editNumber = &m_pTransferNumber;
break;
case CALL_STATE_DIALING :
editNumber = &callNumber;
editNumber = &m_pCallNumber;
break;
default :
qDebug() << "Backspace on call not editable. Doing nothing.";
......
......@@ -31,6 +31,8 @@
#include "sflphone_const.h"
#include "typedefs.h"
class ContactBackend;
/** @enum daemon_call_state_t
* This enum have all the states a call can take for the daemon.
......@@ -134,8 +136,9 @@ private:
QLabel * labelHistoryTime;
*/
QString transferNumber;
QString callNumber;
QString m_pTransferNumber;
QString m_pCallNumber;
static ContactBackend* m_pContactBackend;
bool conference;
......@@ -212,6 +215,7 @@ public:
static Call* buildRingingCall (const QString & callId );
static Call* buildHistoryCall (const QString & callId, uint startTimeStamp, uint stopTimeStamp, QString account, QString name, QString number, QString type );
static Call* buildExistingCall (QString callId );
static void setContactBackend (ContactBackend* be );
//Static getters
static history_state getHistoryStateFromType ( QString type );
......
......@@ -36,6 +36,7 @@
#include "sflphone_const.h"
#include "unistd.h"
#include "typedefs.h"
#include "ContactBackend.h"
typedef QHash<QString, Call*> CallHash;
typedef QList<Call*> CallList;
......@@ -90,10 +91,11 @@ class LIB_EXPORT CallModel : public CallModelBase {
};
//Constructors, initializer and destructors
CallModel ( ModelType type );
virtual ~CallModel ( ) {}
virtual bool initCall ( );
virtual bool initHistory ( );
CallModel ( ModelType type );
virtual ~CallModel ( ) {}
virtual bool initCall ( );
virtual bool initHistory ( );
virtual void initContact ( ContactBackend* be );
//Call related
virtual Call* addCall ( Call* call , Call* parent =0 );
......
......@@ -65,6 +65,12 @@ template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::
return true;
}
///Set how the call can find more informations about the call it receive
template<typename CallWidget, typename Index> void CallModel<CallWidget,Index>::initContact ( ContactBackend* be )
{
Call::setContactBackend(be);
}
///Fill the history list
///@warning This solution wont scale to multiple call or history model implementation. Some static addCall + foreach for each call would be needed if this case ever become unavoidable
template<typename CallWidget, typename Index> bool CallModel<CallWidget,Index>::initHistory()
......
......@@ -17,6 +17,7 @@
#include "AkonadiBackend.h"
#include "lib/sflphone_const.h"
///Qt lack official functional sorting algo, so this hack around it
class QNumericTreeWidgetItem : public QTreeWidgetItem {
public:
QNumericTreeWidgetItem(QTreeWidget* parent):QTreeWidgetItem(parent),widget(0),weight(-1){}
......@@ -36,6 +37,7 @@ class QNumericTreeWidgetItem : public QTreeWidgetItem {
}
};
///Event filter allowing to write text on the Tree widget to filter it.
bool KeyPressEater::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::KeyPress) {
......@@ -47,6 +49,7 @@ bool KeyPressEater::eventFilter(QObject *obj, QEvent *event)
}
}
///Constructor
HistoryDock::HistoryDock(QWidget* parent) : QDockWidget(parent)
{
setObjectName("historyDock");
......@@ -121,10 +124,12 @@ HistoryDock::HistoryDock(QWidget* parent) : QDockWidget(parent)
connect(AkonadiBackend::getInstance(), SIGNAL(collectionChanged()), this, SLOT(updateContactInfo() ));
}
///Destructor
HistoryDock::~HistoryDock()
{
}
///Return the identity of the call caller
QString HistoryDock::getIdentity(HistoryTreeItem* item)
{
if (item->getName().trimmed().isEmpty())
......@@ -133,6 +138,7 @@ QString HistoryDock::getIdentity(HistoryTreeItem* item)
return item->getName();
}
///Update informations
void HistoryDock::updateContactInfo()
{
foreach(HistoryTreeItem* hitem, m_pHistory) {
......@@ -140,6 +146,7 @@ void HistoryDock::updateContactInfo()
}
}
///Reload the history list
void HistoryDock::reload()
{
m_pItemView->clear();
......@@ -209,6 +216,7 @@ void HistoryDock::reload()
m_pItemView->sortItems(0,Qt::AscendingOrder);
}
///Enable the ability to set a date range like 1 month to limit history
void HistoryDock::enableDateRange(bool enable)
{
m_pFromL->setVisible(enable);
......@@ -220,6 +228,7 @@ void HistoryDock::enableDateRange(bool enable)
ConfigurationSkeleton::setDisplayDataRange(enable);
}
///Filter the history
void HistoryDock::filter(QString text)
{
foreach(HistoryTreeItem* item, m_pHistory) {
......@@ -229,6 +238,7 @@ void HistoryDock::filter(QString text)
m_pItemView->expandAll();
}
///When the data range is linked, change the opposite value when editing the first
void HistoryDock::updateLinkedDate(KDateWidget* item, QDate& prevDate, QDate& newDate)
{
if (m_pLinkPB->isChecked()) {
......@@ -251,20 +261,23 @@ void HistoryDock::updateLinkedDate(KDateWidget* item, QDate& prevDate, QDate& ne
prevDate = newDate;
}
///The signals have to be disabled to prevent an ifinite loop
void HistoryDock::updateLinkedFromDate(QDate date)
{
disconnect(m_pToDW , SIGNAL(changed(QDate)), this, SLOT(updateLinkedToDate(QDate)));
disconnect (m_pToDW , SIGNAL(changed(QDate)), this, SLOT(updateLinkedToDate(QDate)));
updateLinkedDate(m_pToDW,m_pCurrentFromDate,date);
connect(m_pToDW , SIGNAL(changed(QDate)), this, SLOT(updateLinkedToDate(QDate)));
connect (m_pToDW , SIGNAL(changed(QDate)), this, SLOT(updateLinkedToDate(QDate)));
}
///The signals have to be disabled to prevent an ifinite loop
void HistoryDock::updateLinkedToDate(QDate date)
{
disconnect(m_pFromDW , SIGNAL(changed(QDate)), this, SLOT(updateLinkedFromDate(QDate)));
updateLinkedDate(m_pFromDW,m_pCurrentToDate,date);
connect(m_pFromDW , SIGNAL(changed(QDate)), this, SLOT(updateLinkedFromDate(QDate)));
connect (m_pFromDW , SIGNAL(changed(QDate)), this, SLOT(updateLinkedFromDate(QDate)));
}
///Generate serializerd version of the content
QMimeData* HistoryTree::mimeData( const QList<QTreeWidgetItem *> items) const
{
qDebug() << "An history call is being dragged";
......@@ -287,6 +300,7 @@ QMimeData* HistoryTree::mimeData( const QList<QTreeWidgetItem *> items) const
return mimeData;
}
///Handle what happen when serialized data is dropped
bool HistoryTree::dropMimeData(QTreeWidgetItem *parent, int index, const QMimeData *data, Qt::DropAction action)
{
Q_UNUSED(index)
......@@ -300,6 +314,7 @@ bool HistoryTree::dropMimeData(QTreeWidgetItem *parent, int index, const QMimeDa
return false;
}
///Handle keyboard input and redirect them to the filterbox
void HistoryDock::keyPressEvent(QKeyEvent* event) {
int key = event->key();
if(key == Qt::Key_Escape)
......
......@@ -37,6 +37,7 @@
const char * HistoryTreeItem::callStateIcons[12] = {ICON_INCOMING, ICON_RINGING, ICON_CURRENT, ICON_DIALING, ICON_HOLD, ICON_FAILURE, ICON_BUSY, ICON_TRANSFER, ICON_TRANSF_HOLD, "", "", ICON_CONFERENCE};
///Constructor
HistoryTreeItem::HistoryTreeItem(QWidget *parent ,QString phone)
: QWidget(parent), itemCall(0),m_pMenu(0), init(false)
{
......@@ -56,6 +57,7 @@ HistoryTreeItem::HistoryTreeItem(QWidget *parent ,QString phone)
m_pAddToContact->setShortcut ( Qt::CTRL + Qt::Key_E );
m_pAddToContact->setText ( "Add Number to Contact" );
m_pAddToContact->setIcon ( KIcon("list-resource-add") );
m_pAddToContact->setDisabled ( true );
m_pAddContact->setShortcut ( Qt::CTRL + Qt::Key_E );
m_pAddContact->setText ( "Add Contact" );
......@@ -64,10 +66,12 @@ HistoryTreeItem::HistoryTreeItem(QWidget *parent ,QString phone)
m_pCopy->setShortcut ( Qt::CTRL + Qt::Key_C );
m_pCopy->setText ( "Copy" );
m_pCopy->setIcon ( KIcon("edit-copy") );
m_pCopy->setDisabled ( true );
m_pEmail->setShortcut ( Qt::CTRL + Qt::Key_M );
m_pEmail->setText ( "Send Email" );
m_pEmail->setIcon ( KIcon("mail-message-new") );
m_pEmail->setDisabled ( true );
m_pBookmark->setShortcut ( Qt::CTRL + Qt::Key_D );
m_pBookmark->setText ( "Bookmark" );
......@@ -108,16 +112,19 @@ HistoryTreeItem::HistoryTreeItem(QWidget *parent ,QString phone)
}
}
///Destructor
HistoryTreeItem::~HistoryTreeItem()
{
}
///Return the call item
Call* HistoryTreeItem::call() const
{
return itemCall;
}
///Set the call to be handled by this item
void HistoryTreeItem::setCall(Call *call)
{
itemCall = call;
......@@ -143,6 +150,7 @@ void HistoryTreeItem::setCall(Call *call)
m_pPhoneNumber = itemCall->getPeerPhoneNumber();
}
///Can a contact be associed with this call?
bool HistoryTreeItem::getContactInfo(QString phoneNumber)
{
Contact* contact = AkonadiBackend::getInstance()->getContactByPhone(phoneNumber);
......@@ -159,6 +167,7 @@ bool HistoryTreeItem::getContactInfo(QString phoneNumber)
return true;
}
///The item have to be updated
void HistoryTreeItem::updated()
{
if (!getContactInfo(itemCall->getPeerPhoneNumber())) {
......@@ -185,37 +194,43 @@ void HistoryTreeItem::updated()
}
///Return the time stamp
uint HistoryTreeItem::getTimeStamp()
{
return m_pTimeStamp;
}
///Return the duration
uint HistoryTreeItem::getDuration()
{
return m_pDuration;
}
///Return the caller name
QString HistoryTreeItem::getName()
{
return m_pName;
}
///Return the caller peer number
QString HistoryTreeItem::getPhoneNumber()
{
return m_pPhoneNumber;
}
///Get the index item assiciated with this widget
QTreeWidgetItem* HistoryTreeItem::getItem()
{
return m_pItem;
}
///Set the index associed with this widget
void HistoryTreeItem::setItem(QTreeWidgetItem* item)
{
m_pItem = item;
}
///Show the context menu
void HistoryTreeItem::showContext(const QPoint& pos)
{
if (!m_pMenu) {
......@@ -230,12 +245,14 @@ void HistoryTreeItem::showContext(const QPoint& pos)
m_pMenu->exec(mapToGlobal(pos));
}
///Send an email
void HistoryTreeItem::sendEmail()
{
//TODO
qDebug() << "Sending email";
}
///Call the caller again
void HistoryTreeItem::callAgain()
{
if (itemCall) {
......@@ -244,11 +261,14 @@ void HistoryTreeItem::callAgain()
SFLPhone::model()->addDialingCall(m_pName, SFLPhone::app()->model()->getCurrentAccountId())->setCallNumber(m_pPhoneNumber);
}
///Copy the call
void HistoryTreeItem::copy()
{
//TODO
qDebug() << "Copying contact";
}
///Create a contact from those informations
void HistoryTreeItem::addContact()
{
qDebug() << "Adding contact";
......@@ -258,10 +278,14 @@ void HistoryTreeItem::addContact()
AkonadiBackend::getInstance()->addNewContact(aContact);
}
///Add this call number to an existing contact
void HistoryTreeItem::addToContact()
{
//TODO
qDebug() << "Adding to contact";
}
///Bookmark this contact
void HistoryTreeItem::bookmark()
{
qDebug() << "bookmark";
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment