Kaj Wallin - kaj.wallin@ixonos.com
Henri Lampela - henri.lampela@ixonos.com
- Jussi Laitinen jussi.laitinen@ixonos.com
+ Jussi Laitinen - jussi.laitinen@ixonos.com
Sami Rämö - sami.ramo@ixonos.com
Situare is free software; you can redistribute it and/or
const QString SETTINGS_GPS_ENABLED = "GPS_ENABLED";
const QString SETTINGS_AUTO_CENTERING_ENABLED = "AUTO_CENTERING_ENABLED";
+ const int DEFAULT_ZOOM_LEVEL_WHEN_GPS_IS_AVAILABLE = 12;
SituareEngine::SituareEngine(QMainWindow *parent)
: QObject(parent),
connect(this, SIGNAL(friendsLocationsReady(QList<User*>&)),
m_mapEngine, SIGNAL(friendsLocationsReady(QList<User*>&)));
+ initializeGpsAndAutocentering();
+
// signals connected, now it's time to show the main window
// but init the MapEngine before so starting location is set
m_mapEngine->init();
m_ui->show();
- QSettings settings(DIRECTORY_NAME, FILE_NAME);
- QVariant gpsEnabled = settings.value(SETTINGS_GPS_ENABLED);
- QVariant autoCenteringEnabled = settings.value(SETTINGS_AUTO_CENTERING_ENABLED);
-
- // set features on / off based on settings
- changeAutoCenteringSetting(autoCenteringEnabled.toBool());
- enableGPS(gpsEnabled.toBool());
-
- // show messages at startup if features are enabled automatically
- if (gpsEnabled.toBool())
- m_ui->showMaemoInformationBox(tr("GPS enabled"));
- if (gpsEnabled.toBool() && autoCenteringEnabled.toBool())
- m_ui->showMaemoInformationBox(tr("Auto centering enabled"));
-
m_facebookAuthenticator->start();
}
enableAutoCentering(enabled);
}
+
void SituareEngine::disableAutoCentering()
{
qDebug() << __PRETTY_FUNCTION__;
void SituareEngine::fetchUsernameFromSettings()
{
qDebug() << __PRETTY_FUNCTION__;
+
m_ui->setUsername(m_facebookAuthenticator->loadUsername());
}
+ void SituareEngine::initializeGpsAndAutocentering()
+ {
+ qDebug() << __PRETTY_FUNCTION__;
+
+ QSettings settings(DIRECTORY_NAME, FILE_NAME);
+ QVariant gpsEnabled = settings.value(SETTINGS_GPS_ENABLED);
+ QVariant autoCenteringEnabled = settings.value(SETTINGS_AUTO_CENTERING_ENABLED);
+
+ if (gpsEnabled.toString().isEmpty()) { // First start. Situare.conf file does not exists
+
+ connect(m_gps, SIGNAL(position(QPointF,qreal)),
+ this, SLOT(setFirstStartZoomLevel(QPointF,qreal)));
+
+ changeAutoCenteringSetting(true);
+ enableGPS(true);
+
+ m_ui->showMaemoInformationBox(tr("GPS enabled"));
+ m_ui->showMaemoInformationBox(tr("Auto centering enabled"));
+ } else { // Normal start
+ changeAutoCenteringSetting(autoCenteringEnabled.toBool());
+ enableGPS(gpsEnabled.toBool());
+
+ if (gpsEnabled.toBool())
+ m_ui->showMaemoInformationBox(tr("GPS enabled"));
+
+ if (gpsEnabled.toBool() && autoCenteringEnabled.toBool())
+ m_ui->showMaemoInformationBox(tr("Auto centering enabled"));
+ }
+ }
+
void SituareEngine::invalidCredentials()
{
qDebug() << __PRETTY_FUNCTION__;
- m_facebookAuthenticator->clearAccountInformation(true); // keep username = true
- m_facebookAuthenticator->start();
+ m_facebookAuthenticator->clearAccountInformation(/*true*/); // keep username = true
+ //m_facebookAuthenticator->start();
+ m_ui->loginUsingCookies();
}
void SituareEngine::loginActionPressed()
}
}
-void SituareEngine::loginOk(bool freshLogin, const FacebookCredentials &credentials)
+void SituareEngine::loginOk()
{
qDebug() << __PRETTY_FUNCTION__;
m_loggedIn = true;
m_ui->loggedIn(m_loggedIn);
- if(freshLogin) {
+ if(!m_ui->username().isEmpty())
m_facebookAuthenticator->saveUsername(m_ui->username());
- }
+
m_ui->show();
- m_situareService->credentialsReady(credentials);
m_situareService->fetchLocations(); // request user locations
}
m_situareService->updateLocation(m_mapEngine->centerGeoCoordinate(), status, publish);
}
+ void SituareEngine::setFirstStartZoomLevel(QPointF latLonCoordinate, qreal accuracy)
+ {
+ qDebug() << __PRETTY_FUNCTION__;
+
+ Q_UNUSED(latLonCoordinate);
+ Q_UNUSED(accuracy);
+
+ if (m_autoCenteringEnabled) // autocentering is disabled when map is scrolled
+ m_mapEngine->setZoomLevel(DEFAULT_ZOOM_LEVEL_WHEN_GPS_IS_AVAILABLE);
+
+ disconnect(m_gps, SIGNAL(position(QPointF,qreal)),
+ this, SLOT(setFirstStartZoomLevel(QPointF,qreal)));
+ }
+
void SituareEngine::signalsFromFacebookAuthenticator()
{
qDebug() << __PRETTY_FUNCTION__;
- connect(m_facebookAuthenticator, SIGNAL(credentialsChanged(FacebookCredentials)),
+ connect(m_facebookAuthenticator, SIGNAL(credentialsReady(FacebookCredentials)),
m_situareService, SLOT(credentialsReady(FacebookCredentials)));
- connect(m_facebookAuthenticator, SIGNAL(credentialsReady(bool, FacebookCredentials)),
- this, SLOT(loginOk(bool, FacebookCredentials)));
+ connect(m_facebookAuthenticator, SIGNAL(credentialsReady(FacebookCredentials)),
+ this, SLOT(loginOk()));
connect(m_facebookAuthenticator, SIGNAL(newLoginRequest(QUrl)),
m_ui, SLOT(startLoginProcess(QUrl)));
connect(m_facebookAuthenticator, SIGNAL(loginFailure()),
m_ui, SLOT(loginFailed()));
+
+ connect(m_facebookAuthenticator, SIGNAL(saveCookiesRequest()),
+ m_ui, SLOT(saveCookies()));
+
+ connect(m_facebookAuthenticator, SIGNAL(loginUsingCookies()),
+ m_ui, SLOT(loginUsingCookies()));
}
void SituareEngine::signalsFromGPS()
connect(m_ui, SIGNAL(refreshUserData()),
this, SLOT(refreshUserData()));
+ connect(m_ui, SIGNAL(findUser(QPointF)),
+ m_mapEngine, SLOT(setViewLocation(QPointF)));
+
// signals from friend list tab
connect(m_ui, SIGNAL(findFriend(QPointF)),
m_mapEngine, SLOT(setViewLocation(QPointF)));
#define ENGINE_H
#include <QObject>
+ #include <QPointF>
class QMainWindow;
/**
* @brief Slot to intercept signal from successful login
*
- * @param freshLogin Was login done via login dialog
- * @param credentials Facebook credentials
*/
- void loginOk(bool freshLogin, const FacebookCredentials &credentials);
+ void loginOk();
/**
* @brief Slot to intercept signal when user has cancelled login process
private:
/**
+ * @brief Read settings and determine whether to use GPS and autocentering.
+ * When values does not found on the settings, GPS and autocentering are enabled as a default.
+ */
+ void initializeGpsAndAutocentering();
+
+ /**
* @brief Connect signals coming from Facdebook authenticator
*/
void signalsFromFacebookAuthenticator();
void enableGPS(bool enabled);
/**
+ * @brief Sets zoom level to default when first GPS location is received if autocentering
+ * is enabled.
+ *
+ * @param latLonCoordinate own location
+ * @param accuracy accuracy of GPS location
+ */
+ void setFirstStartZoomLevel(QPointF latLonCoordinate, qreal accuracy);
+
+ /**
* @brief Slot for intercepting signal when credentials are invalid
*
*/
MainWindow *m_ui; ///< Instance of the MainWindow UI
MapEngine *m_mapEngine; ///< MapEngine
SituareService *m_situareService; ///< Instance of the situare server communication service
-
};
#endif // ENGINE_H
# -------------------------------------------------
TARGET = ../situare
TEMPLATE = app
- INCLUDEPATH += "/usr/include/qjson"
- LIBS += "-lqjson"
+ INCLUDEPATH += /usr/include/qjson
+ LIBS += -lqjson
RESOURCES += ../images.qrc
SOURCES += main.cpp \
ui/mainwindow.cpp \
ui/zoombuttonpanel.cpp \
ui/userinfo.cpp \
ui/sidepanel.cpp \
+ networkcookiejar.cpp \
- ui/zoombutton.cpp
++ ui/zoombutton.cpp \
+ ui/zoombutton.cpp \
+ network/networkaccessmanager.cpp \
+ network/networkhandler.cpp \
+ network/networkreply.cpp
HEADERS += ui/mainwindow.h \
map/mapengine.h \
map/mapview.h \
common.h \
ui/userinfo.h \
ui/sidepanel.h \
+ networkcookiejar.h \
- ui/zoombutton.h
+ ui/zoombutton.h \
+ network/networkaccessmanager.h \
+ network/networkhandler.h \
+ network/networkreply.h
QT += network \
webkit
- #DEFINES += QT_NO_DEBUG_OUTPUT
+
+ DEFINES += QT_NO_DEBUG_OUTPUT
maemo5 | simulator {
- SOURCES += gps/gpspositionprivate.cpp
- HEADERS += gps/gpspositionprivate.h
- QT += maemo5
- CONFIG += mobility
+ INCLUDEPATH += /usr/include/glib-2.0 /usr/lib/glib-2.0/include
+ SOURCES += gps/gpspositionprivate.cpp \
+ network/networkhandlerprivate.cpp
+ HEADERS += gps/gpspositionprivate.h \
+ network/networkhandlerprivate.h
+ QT += maemo5 dbus
+ CONFIG += mobility icd2
MOBILITY = location
message([QJson])
message(Make sure you have QJson development headers installed)
message(Make sure you have QtMobility development headers installed)
message(install headers with: apt-get install libqtm-dev)
} else {
- SOURCES += gps/gpspositionprivatestub.cpp
- HEADERS += gps/gpspositionprivatestub.h
+ SOURCES += gps/gpspositionprivatestub.cpp \
+ network/networkhandlerprivatestub.cpp
+ HEADERS += gps/gpspositionprivatestub.h \
+ network/networkhandlerprivatestub.h
message(QJson built in)
message(Make sure you have QJson development headers installed)
message(install headers with: sudo apt-get install libqjson-dev)
const int N900_APP_WIDTH = 800;
const int N900_APP_HEIGHT = 449;
+
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent),
m_drawOwnLocationCrosshair(false),
m_refresh(false),
m_email(),
m_password(),
- m_loginUrl(),
- m_webView(0)
+ m_webView(0),
+ m_cookieJar(0)
{
qDebug() << __PRETTY_FUNCTION__;
this, SIGNAL(findFriend(QPointF)));
connect(m_mapView, SIGNAL(viewResized(QSize)),
- m_zoomButtonPanel, SLOT(screenResized(QSize)));
-
- connect(m_mapView, SIGNAL(viewResized(QSize)),
m_friendsListPanel, SLOT(screenResized(QSize)));
connect(this, SIGNAL(locationItemClicked(QList<QString>)),
m_friendsListPanelSidebar, SLOT(reDrawSidebar(int, int)));
}
+void MainWindow::buildLoginDialog()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ if(!m_loginDialog) {
+ m_loginDialog = new LoginDialog(this);
+
+ connect(m_loginDialog, SIGNAL(loginDialogDone(QString,QString)),
+ this, SLOT(loginDialogDone(QString,QString)));
+ }
+}
+
void MainWindow::buildManualLocationCrosshair()
{
qDebug() << __PRETTY_FUNCTION__;
m_userPanelSidebar->stackUnder(m_friendsListPanel);
m_userPanel->stackUnder(m_userPanelSidebar);
+ connect(m_userPanel, SIGNAL(findUser(QPointF)),
+ this, SIGNAL(findUser(QPointF)));
+
connect(this, SIGNAL(userLocationReady(User*)),
m_userPanel, SLOT(userDataReceived(User*)));
m_userPanel, SLOT(screenResized(QSize)));
}
+void MainWindow::buildWebView()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ if(!m_webView) {
+ m_webView = new QWebView;
+
+ connectWebViewSignals(true);
+
+ m_webView->hide();
+ }
+}
+
void MainWindow::buildZoomButtonPanel()
{
qDebug() << __PRETTY_FUNCTION__;
- m_zoomButtonPanel = new ZoomButtonPanel(this, ZOOM_BUTTON_PANEL_POSITION_X,
- ZOOM_BUTTON_PANEL_POSITION_Y);
+ m_zoomButtonPanel = new ZoomButtonPanel(this);
connect(m_zoomButtonPanel->zoomInButton(), SIGNAL(clicked()),
this, SIGNAL(zoomIn()));
connect(this, SIGNAL(minZoomLevelReached()),
m_zoomButtonPanel, SLOT(disableZoomOutButton()));
- QSettings settings(DIRECTORY_NAME, FILE_NAME);
- m_zoomButtonPanel->move(settings.value(ZOOMPANEL_POSITION,
- QPoint(ZOOM_BUTTON_PANEL_POSITION_X,
- ZOOM_BUTTON_PANEL_POSITION_Y)).toPoint());
+ connect(m_mapView, SIGNAL(viewResized(QSize)),
+ m_zoomButtonPanel, SLOT(screenResized(QSize)));
}
+void MainWindow::clearCookieJar()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ buildWebView();
+
+ if(!m_cookieJar) {
+ m_cookieJar = new NetworkCookieJar(new QNetworkCookieJar(this));
+ qDebug() << "create cookie jar";
+ }
+ QList<QNetworkCookie> emptyList;
+ emptyList.clear();
+
+ m_cookieJar->setAllCookies(emptyList);
+ m_webView->page()->networkAccessManager()->setCookieJar(m_cookieJar);
+}
+
+void MainWindow::connectWebViewSignals(bool connectSignals)
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ if(connectSignals) {
+ connect(m_webView, SIGNAL(urlChanged(const QUrl &)),
+ this, SIGNAL(updateCredentials(QUrl)));
+ connect(m_webView, SIGNAL(loadFinished(bool)),
+ this, SLOT(loadDone(bool)));
+ }
+ else {
+ disconnect(m_webView, SIGNAL(loadFinished(bool)),
+ this, SLOT(loadDone(bool)));
+ disconnect(m_webView, SIGNAL(urlChanged(const QUrl &)),
+ this, SLOT(updateCredentials(const QUrl &)));
+ }
+}
+
void MainWindow::createMenus()
{
qDebug() << __PRETTY_FUNCTION__;
QWidget::keyPressEvent(event);
}
+void MainWindow::loadCookies()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ QSettings settings(DIRECTORY_NAME, FILE_NAME);
+
+ QString cookies = settings.value(COOKIES, EMPTY).toString();
+ if(!cookies.isEmpty()) {
+ QStringList list = cookies.split("|");
+ QList<QNetworkCookie> cookieList;
+
+ for(int i=0;i<list.count();i++) {
+ QNetworkCookie tmpCookie;
+ QList<QNetworkCookie> parserList = tmpCookie.parseCookies(list.at(i).toAscii());
+ cookieList.append(parserList.at(0));
+ }
+ if(!m_cookieJar) {
+ m_cookieJar = new NetworkCookieJar(new QNetworkCookieJar(this));
+ qDebug() << "create cookie jar";
+ }
+
+ m_cookieJar->setAllCookies(cookieList);
+ m_webView->page()->networkAccessManager()->setCookieJar(m_cookieJar);
+ }
+}
+
void MainWindow::loadDone(bool done)
{
qDebug() << __PRETTY_FUNCTION__;
m_loginAct->setText(tr("Logout"));
}
else {
+ clearCookieJar();
+ m_email.clear();
+ m_password.clear();
+
+ if(m_loginDialog)
+ m_loginDialog->clearTextFields();
+
m_loginAct->setText(tr("Login"));
}
showPanels(m_loggedIn);
{
qDebug() << __PRETTY_FUNCTION__;
- m_email.clear();
- m_password.clear();
+ emit fetchUsernameFromSettings();
toggleProgressIndicator(false);
#endif // Q_WS_MAEMO_5
+ buildLoginDialog();
+
if(!m_email.isEmpty()) {
m_loginDialog->setEmailField(m_email);
}
// if login dialog was canceled we need to stop processing webview
// stop and disconnect m_webView;
m_webView->stop();
- disconnect(m_webView, SIGNAL(loadFinished(bool)),
- this, SLOT(loadDone(bool)));
- disconnect(m_webView, SIGNAL(urlChanged(const QUrl &)),
- this, SLOT(updateCredentials(const QUrl &)));
+ connectWebViewSignals(false);
emit cancelLoginProcess();
}
else {
// re-load login page for webview
toggleProgressIndicator(true);
- m_webView->load(m_loginUrl);
+
+ // connect webview signals again since they might have been disconnected
+ connectWebViewSignals(true);
+
+ QStringList urlParts;
+ urlParts.append(FACEBOOK_LOGINBASE);
+ urlParts.append(SITUARE_PUBLIC_FACEBOOKAPI_KEY);
+ urlParts.append(INTERVAL1);
+ urlParts.append(SITUARE_LOGIN_SUCCESS);
+ urlParts.append(INTERVAL2);
+ urlParts.append(SITUARE_LOGIN_FAILURE);
+ urlParts.append(FACEBOOK_LOGIN_ENDING);
+
+ m_webView->load(QUrl(urlParts.join(EMPTY)));
}
}
+void MainWindow::loginUsingCookies()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ buildWebView();
+ loadCookies();
+
+ QStringList urlParts;
+ urlParts.append(FACEBOOK_LOGINBASE);
+ urlParts.append(SITUARE_PUBLIC_FACEBOOKAPI_KEY);
+ urlParts.append(INTERVAL1);
+ urlParts.append(SITUARE_LOGIN_SUCCESS);
+ urlParts.append(INTERVAL2);
+ urlParts.append(SITUARE_LOGIN_FAILURE);
+ urlParts.append(FACEBOOK_LOGIN_ENDING);
+
+ m_webView->load(QUrl(urlParts.join(EMPTY)));
+
+}
+
void MainWindow::openSettingsDialog()
{
qDebug() << __PRETTY_FUNCTION__;
dialog->show();
}
+void MainWindow::saveCookies()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ if(!m_cookieJar)
+ m_cookieJar = new NetworkCookieJar(new QNetworkCookieJar(this));
+
+ QList<QNetworkCookie> cookieList = m_cookieJar->allCookies();
+ QStringList list;
+
+ for(int i=0;i<cookieList.count();i++) {
+ QNetworkCookie cookie = cookieList.at(i);
+ QByteArray byteArray = cookie.toRawForm(QNetworkCookie::Full);
+ list.append(QString(byteArray));
+ }
+ QSettings settings(DIRECTORY_NAME, FILE_NAME);
+
+ settings.setValue(COOKIES, list.join("|"));
+}
+
void MainWindow::setAutoCenteringButtonEnabled(bool enabled)
{
qDebug() << __PRETTY_FUNCTION__;
{
qDebug() << __PRETTY_FUNCTION__;
- m_loginUrl = url;
- m_webView = new QWebView;
- m_loginDialog = new LoginDialog(this);
-
- connect(m_webView, SIGNAL(urlChanged(const QUrl &)),
- this, SIGNAL(updateCredentials(QUrl)));
- connect(m_webView, SIGNAL(loadFinished(bool)),
- this, SLOT(loadDone(bool)));
+ buildWebView();
+ buildLoginDialog();
- connect(m_loginDialog, SIGNAL(loginDialogDone(QString,QString)),
- this, SLOT(loginDialogDone(QString,QString)));
+ emit fetchUsernameFromSettings();
- m_webView->hide();
+ if(!m_cookieJar)
+ m_cookieJar = new NetworkCookieJar(new QNetworkCookieJar(this));
- emit fetchUsernameFromSettings();
+ m_webView->page()->networkAccessManager()->setCookieJar(m_cookieJar);
if(!m_email.isEmpty()) {
m_loginDialog->setEmailField(m_email);
// if login dialog was canceled we need to stop processing webview
// stop and disconnect m_webView;
m_webView->stop();
- disconnect(m_webView, SIGNAL(loadFinished(bool)),
- this, SLOT(loadDone(bool)));
- disconnect(m_webView, SIGNAL(urlChanged(const QUrl &)),
- this, SLOT(updateCredentials(const QUrl &)));
+ connectWebViewSignals(false);
emit cancelLoginProcess();
}
else {
- m_webView->load(m_loginUrl);
+ // connect webview signals again since they might have been disconnected
+ connectWebViewSignals(true);
+
+ m_webView->load(url);
toggleProgressIndicator(true);
m_refresh = true;
}
#include <QtGui/QMainWindow>
#include <QUrl>
+#include "networkcookiejar.h"
#include "panelsidebar.h"
class QGraphicsScene;
void loginFailed();
/**
+ * @brief Slot to intercept signal when login with cookies is requested
+ *
+ */
+ void loginUsingCookies();
+
+ /**
* @brief Public slot, which open settings dialog
*/
void openSettingsDialog();
void buildFriendListPanel();
/**
+ * @brief Build login dialog and connect slots
+ *
+ */
+ void buildLoginDialog();
+
+ /**
* @brief Build manual location setting cross hair and connect slots
*/
void buildManualLocationCrosshair();
void buildUserInfoPanel();
/**
+ * @brief Build webview and connect slots
+ *
+ */
+ void buildWebView();
+
+ /**
* @brief Build zoom button panel and connect slots
*/
void buildZoomButtonPanel();
/**
+ * @brief Clears cookie jar
+ *
+ */
+ void clearCookieJar();
+
+ /**
+ * @brief connect/disconnect webview signals
+ *
+ * @param connectSignals true = connect, false = disconnect
+ */
+ void connectWebViewSignals(bool connectSignals);
+
+ /**
* @brief Private method to create the Menu items
*/
void createMenus();
void gpsTimeout();
/**
+ * @brief Slot to load cookies from settings
+ *
+ */
+ void loadCookies();
+
+ /**
* @brief Slot to intercept signal when webview has finished loading webpage
*
* @param done Status of the loading
void loadDone(bool done);
/**
+ * @brief Slot to save cookies to settings
+ *
+ */
+ void saveCookies();
+
+ /**
* @brief Set correnct view port size to datamembers
*
* @param width Width of the viewport
void fetchUsernameFromSettings();
/**
+ * @brief Signal for finding user.
+ *
+ * @param coordinates user geo coordinates
+ */
+ void findUser(const QPointF &coordinates);
+
+ /**
* @brief GPS setting changed
*
* @param enabled True if GPS is enabled, otherwise false
QString m_email; ///< Placeholder for email
QString m_password; ///< Placeholder for password
- QUrl m_loginUrl; ///< Placeholder for login page url
-
QWebView *m_webView; ///< Shows facebook login page
FriendListPanel *m_friendsListPanel; ///< Instance of friends list panel
LoginDialog *m_loginDialog; ///< Login dialog
MapView *m_mapView; ///< Instance of the map view
+ NetworkCookieJar *m_cookieJar; ///< Placeholder for QNetworkCookies
PanelSideBar *m_userPanelSidebar; ///< User panel side bar
PanelSideBar *m_friendsListPanelSidebar;///< Friends panel side bar
UserInfoPanel *m_userPanel; ///< Instance of the user information panel