Added confirmation dialog to automatic location update feature.
[situare] / src / ui / mainwindow.cpp
index 63d3a1d..80dd084 100644 (file)
 #include <QtGui>
 #include <QtWebKit>
 
-#ifdef Q_WS_MAEMO_5
-#include <QtMaemo5/QMaemo5InformationBox>
-#endif // Q_WS_MAEMO_5
-
 #include "common.h"
 #include "facebookservice/facebookauthentication.h"
 #include "friendlistpanel.h"
 
 #include "mainwindow.h"
 
+// These MUST BE HERE, compiling for Maemo fails if moved
+#ifdef Q_WS_MAEMO_5
+#include <QtMaemo5/QMaemo5InformationBox>
 #include <QtGui/QX11Info>
-#include <X11/Xlib.h>
 #include <X11/Xatom.h>
+#include <X11/Xlib.h>
+#endif // Q_WS_MAEMO_5
 
 // values for setting screen size in desktop matching N900 screen size
 const int N900_APP_WIDTH = 800;
@@ -54,10 +54,12 @@ MainWindow::MainWindow(QWidget *parent)
     m_drawOwnLocationCrosshair(false),
     m_loggedIn(false),
     m_refresh(false),
+    m_ownLocationCrosshair(0),
     m_email(),    
     m_password(),
-    m_loginUrl(),
-    m_webView(0)
+    m_fullScreenButton(0),
+    m_webView(0),
+    m_cookieJar(0)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
@@ -73,12 +75,21 @@ MainWindow::MainWindow(QWidget *parent)
     buildFriendListPanel();
     buildUserInfoPanel();
 
+    m_settingsDialog = new SettingsDialog(this);
+    m_settingsDialog->hide();
+    connect(m_settingsDialog, SIGNAL(enableAutomaticLocationUpdate(bool,int)),
+            this, SIGNAL(enableAutomaticLocationUpdate(bool,int)));
+
     createMenus();
     setWindowTitle(tr("Situare"));
 
     // set stacking order of widgets
     m_zoomButtonPanel->stackUnder(m_userPanel);
-    m_osmLicense->stackUnder(m_zoomButtonPanel);
+    if(m_fullScreenButton) {
+        m_fullScreenButton->stackUnder(m_zoomButtonPanel);
+        m_osmLicense->stackUnder(m_fullScreenButton);
+    } else
+        m_osmLicense->stackUnder(m_zoomButtonPanel);
     m_ownLocationCrosshair->stackUnder(m_osmLicense);
     m_mapView->stackUnder(m_ownLocationCrosshair);
 
@@ -100,6 +111,24 @@ MainWindow::~MainWindow()
         delete m_webView;
 }
 
+void MainWindow::automaticLocationUpdateEnabled(bool enabled)
+{
+    m_settingsDialog->setAutomaticLocationUpdateSettings(enabled);
+}
+
+void MainWindow::buildFullScreenButton()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+#ifdef Q_WS_MAEMO_5
+    m_fullScreenButton = new QToolButton(this);
+    m_fullScreenButton->setIcon(QIcon::fromTheme(QLatin1String("general_fullsize")));
+    m_fullScreenButton->setFixedSize(m_fullScreenButton->sizeHint());
+    connect(m_fullScreenButton, SIGNAL(clicked()),
+            this, SLOT(toggleFullScreen()));
+#endif // Q_WS_MAEMO_5
+
+}
+
 void MainWindow::buildFriendListPanel()
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -116,9 +145,6 @@ void MainWindow::buildFriendListPanel()
             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>)),
@@ -150,10 +176,9 @@ void MainWindow::buildMap()
     m_mapView = new MapView(this);
 
     buildZoomButtonPanel();
-
-    m_ownLocationCrosshair = 0;
     buildOsmLicense();
     buildManualLocationCrosshair();
+    buildFullScreenButton();
 
     connect(m_mapView, SIGNAL(viewScrolled(QPoint)),
             this, SIGNAL(mapViewScrolled(QPoint)));
@@ -164,6 +189,9 @@ void MainWindow::buildMap()
     connect(m_mapView, SIGNAL(viewResized(QSize)),
             this, SIGNAL(mapViewResized(QSize)));
 
+    connect(m_mapView, SIGNAL(viewResized(QSize)),
+            this, SLOT(drawFullScreenButton(QSize)));
+
     connect(m_mapView, SIGNAL(viewResizedNewSize(int, int)),
              this, SLOT(setViewPortSize(int, int)));
 
@@ -222,12 +250,27 @@ void MainWindow::buildUserInfoPanel()
             m_userPanel, SLOT(screenResized(QSize)));
 }
 
+void MainWindow::buildWebView()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if(!m_webView) {
+        m_webView = new QWebView;
+
+        connect(m_webView, SIGNAL(urlChanged(const QUrl &)),
+                this, SIGNAL(updateCredentials(QUrl)));
+        connect(m_webView, SIGNAL(loadFinished(bool)),
+                this, SLOT(loadDone(bool)));
+
+        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()));
@@ -244,10 +287,24 @@ void MainWindow::buildZoomButtonPanel()
     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));
