2 * hfdialer - Hands Free Voice Call Manager
3 * Copyright (c) 2012, Intel Corporation.
5 * This program is licensed under the terms and conditions of the
6 * Apache License, version 2.0. The full text of the Apache License is at
7 * http://www.apache.org/licenses/LICENSE-2.0
13 #include "dialerapplication.h"
14 #include "pacontrol.h"
15 #include <QGraphicsItem>
16 #include <QGraphicsWidget>
19 #define DEFAULT_RINGTONE "ring-1.wav"
21 CallItem::CallItem(const QString path, QObject *parent)
24 m_rtKey(new MGConfItem("/apps/dialer/defaultRingtone")),
25 m_isconnected(FALSE)//,
30 /* QString l_ringtoneFile = QString("%1/%2/stereo/%3")
33 .arg(DEFAULT_RINGTONE);
36 QString l_ringtoneFile = QString("/usr/share/hfdialer/sounds/%1").arg(DEFAULT_RINGTONE);
37 QString l_rtKeyValue = m_rtKey->value(QVariant(l_ringtoneFile)).toString();
39 if (QFileInfo(l_rtKeyValue).exists()) {
41 m_ringtonefile = l_ringtoneFile;
42 qDebug() << QString("CallItem: %1 using ringtone: %2")
47 qWarning() << QString("CallItem: %1 ringtone not found: %2")
52 //m_ringtone->setMedia(QMediaContent(QUrl::fromLocalFile(m_ringtonefile)));
53 //m_ringtone->setVolume(100);
64 disconnect(m_ringtone, SIGNAL(positionChanged(qint64)));
70 PAControl::instance()->unrouteAudio();
80 // delete the callproxy object
88 if (!m_path.isEmpty()) {
89 m_call = new CallProxy(m_path);
90 if (m_call->isValid()) {
91 // dynamic_cast<CallItemModel*>(model())->setCall(call);
92 connect(m_call,SIGNAL(stateChanged()),this,SLOT(callStateChanged()));
93 connect(m_call,SIGNAL(dataChanged()),this,SLOT(callDataChanged()));
94 connect(m_call,SIGNAL(multipartyChanged()),this,SLOT(callMultipartyChanged()));
96 qCritical("Invalid CallProxy instance!");
98 qCritical("Empty call path. Can not create CallProxy!");
100 //populatePeopleItem();
102 if (state() == STATE_INCOMING ||
103 state() == STATE_WAITING)
108 if (!m_isconnected && m_ringtone) {
109 connect(m_ringtone, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)),
110 SLOT(ringtoneStatusChanged(QMediaPlayer::MediaStatus)));
111 m_isconnected = TRUE;
118 bool CallItem::isValid()
121 return (!path().isEmpty());
124 bool CallItem::isValid() const
127 return (!path().isEmpty());
130 QString CallItem::path() const
136 bool CallItem::setPath(QString path)
139 if (!m_path.isEmpty()) {
140 qCritical("Path already set and can not be changed once it is set");
142 } else if (path.isEmpty()) {
143 qCritical("It makes no sense to set Path to an empty string!?!?");
154 void CallItem::setDirection(CallDirection direction)
157 // dynamic_cast<CallItemModel*>(model())->setDirection(direction);
160 QString CallItem::lineID() const
163 return m_call->lineID();
166 QString CallItem::name() const
169 return m_call->name();
172 CallState CallItem::state() const
175 CallState cs = STATE_NONE;
176 QString state = m_call->state();
178 if (state == "active")
181 else if (state == "held")
183 else if (state == "dialing")
185 else if (state == "alerting")
187 else if (state == "incoming")
189 else if (state == "waiting")
191 else if (state == "disconnected")
192 cs = STATE_DISCONNECTED;
197 CallDirection CallItem::direction() const
200 return DIRECTION_NONE;
201 //return dynamic_cast<const CallItemModel*>(model())->direction();
204 CallDisconnectReason CallItem::reason() const
207 return DISCONNECT_NONE;
208 //return dynamic_cast<const CallItemModel*>(model())->reasonType();
211 int CallItem::duration() const
214 return m_call->duration();
217 QDateTime CallItem::startTime() const
220 return m_call->startTime();
223 PeopleItem * CallItem::peopleItem() const
229 CallProxy* CallItem::callProxy() const
234 return dynamic_cast<const CallItemModel*>(model())->call();
241 void CallItem::setPeopleItem(PeopleItem *person)
246 m_peopleItem = person;
249 void CallItem::click()
256 void CallItem::silenceRingtone()
267 void CallItem::callStateChanged()
271 if (state() == STATE_INCOMING ||
272 state() == STATE_WAITING)
275 if (!m_isconnected && m_ringtone) {
276 connect(m_ringtone, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)),
277 SLOT(ringtoneStatusChanged(QMediaPlayer::MediaStatus)));
278 m_isconnected = TRUE;
284 disconnect(m_ringtone, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)));
285 m_isconnected = FALSE;
292 void CallItem::callDataChanged()
295 // populatePeopleItem();
298 void CallItem::callDisconnected(const QString &reason)
305 QVariant CallItem::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &val)
308 if (change == QGraphicsItem::ItemSelectedHasChanged)
309 dynamic_cast<const CallItemModel*>(model())->setSelected(val.toBool());
310 return QGraphicsItem::itemChange(change, val);
314 void CallItem::populatePeopleItem()
318 QModelIndexList matches;
320 int role = Seaside::SearchRole;
324 QString pi_name = qtTrId("xx_unknown_caller");
325 QString pi_photo = "icon-m-content-avatar-placeholder";
327 QString pi_lineid = qtTrId("xx_private");
329 if (!lineID().isEmpty()) {
330 pi_lineid = stripLineID(lineID());
331 SeasideSyncModel *contacts = DA_SEASIDEMODEL;
332 QModelIndex first = contacts->index(0,Seaside::ColumnPhoneNumbers);
333 matches = contacts->match(first, role, QVariant(pi_lineid), hits);
335 QString firstName = QString();
336 QString lastName = QString();
338 if (!matches.isEmpty()) {
339 QModelIndex person = matches.at(0); //First match is all we look at
341 SEASIDE_SET_MODEL_AND_ROW(person.model(), person.row());
343 firstName = SEASIDE_FIELD(FirstName, String);
344 lastName = SEASIDE_FIELD(LastName, String);
345 pi_photo = SEASIDE_FIELD(Avatar, String);
346 } else if (!name().isEmpty()) {
347 // We don't have a contact, but we have a callerid name, let's use it
351 if (lastName.isEmpty() && !firstName.isEmpty())
352 // Contacts first (common) name
354 pi_name = qtTrId("xx_first_name").arg(firstName);
355 else if (firstName.isEmpty() && !lastName.isEmpty())
357 // Contacts last (sur) name
359 pi_name = qtTrId("xx_last_name").arg(lastName);
360 else if (!firstName.isEmpty() && !lastName.isEmpty())
361 // Contacts full, sortable name, is "Firstname Lastname"
363 pi_name = qtTrId("xx_first_last_name").arg(firstName)
368 pi_lineid = qtTrId("xx_unavailable");
371 if (m_peopleItem != NULL)
373 m_peopleItem = new PeopleItem();
375 m_peopleItem->setName(pi_name);
376 m_peopleItem->setPhoto(pi_photo);
377 m_peopleItem->setPhone(pi_lineid);
381 void CallItem::ringtoneStatusChanged(QMediaPlayer::MediaStatus status)
384 if (status == QMediaPlayer::EndOfMedia)
386 m_ringtone->setMedia(QMediaContent(QUrl::fromLocalFile(m_ringtonefile)));
391 bool CallItem::multiparty()
395 // return (isValid())?dynamic_cast<const CallItemModel*>(model())->multiparty():false;
398 void CallItem::callMultipartyChanged()
401 emit multipartyChanged();