Initial Import
[profile/ivi/hfdialer.git] / src / dialerapplication.cpp
1 /*
2  * hfdialer - Hands Free Voice Call Manager
3  * Copyright (c) 2012, Intel Corporation.
4  *
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
8  *
9  */
10
11 #include "common.h"
12 #include "dbustypes.h"
13 #include "dialerapplication.h"
14 #include "dialercontext.h"
15 #include "dbusdialeradapter.h"
16 #include "hfdialer_adaptor.h"
17 #include "pacontrol.h"
18 #include "qmlmainwindow.h"
19 #include <QtGui>
20 #include <QDebug>
21 #include <QApplication>
22
23 #define OFONO_VOICECALLMANAGER_INTERFACE "org.ofono.VoiceCallManager"
24
25 DialerApplication::DialerApplication(int &argc, char **argv)
26     : QApplication(argc, argv)
27 {
28     TRACE;
29     init();
30 }
31
32 void DialerApplication::releasePrestart()
33 {
34     TRACE;
35     // Now is the time for set up and display of information
36     // that needs to be done to allow the dialeror other
37     // pages to display correctly when opened. GenericPage has a
38     // activateWidgets() method for common setup and
39     // each Page type (dialer, people, favorites, etc) can also
40     // implement the method for Page specific setup and signal
41     // and slot connections
42
43     
44 }
45
46 void DialerApplication::restorePrestart()
47 {
48     TRACE;
49     // Now is the time for clean up and resetting an information
50     // that needs to be done to allow the dialer pages to display
51     // correctly when reopened. GenericPage has a
52     // deactivateAndResetWidgets() method for common setup and
53     // each Page type (dialer, people, favorites, etc) can also
54     // implement the method for Page specific clean up
55
56     // Call the default implementation to hide the window.
57 }
58
59 void DialerApplication::connectAll()
60 {
61     TRACE;
62
63     ManagerProxy *m_manager = ManagerProxy::instance();
64     if (m_manager->modem() &&
65         m_manager->modem()->isValid() &&
66         !m_manager->modem()->path().isEmpty())
67         {
68             qDebug() << QString("Connecting to CallManager....");
69             m_manager->setNetwork(m_manager->modem()->path());
70             m_manager->setCallManager(m_manager->modem()->path());
71             m_manager->setVolumeManager(m_manager->modem()->path());
72             m_manager->setVoicemail(m_manager->modem()->path());
73
74             connect(m_manager->network(), SIGNAL(connected()), this,
75                     SLOT(networkConnected()));
76             connect(m_manager->network(), SIGNAL(disconnected()), this,
77                     SLOT(networkDisconnected()));
78             connect(m_manager->callManager(), SIGNAL(connected()), this,
79                     SLOT(callManagerConnected()));
80             connect(m_manager->callManager(), SIGNAL(disconnected()), this,
81                     SLOT(callManagerDisconnected()));
82             connect(m_manager->callManager(), SIGNAL(callsChanged()), this,
83                     SLOT(onCallsChanged()));
84             connect(m_manager->voicemail(), SIGNAL(messagesWaitingChanged()), this,
85                     SLOT(messagesWaitingChanged()));
86             PAControl* paControl = PAControl::instance();
87             qDebug()<<"UBER DEBUG!!!  I can has connect with paControl onCallsChanged";
88             connect(m_manager->callManager(), SIGNAL(callsChanged()), paControl,
89                     SLOT(onCallsChanged()));
90         }
91 }
92
93 bool DialerApplication::isConnected()
94 {
95     TRACE;
96     return m_connected;
97 }
98
99 bool DialerApplication::hasError() const
100 {
101     TRACE;
102     return !m_lastError.isEmpty();
103 }
104
105 QString DialerApplication::lastError() const
106 {
107     TRACE;
108     return m_lastError;
109 }
110
111 void DialerApplication::setError(const QString msg)
112 {
113     TRACE;
114     m_lastError.clear();
115     m_lastError = QString(msg);
116 }
117
118 DialerApplication *DialerApplication::instance()
119 {
120     TRACE;
121     return qobject_cast<DialerApplication *>(QApplication::instance());
122 }
123
124 void DialerApplication::init()
125 {
126     TRACE;
127     m_connected = false;
128     m_lastError = QString();
129
130     // Notify Qt of our custom DBus MetaTypes
131     registerMyDataTypes();
132
133     m_manager = ManagerProxy::instance();
134     if (!m_manager || !m_manager->isValid())
135         //% "Failed to connect to org.ofono.Manager: is ofonod running?"
136         setError(qtTrId("xx_no_ofono_error"));
137     else
138         m_connected = true;
139
140     HfdialerAdaptor *adapter = new HfdialerAdaptor(this);
141     if(!adapter)
142     {
143         qWarning() << "DBus adapter instantiation failed.";
144     }
145
146     if(!QDBusConnection::systemBus().registerService("com.hfdialer"))
147     {
148         qCritical() << "Error registering on zee bus: " <<
149                        QDBusConnection::systemBus().lastError().message();
150     }
151
152     if(!QDBusConnection::systemBus().registerObject(DBUS_SERVICE_PATH, this))
153         {
154             qCritical() << "Error registering dbus object:" <<
155                 QDBusConnection::systemBus().lastError().message();
156         }
157     connect(m_manager, SIGNAL(modemChanged()),
158             SLOT(modemChanged()));
159
160    this->connectAll();
161
162    m_mainWindow = QMLMainWindow::instance();
163    connect(m_mainWindow, SIGNAL(closeWindow()),this, SLOT(closeWindow()));
164 }
165
166 void DialerApplication::modemChanged()
167 {
168     TRACE;
169     if (m_manager->modem() != NULL)
170         {
171             connect(m_manager->modem(), SIGNAL(connected()),
172                     SLOT(modemConnected()));
173             connect(m_manager->modem(), SIGNAL(disconnected()),
174                     SLOT(modemDisconnected()));
175     }
176     else
177     {
178         qDebug()<<"modem is null";
179     }
180 }
181
182 void DialerApplication::modemConnected()
183 {
184     TRACE;
185     //TODO: Handle multiple modems
186     if (m_manager->modem() && m_manager->modem()->isValid())
187         {
188             m_modem = m_manager->modem();
189
190             m_modem->setPowered(true);
191         
192             qDebug() << QString("Modem connected");
193             connect(m_modem, SIGNAL(interfacesChanged(QStringList)), this,
194                     SLOT(modemInterfacesChanged(QStringList)));
195             connect(m_modem, SIGNAL(poweredChanged(bool)), this,
196                     SLOT(modemPowered(bool)));
197
198             if (m_modem->powered() &&
199                 m_modem->interfaces().contains(OFONO_VOICECALLMANAGER_INTERFACE))
200                 {
201                     /* connect all now, modem is enabled */
202                     this->connectAll();
203                 }
204         }
205 }
206
207 void DialerApplication::modemDisconnected()
208 {
209     TRACE;
210     //TODO: Handle multiple modems
211 }
212
213 void DialerApplication::modemInterfacesChanged(QStringList interfaces)
214 {
215     TRACE;
216     qDebug() << QString("Modem Interfaces: ") << interfaces;
217
218     if (interfaces.contains(OFONO_VOICECALLMANAGER_INTERFACE) &&
219         m_manager->modem()->powered())
220         {
221             this->connectAll();
222         }
223 }
224
225 void DialerApplication::modemPowered(bool isPowered)
226 {
227     TRACE;
228     qDebug() << QString("Modem Powered: ") << isPowered;
229
230     if (isPowered &&
231         m_manager->modem()->interfaces().contains(OFONO_VOICECALLMANAGER_INTERFACE))
232         {
233             this->connectAll();
234         }
235 }
236
237 void DialerApplication::networkConnected()
238 {
239     TRACE;
240     if (m_manager->network() && m_manager->network()->isValid())
241         m_network = m_manager->network();
242 }
243
244 void DialerApplication::networkDisconnected()
245 {
246     TRACE;
247 }
248
249 void DialerApplication::callManagerConnected()
250 {
251     TRACE;
252     if (m_manager->callManager() && m_manager->callManager()->isValid())
253         m_callManager = m_manager->callManager();
254
255
256     qDebug() << QString("Disconnect calls changed signal");
257     disconnect(m_callManager, SIGNAL(callsChanged()));
258
259     qDebug() << QString("Disconnect incoming signal");
260     disconnect(m_callManager, SIGNAL(incomingCall(CallItem*)));
261
262     qDebug() << QString("Disconnect resource lost");
263     disconnect(m_callManager, SIGNAL(callResourceLost(const QString)));
264 }
265
266 void DialerApplication::callManagerDisconnected()
267 {
268     TRACE;
269     qDebug() << QString("CallMgr disconnected");
270 }
271
272 void DialerApplication::messagesWaitingChanged()
273 {
274     TRACE;
275 }
276
277 void DialerApplication::onCallsChanged()
278 {
279     TRACE;
280     QMLMainWindow::instance()->tryToShow();
281 }
282
283 void DialerApplication::raise()
284 {
285     TRACE;
286     QMLMainWindow::instance()->tryToShow();
287 }
288
289 void DialerApplication::closeWindow()
290 {
291     TRACE;
292     m_mainWindow->hide();
293 }
294
295 /* Local Variables:      */
296 /* mode:c++              */
297 /* c-basic-offset:4      */
298 /* indent-tabs-mode: nil */
299 /* End:                  */