+    }
+    QList<QNetworkCookie> emptyList;
+    emptyList.clear();
+
+    m_cookieJar->setAllCookies(emptyList);
+    m_webView->page()->networkAccessManager()->setCookieJar(m_cookieJar);
 }
 
 void MainWindow::createMenus()
@@ -286,6 +343,17 @@ void MainWindow::createMenus()
     m_viewMenu->setObjectName(tr("Menu"));
 }
 
+void MainWindow::drawFullScreenButton(const QSize &size)
+{
+    qDebug() << __PRETTY_FUNCTION__ << size.width() << "x" << size.height();
+
+    if(m_fullScreenButton) {
+        m_fullScreenButton->move(size.width() - m_fullScreenButton->size().width()
+                                 - PANEL_PEEK_AMOUNT,
+                                 size.height() - m_fullScreenButton->size().height());
+    }
+}
+
 void MainWindow::drawOsmLicense(const QSize &size)
 {
     qDebug() << __PRETTY_FUNCTION__ << size.width() << "x" << size.height();
@@ -293,7 +361,6 @@ void MainWindow::drawOsmLicense(const QSize &size)
     m_osmLicense->move(size.width() - m_osmLicense->fontMetrics().width(OSM_LICENSE)
                        - PANEL_PEEK_AMOUNT,
                        size.height() - m_osmLicense->fontMetrics().height());
-
 }
 
 void MainWindow::drawOwnLocationCrosshair(int width, int height)
@@ -306,13 +373,6 @@ void MainWindow::drawOwnLocationCrosshair(int width, int height)
     }
 }
 
-void MainWindow::gpsError(const QString &message)
-{
-    qDebug() << __PRETTY_FUNCTION__;
-
-    showMaemoInformationBox(message);
-}
-
 void MainWindow::gpsTimeout()
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -365,6 +425,29 @@ void MainWindow::keyPressEvent(QKeyEvent* event)
     QWidget::keyPressEvent(event);
 }
 
+void MainWindow::loadCookies()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    QSettings settings(DIRECTORY_NAME, FILE_NAME);
+
+    QStringList list = settings.value(COOKIES, EMPTY).toStringList();
+
+    if(!list.isEmpty()) {
+        QList<QNetworkCookie> cookieList;
+        for(int i=0;i<list.count();i++) {
+            cookieList.append(QNetworkCookie::parseCookies(list.at(i).toAscii()));
+        }
+
+        if(!m_cookieJar)
+               m_cookieJar = new NetworkCookieJar(new QNetworkCookieJar(this));
+
+        m_cookieJar->setAllCookies(cookieList);
+        m_webView->page()->networkAccessManager()->setCookieJar(m_cookieJar);
+
+    }
+}
+
 void MainWindow::loadDone(bool done)
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -419,65 +502,82 @@ void MainWindow::loggedIn(bool logged)
         m_loginAct->setText(tr("Logout"));
     }
     else {
+        clearCookieJar();
+        m_email.clear();
+        m_password.clear();
+
         m_loginAct->setText(tr("Login"));
     }
-    showPanels(m_loggedIn);
-}
-
-void MainWindow::loginDialogDone(const QString &email, const QString &password)
-{
-    qDebug() << __PRETTY_FUNCTION__;
-
-    m_email = email;
-    m_password = password;
+    updateItemVisibility(m_loggedIn);
 }
 
 void MainWindow::loginFailed()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    m_email.clear();
-    m_password.clear();
+    clearCookieJar();
 
     toggleProgressIndicator(false);
 
-#ifdef Q_WS_MAEMO_5
-    QMaemo5InformationBox::information(this, tr("Invalid E-mail address or password"),
-                                       QMaemo5InformationBox::NoTimeout);
+    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);
 
-#endif // Q_WS_MAEMO_5
+    startLoginProcess(urlParts.join(EMPTY));
+}
 
-    if(!m_email.isEmpty()) {
-        m_loginDialog->setEmailField(m_email);
-    }
+void MainWindow::loginUsingCookies()
+{
+    qDebug() << __PRETTY_FUNCTION__;
 
-    if(m_loginDialog->exec() != QDialog::Accepted) {
-        // 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 &)));
+    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)));
 
-        emit cancelLoginProcess();
-    }
-    else {
-        // re-load login page for webview
-        toggleProgressIndicator(true);
-        m_webView->load(m_loginUrl);
-    }
 }
 
 void MainWindow::openSettingsDialog()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    SettingsDialog *dialog = new SettingsDialog(this);
-    if(!m_loggedIn) {
-        dialog->disableSituareSettings();
+    m_settingsDialog->enableSituareSettings(m_gpsToggleAct->isChecked() && m_loggedIn);
+    m_settingsDialog->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));
     }
-    dialog->show();
+    list.removeDuplicates();
+
+    QSettings settings(DIRECTORY_NAME, FILE_NAME);
+    settings.setValue(COOKIES, list);
 }
 
 void MainWindow::setAutoCenteringButtonEnabled(bool enabled)
