Merge branch 'master' into situare_interact
[situare] / src / engine / engine.h
1  /*
2     Situare - A location system for Facebook
3     Copyright (C) 2010  Ixonos Plc. Authors:
4
5         Kaj Wallin - kaj.wallin@ixonos.com
6         Henri Lampela - henri.lampela@ixonos.com
7         Jussi Laitinen - jussi.laitinen@ixonos.com
8         Sami Rämö - sami.ramo@ixonos.com
9
10     Situare is free software; you can redistribute it and/or
11     modify it under the terms of the GNU General Public License
12     version 2 as published by the Free Software Foundation.
13
14     Situare is distributed in the hope that it will be useful,
15     but WITHOUT ANY WARRANTY; without even the implied warranty of
16     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17     GNU General Public License for more details.
18
19     You should have received a copy of the GNU General Public License
20     along with Situare; if not, write to the Free Software
21     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
22     USA.
23  */
24
25
26 #ifndef ENGINE_H
27 #define ENGINE_H
28
29 #include <QObject>
30 #include <QTime>
31
32 #include "coordinates/geocoordinate.h"
33
34 class QTimer;
35
36 class Application;
37 class ContactManager;
38 class FacebookAuthentication;
39 class FacebookCredentials;
40 class GeocodingService;
41 class GPSPosition;
42 class Location;
43 class MainWindow;
44 class MapEngine;
45 class MCE;
46 class NetworkAccessManager;
47 class Route;
48 class RoutingService;
49 class SituareService;
50 class User;
51
52 /**
53 * @brief Engine class for Situare Application
54 *
55 * This class handles all the underlaying login of the Situare
56 * application.
57 */
58 class SituareEngine : public QObject
59 {
60     Q_OBJECT
61 public:
62     /**
63     * @brief Constructor
64     *
65     */
66     SituareEngine();
67
68     /**
69     * @brief Destructor
70     */
71     ~SituareEngine();
72
73 /*******************************************************************************
74  * MEMBER FUNCTIONS AND SLOTS
75  ******************************************************************************/
76 public slots:
77     /**
78     * @brief Slot to intercept error signal from ImageFetcher and SituareService
79     *
80     * @param context Error context
81     * @param error Error message
82     */
83     void error(const int context, const int error);
84
85     /**
86     * @brief Slot to intercept signal when username is fetched from settings
87     *
88     */
89     void fetchUsernameFromSettings();
90
91     /**
92     * @brief Slot to intercept signal when location search is issued
93     *
94     * @param location QString location
95     */
96     void locationSearch(QString location);
97
98     /**
99     * @brief Slot to intercept signal when Login/Logout action is pressed
100     *
101     */
102     void loginActionPressed();
103
104     /**
105     * @brief Slot to intercept signal from successful login
106     *
107     */
108     void loginOk();
109
110     /**
111     * @brief Slot to intercept signal when user has cancelled login process
112     */
113     void loginProcessCancelled();
114
115     /**
116     * @brief Changes application state when logged out
117     *
118     */
119     void logout();
120
121     /**
122     * @brief Calls reverseGeo from SituareService to translate coordinates to street address
123     *
124     */
125     void requestAddress();
126
127     /**
128     * @brief Calls updateLocation from SituareService to send the location update to
129     *        Situare server.
130     *
131     * @param status Status message
132     * @param publish Publish on Facebook
133     */
134     void requestUpdateLocation(const QString &status = QString(), bool publish = false);
135
136     /**
137     * @brief Slot to refresh user data
138     */
139     void refreshUserData();
140
141     /**
142     * @brief Slot to intercept signal from successful location update
143     *
144     */
145     void updateWasSuccessful();
146
147     /**
148     * @brief Slot to intercept signal when new user data is available.
149     *        Splits User and friendsList data and emits them as two different signals.
150     *
151     * @param user instance of User
152     * @param friendsList list of User instances (friends)
153     */
154     void userDataChanged(User *user, QList<User *> &friendsList);
155
156 private:
157     /**
158     * @brief Read settings and determine whether to use GPS and autocentering.
159     * When values does not found on the settings, GPS and autocentering are enabled as a default.
160     */
161     void initializeGpsAndAutocentering();
162
163     /**
164       * @brief Connect signals coming from Facebook authenticator
165       */
166     void signalsFromFacebookAuthenticator();
167
168     /**
169       * @brief Connect signals coming from GeocodingService
170       */
171     void signalsFromGeocodingService();
172
173     /**
174       * @brief Connect signals coming from GPS
175       */
176     void signalsFromGPS();
177
178     /**
179       * @brief Connect signals coming from MainWindow
180       */
181     void signalsFromMainWindow();
182
183     /**
184       * @brief Connect signals coming from MapEngine
185       */
186     void signalsFromMapEngine();
187
188     /**
189       * @brief Connect signals coming from MapView
190       */
191     void signalsFromMapView();
192
193     /**
194       * @brief Connect signals coming from RoutingService
195       */
196     void signalsFromRoutingService();
197
198     /**
199       * @brief Connect signals coming from Situare
200       */
201     void signalsFromSituareService();
202
203 private slots:
204     /**
205     * @brief Set auto centering feature enabled / disabled
206     *
207     * @param enabled true if enabled, false otherwise
208     */
209     void changeAutoCenteringSetting(bool enabled);
210
211     /**
212     * @brief Slot for disabling automatic centering when map is scrolled manually
213     */
214     void disableAutoCentering();
215
216     /**
217     * @brief Calls vibration feedback.
218     */
219     void draggingModeTriggered();
220
221     /**
222     * @brief Enables automatic location update.
223     *
224     * @param enabled true if enabled, false otherwise
225     * @param updateIntervalMsecs update interval in milliseconds
226     */
227     void enableAutomaticLocationUpdate(bool enabled, int updateIntervalMsecs = 0);
228
229     /**
230     * @brief Slot to intercept signal when user's/friend's image is downloaded
231     *
232     * @param user Instance of user/friend
233     */
234     void imageReady(User *user);
235
236     /**
237     * @brief Requests automatic update.
238     *
239     * Makes automatic location update request if user has moved enough.
240     *
241     * @param position geo coordinates
242     */
243     void requestAutomaticUpdateIfMoved(GeoCoordinate position);
244
245     /**
246     * @brief Requests interesting people from current map viewport.
247     *
248     * Interesting people is defined by people with same tags as user has.
249     */
250     void requestInterestingPeople();
251
252     /**
253     * @brief Route is parsed and is ready for further processing.
254     *
255     * @param route Route item containing parsed route details
256     */
257     void routeParsed(Route &route);
258
259     /**
260     * @brief Routes to geo coordinates.
261     *
262     * Uses map center coordinates as start point.
263     * @param endPointCoordinates end point geo coordinates
264     */
265     void routeTo(const GeoCoordinate &endPointCoordinates);
266
267     /**
268     * @brief Route to current cursor position
269     */
270     void routeToCursor();
271
272     /**
273     * @brief Shows contact dialog.
274     *
275     * Calls MainWindow showContactDialog with contact guid defined by contact's Facebook ID.
276     * @param facebookId contact's facebookId
277     */
278     void showContactDialog(const QString &facebookId);
279
280     /**
281     * @brief Slot for setting auto centering state.
282     *
283     * Calls gps to send last known position
284     *
285     * @param enabled true if auto centering was enabled, false otherwise
286     */
287     void setAutoCentering(bool enabled);
288
289     /**
290      * @brief Sets zoom level to default when first GPS location is received if autocentering
291      * is enabled.
292      */
293     void setFirstStartZoomLevel();
294
295     /**
296     * @brief Slot for setting GPS state.
297     *
298     * @param enabled true if gps should be enabled, false otherwise
299     */
300     void setGPS(bool enabled);
301
302     /**
303     * @brief Slot for setting power saving state.
304     *
305     * @param enabled true if enabled, false otherwise
306     */
307     void setPowerSaving(bool enabled);
308
309     /**
310     * @brief Automatic update interval timer timeout.
311     *
312     * Requests update location if user has moved.
313     */
314     void startAutomaticUpdate();
315
316     /**
317     * @brief Called when topmost window is changed
318     *
319     * Does set power saving state.
320     *
321     * @param isMainWindow True if MainWindow is the topmost one
322     */
323     void topmostWindowChanged(bool isMainWindow);
324
325 /*******************************************************************************
326  * SIGNALS
327  ******************************************************************************/
328 signals:
329     /**
330     * @brief Signals when automatic location update was enabled.
331     *
332     * @param enabled true if enabled, false otherwise
333     */
334     void automaticLocationUpdateEnabled(bool enabled);
335
336     /**
337     * @brief Signal to clear locationUpdateDialog's data
338     *
339     */
340     void clearUpdateLocationDialogData();
341
342     /**
343     * @brief Signal when direction and distance from current map center point to current GPS
344     *        location is changed
345     *
346     * @param direction Direction in degrees
347     * @param distance Distance in meters
348     * @param draw Should the indicator triangle be drawn or not
349     */
350     void directionIndicatorValuesUpdate(qreal direction, qreal distance, bool draw);
351
352     /**
353     * @brief Signals when new friends data is ready
354     *
355     * @param friendList List of User instances (friends)
356     */
357     void friendsLocationsReady(QList<User *> &friendList);
358
359     /**
360     * @brief Signals when friend's image is ready
361     *
362     * @param user Instance of friend
363     */
364     void friendImageReady(User *user);
365
366     /**
367     * @brief Emited when location request is parsed and is ready for further processing
368     *
369     * @param result List of Location items
370     */
371     void locationDataParsed(QList<Location> &result);
372
373     /**
374     * @brief Signals when new user data is ready
375     *
376     * @param user Instance of User
377     */
378     void userLocationReady(User *user);
379
380 /*******************************************************************************
381  * DATA MEMBERS
382  ******************************************************************************/
383 private:
384     bool m_autoCenteringEnabled;        ///< Auto centering flag
385     bool m_automaticUpdateFirstStart;   ///< Automatic location update first start flag
386     bool m_automaticUpdateRequest;      ///< Flag for automatic update request
387     bool m_userMoved;                   ///< Flag for user move
388
389     QTimer *m_automaticUpdateIntervalTimer; ///< Automatic update interval timer
390
391     ContactManager *m_contactManager;                ///< Instance of contact manager
392     FacebookAuthentication *m_facebookAuthenticator; ///< Instance for facebook authenticator
393     GeocodingService *m_geocodingService;            ///< Instance of the geocoding service
394     GeoCoordinate m_lastUpdatedGPSPosition;          ///< Last updated GPS position
395     GPSPosition *m_gps;                              ///< Instance of the gps position
396     MainWindow *m_ui;                                ///< Instance of the MainWindow UI
397     MapEngine *m_mapEngine;                          ///< MapEngine
398     NetworkAccessManager *m_networkAccessManager;    ///< NetworkAccessManager
399     RoutingService *m_routingService;  ///< Instance of the routing service
400     SituareService *m_situareService;  ///< Instance of the situare server communication service
401     MCE *m_mce;                        ///< Instance of the MCE
402 };
403
404 #endif // ENGINE_H