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
12 #include "dbustypes.h"
13 #include "dialerapplication.h"
14 #include "dialercontext.h"
15 #include "dbusdialeradapter.h"
16 #include "pacontrol.h"
17 #include "qmlmainwindow.h"
20 #include <QApplication>
22 #define OFONO_VOICECALLMANAGER_INTERFACE "org.ofono.VoiceCallManager"
24 DialerApplication::DialerApplication(int &argc, char **argv)
25 : QApplication(argc, argv)
31 void DialerApplication::releasePrestart()
34 // Now is the time for set up and display of information
35 // that needs to be done to allow the dialeror other
36 // pages to display correctly when opened. GenericPage has a
37 // activateWidgets() method for common setup and
38 // each Page type (dialer, people, favorites, etc) can also
39 // implement the method for Page specific setup and signal
40 // and slot connections
45 void DialerApplication::restorePrestart()
48 // Now is the time for clean up and resetting an information
49 // that needs to be done to allow the dialer pages to display
50 // correctly when reopened. GenericPage has a
51 // deactivateAndResetWidgets() method for common setup and
52 // each Page type (dialer, people, favorites, etc) can also
53 // implement the method for Page specific clean up
55 // Call the default implementation to hide the window.
58 void DialerApplication::connectAll()
62 ManagerProxy *m_manager = ManagerProxy::instance();
63 if (m_manager->modem() &&
64 m_manager->modem()->isValid() &&
65 !m_manager->modem()->path().isEmpty())
67 qDebug() << QString("Connecting to CallManager....");
68 m_manager->setNetwork(m_manager->modem()->path());
69 m_manager->setCallManager(m_manager->modem()->path());
70 m_manager->setVolumeManager(m_manager->modem()->path());
71 m_manager->setVoicemail(m_manager->modem()->path());
73 connect(m_manager->network(), SIGNAL(connected()), this,
74 SLOT(networkConnected()));
75 connect(m_manager->network(), SIGNAL(disconnected()), this,
76 SLOT(networkDisconnected()));
77 connect(m_manager->callManager(), SIGNAL(connected()), this,
78 SLOT(callManagerConnected()));
79 connect(m_manager->callManager(), SIGNAL(disconnected()), this,
80 SLOT(callManagerDisconnected()));
81 connect(m_manager->callManager(), SIGNAL(callsChanged()), this,
82 SLOT(onCallsChanged()));
83 connect(m_manager->voicemail(), SIGNAL(messagesWaitingChanged()), this,
84 SLOT(messagesWaitingChanged()));
85 PAControl* paControl = PAControl::instance();
86 connect(m_manager->callManager(), SIGNAL(callsChanged()), paControl,
87 SLOT(onCallsChanged()));
91 bool DialerApplication::isConnected()
97 bool DialerApplication::hasError() const
100 return !m_lastError.isEmpty();
103 QString DialerApplication::lastError() const
109 void DialerApplication::setError(const QString msg)
113 m_lastError = QString(msg);
116 DialerApplication *DialerApplication::instance()
119 return qobject_cast<DialerApplication *>(QApplication::instance());
122 SeasideSyncModel *DialerApplication::seasideModel()
125 return m_seasideModel;
128 SeasideProxyModel *DialerApplication::seasideProxy()
131 return m_seasideProxy;
135 HistoryTableModel *DialerApplication::historyModel()
138 // return m_historyModel;
141 QSortFilterProxyModel *DialerApplication::historyProxy()
144 return m_historyProxy;
147 void DialerApplication::init()
151 m_lastError = QString();
153 // Notify Qt of our custom DBus MetaTypes
154 registerMyDataTypes();
156 m_manager = ManagerProxy::instance();
157 if (!m_manager || !m_manager->isValid())
158 //% "Failed to connect to org.ofono.Manager: is ofonod running?"
159 setError(qtTrId("xx_no_ofono_error"));
163 DBusDialerAdapter *adapter = new DBusDialerAdapter(this);
166 qWarning() << "DBus adapter instantiation failed.";
169 if(!QDBusConnection::sessionBus().registerObject(DBUS_SERVICE_PATH, this))
171 qCritical() << "Error registering dbus object:" <<
172 QDBusConnection::sessionBus().lastError().message();
174 connect(m_manager, SIGNAL(modemChanged()),
175 SLOT(modemChanged()));
179 void DialerApplication::modemChanged()
182 if (m_manager->modem() != NULL)
184 connect(m_manager->modem(), SIGNAL(connected()),
185 SLOT(modemConnected()));
186 connect(m_manager->modem(), SIGNAL(disconnected()),
187 SLOT(modemDisconnected()));
191 void DialerApplication::modemConnected()
194 //TODO: Handle multiple modems
195 if (m_manager->modem() && m_manager->modem()->isValid())
197 m_modem = m_manager->modem();
199 m_modem->setPowered(true);
201 qDebug() << QString("Modem connected");
202 connect(m_modem, SIGNAL(interfacesChanged(QStringList)), this,
203 SLOT(modemInterfacesChanged(QStringList)));
204 connect(m_modem, SIGNAL(poweredChanged(bool)), this,
205 SLOT(modemPowered(bool)));
207 if (m_modem->powered() &&
208 m_modem->interfaces().contains(OFONO_VOICECALLMANAGER_INTERFACE))
210 /* connect all now, modem is enabled */
216 void DialerApplication::modemDisconnected()
219 //TODO: Handle multiple modems
222 void DialerApplication::modemInterfacesChanged(QStringList interfaces)
225 qDebug() << QString("Modem Interfaces: ") << interfaces;
227 if (interfaces.contains(OFONO_VOICECALLMANAGER_INTERFACE) &&
228 m_manager->modem()->powered())
234 void DialerApplication::modemPowered(bool isPowered)
237 qDebug() << QString("Modem Powered: ") << isPowered;
240 m_manager->modem()->interfaces().contains(OFONO_VOICECALLMANAGER_INTERFACE))
246 void DialerApplication::networkConnected()
249 if (m_manager->network() && m_manager->network()->isValid())
250 m_network = m_manager->network();
253 void DialerApplication::networkDisconnected()
258 void DialerApplication::callManagerConnected()
261 if (m_manager->callManager() && m_manager->callManager()->isValid())
262 m_callManager = m_manager->callManager();
265 qDebug() << QString("Disconnect calls changed signal");
266 disconnect(m_callManager, SIGNAL(callsChanged()));
268 qDebug() << QString("Disconnect incoming signal");
269 disconnect(m_callManager, SIGNAL(incomingCall(CallItem*)));
271 qDebug() << QString("Disconnect resource lost");
272 disconnect(m_callManager, SIGNAL(callResourceLost(const QString)));
275 void DialerApplication::callManagerDisconnected()
278 qDebug() << QString("CallMgr disconnected");
281 void DialerApplication::messagesWaitingChanged()
285 static MNotification *vmail = NULL;
287 if (!m_manager->voicemail() || !m_manager->voicemail()->isValid()) {
288 qDebug() << QString("Voicemail proxy is invalid, ignoring");
295 foreach (MNotification *notice, MNotification::notifications()) {
296 if (notice->eventType() == MNotification::MessageArrivedEvent) {
297 // If we've already found a MessageArrived notification,
298 // we must delete others since we only want one
300 qDebug() << QString("Removing duplicate voicemail notice");
310 // We're only interested in MessageArrived events, all others
311 // can need to be deleted here since they are copies
317 if (!m_manager->voicemail()->waiting()) {
318 qDebug() << QString("No waiting Voicemail messages");
322 // This is the first instance of a MessageArrived event
323 qDebug() << QString("Creating new voicemail notice instance");
324 vmail = new MNotification(MNotification::MessageArrivedEvent);
329 if (!m_manager->voicemail()->waiting()) {
330 qDebug() << QString("No waiting Voicemail messages");
337 // We've got a valid notification and we have messages waiting...
338 int vCount = m_manager->voicemail()->count();
339 int nCount = vmail->count();
341 if (vCount < 0) vCount = 0;
342 if (nCount < 0) nCount = 0;
344 qDebug() << QString("Voicemails: %1").arg(QString::number(vCount));
345 qDebug() << QString("Notices: %1").arg(QString::number(nCount));
347 // No more Voicemail messages waiting, remove notification
349 qDebug() << QString("No Voicemails waiting, removing notification");
354 // The waiting voicemail count has changed, update and [re]publish it
355 //% "You have %1 voice messages"
356 vmail->setSummary(qtTrId("xx_messages_waiting").arg(vCount));
357 vmail->setImage("icon-m-telephony-voicemail");
358 vmail->setCount(vCount);
359 qDebug() << QString("Voicemail count changed, publishing notification");
364 void DialerApplication::onCallsChanged()
367 QMLMainWindow::instance()->tryToShow();