@@ -492,7 +592,10 @@ void MainWindow::setGPSButtonEnabled(bool enabled)
     qDebug() << __PRETTY_FUNCTION__;
 
     m_gpsToggleAct->setChecked(enabled);
-    setOwnLocationCrosshairVisibility(!enabled);
+
+    if(m_loggedIn)
+        setOwnLocationCrosshairVisibility(!enabled);
+
     m_autoCenteringAct->setVisible(enabled);
 }
 
@@ -521,6 +624,7 @@ void MainWindow::setOwnLocationCrosshairVisibility(bool visibility)
 void MainWindow::setUsername(const QString &username)
 {
     qDebug() << __PRETTY_FUNCTION__;
+
     m_email = username;
 }
 
@@ -532,73 +636,77 @@ void MainWindow::setViewPortSize(int width, int height)
     m_viewPortHeight = height;
 }
 
-void MainWindow::showMaemoInformationBox(const QString &message)
+bool MainWindow::showEnableAutomaticUpdateLocationDialog()
+{
+    QMessageBox msgBox(QMessageBox::Warning, tr("Automatic location update"),
+                       tr("Are you sure you want to enable automatic location update?"),
+                       QMessageBox::Ok | QMessageBox::Cancel, 0);
+    msgBox.button(QMessageBox::Ok)->setText(tr("Ok"));
+    int ret = msgBox.exec();
+
+    if (ret == QMessageBox::Ok)
+        return true;
+    else
+        return false;
+}
+
+void MainWindow::showMaemoInformationBox(const QString &message, bool modal)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
 #ifdef Q_WS_MAEMO_5
-    QMaemo5InformationBox::information(this, message, QMaemo5InformationBox::DefaultTimeout);
+    if(modal) {
+        QMaemo5InformationBox::information(this, message, QMaemo5InformationBox::NoTimeout);
+    }
+    else {
+        QMaemo5InformationBox::information(this, message, QMaemo5InformationBox::DefaultTimeout);
+    }
 #else
-    Q_UNUSED(message);
+    Q_UNUSED(modal);
+    QMessageBox::information(this, tr("Situare"), message, QMessageBox::Ok);
 #endif
 }
 
-void MainWindow::showPanels(bool show)
+void MainWindow::toggleFullScreen()
 {
     qDebug() << __PRETTY_FUNCTION__;
-    if(show) {
-        m_friendsListPanel->show();
-        m_friendsListPanelSidebar->show();
-        m_userPanel->show();
-        m_userPanelSidebar->show();
-    }
-    else {
-        m_friendsListPanel->closePanel();
-        m_friendsListPanel->hide();
-        m_friendsListPanelSidebar->hide();
-        m_userPanel->closePanel();
-        m_userPanel->hide();
-        m_userPanelSidebar->hide();
-    }
+
+    if(windowState() == Qt::WindowNoState)
+        showFullScreen();
+    else
+        showNormal();
 }
 
 void MainWindow::startLoginProcess(const QUrl &url)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    m_loginUrl = url;
-    m_webView = new QWebView;
-    m_loginDialog = new LoginDialog(this);
+    buildWebView();
 
-    connect(m_webView, SIGNAL(urlChanged(const QUrl &)),
-            this, SIGNAL(updateCredentials(QUrl)));
-    connect(m_webView, SIGNAL(loadFinished(bool)),
-            this, SLOT(loadDone(bool)));
+    LoginDialog loginDialog;
 
-    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);
-    }
+    loginDialog.clearTextFields();
+
+    if(!m_email.isEmpty())
+        loginDialog.setEmailField(m_email);
 
-    if(m_loginDialog->exec() != QDialog::Accepted) {
+    if(loginDialog.exec() != QDialog::Accepted) {
         // 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 &)));
 
         emit cancelLoginProcess();
     }
     else {
-        m_webView->load(m_loginUrl);
+        loginDialog.userInput(m_email, m_password);
+        emit saveUsername(m_email);
+        m_webView->load(url);
         toggleProgressIndicator(true);
         m_refresh = true;
     }
@@ -615,8 +723,36 @@ void MainWindow::toggleProgressIndicator(bool value)
 #endif // Q_WS_MAEMO_5
 }
 
+void MainWindow::updateItemVisibility(bool show)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+    
+    if(show) {
+        m_friendsListPanel->show();
+        m_friendsListPanelSidebar->show();
+        m_userPanel->show();
+        m_userPanelSidebar->show();
+
+        if(m_drawOwnLocationCrosshair) {
+            m_ownLocationCrosshair->show();
+            setGPSButtonEnabled(false);
+            emit gpsTriggered(false);
+        }
+    }
+    else {
+        m_friendsListPanel->closePanel();
+        m_friendsListPanel->hide();
+        m_friendsListPanelSidebar->hide();
+        m_userPanel->closePanel();
+        m_userPanel->hide();
+        m_userPanelSidebar->hide();
+        m_ownLocationCrosshair->hide();       
+    }
+}
+
 const QString MainWindow::username()
 {
     qDebug() << __PRETTY_FUNCTION__;
+    
     return m_email;
 }