Bump version to 0.9.0
[quandoparte] / application / app.cpp
index 83a4aa7..26f0076 100644 (file)
@@ -20,10 +20,12 @@ Boston, MA 02110-1301, USA.
 */
 
 #include "app.h"
+#include "dataprovider.h"
 #include "stationview.h"
 #include "stationlistmodel.h"
 #include "stationlistview.h"
 #include "settingsdialog.h"
+#include "settings.h"
 
 #include <QDebug>
 #include <QMessageBox>
@@ -32,6 +34,7 @@ Boston, MA 02110-1301, USA.
 #include <QNetworkRequest>
 #include <QObject>
 #include <QSettings>
+#include <QTimer>
 #include <QUrl>
 
 #include <QGeoPositionInfoSource>
@@ -43,18 +46,19 @@ QTM_USE_NAMESPACE
 
 App::App(QObject *parent) :
     QObject(parent),
-    accessManager(new QNetworkAccessManager(this)),
-    positionInfoSource(QGeoPositionInfoSource::createDefaultSource(this)),
+    dataProvider(new DataProvider(this)),
+    checkingTimer(new QTimer(this)),
     stationView(new StationView()),
     stationListModel(new StationListModel(this)),
     stationListView(new StationListView(stationListModel, stationView))
 {
-    stationListModel->load(dataDir() + "stations/stations.qpl");
+    stationListModel->load("stations:stations.qpl");
 
-    connect(positionInfoSource, SIGNAL(positionUpdated(QGeoPositionInfo)),
-            stationListView, SLOT(updatePosition(QGeoPositionInfo)));
-    connect(stationListView, SIGNAL(stationSelected(const QString &)),
-            SLOT(queryStation(const QString &)));
+    connect(dataProvider, SIGNAL(stationScheduleReady(QByteArray, QUrl)),
+            SLOT(downloadFinished(QByteArray)));
+
+    connect(stationListView, SIGNAL(stationSelected(QString)),
+            SLOT(queryStation(QString)));
 
     connect(stationListView, SIGNAL(aboutTriggered()),
             SLOT(showAboutDialog()));
@@ -72,40 +76,28 @@ App::App(QObject *parent) :
     readSettings();
 
     qDebug() << "found" << stationListModel->rowCount() << "stations";
-#if defined(Q_WS_S60)
-    stationView->showMaximized();
-#else
-    stationView->show();
-#endif
 
-    if (recentStations.isEmpty()) {
-#if defined(Q_WS_S60)
-        stationListView->showMaximized();
-#else
+    connect(checkingTimer, SIGNAL(timeout()), SLOT(updateStation()));
+    stationView->show();
+    Settings *settings = Settings::instance();
+    if (settings->recentStations().isEmpty() || !settings->stationViewPreferred()) {
         stationListView->show();
-#endif
     } else {
-        queryStation(recentStations.front());
+        updateStation();
     }
-
-    // Testing only: start updates rigt away.
-    positionInfoSource->startUpdates();
 }
 
 App::~App()
 {
-    delete stationView;
     saveSettings();
+    disconnect();
+    delete stationView;
 }
 
-void App::downloadFinished(void)
+void App::downloadFinished(const QByteArray &data)
 {
-    disconnect(stationQueryReply, SIGNAL(finished()),
-               this, SLOT(downloadFinished()));
-    stationView->updateView(stationQueryReply->readAll());
+    stationView->updateView(data);
     stationListView->hide();
-    stationQueryReply->deleteLater();
-    stationQueryReply = 0;
 #ifdef Q_WS_MAEMO_5
     stationListView->setAttribute(Qt::WA_Maemo5ShowProgressIndicator, false);
 #endif
@@ -113,30 +105,26 @@ void App::downloadFinished(void)
 
 void App::queryStation(const QString &station)
 {
-    QNetworkRequest request;
-    request.setUrl(queryBaseUrl);
-    const QString queryString = "stazione=" + station;
-    const QByteArray query(queryString.toLocal8Bit());
-    stationQueryReply = accessManager->post(request, query);
-    connect(stationQueryReply, SIGNAL(finished()),
-            this, SLOT(downloadFinished()));
-    recentStations.push_front(station);
-    recentStations.removeDuplicates();
-    if (recentStations.count() > RECENT_STATIONS_MAX_COUNT) {
-        recentStations.pop_back();
-    }
+    dataProvider->stationSchedule(station);
 #ifdef Q_WS_MAEMO_5
     stationListView->setAttribute(Qt::WA_Maemo5ShowProgressIndicator, true);
 #endif
 }
 
+void App::updateStation()
+{
+    if (!stationListView->isVisible()) {
+        dataProvider->updateStation();
+    }
+}
+
 void App::showSettingsDialog()
 {
     qDebug() << "Settings Dialog called";
 
     SettingsDialog *dialog = new SettingsDialog(stationView);
     if (dialog->exec() == QDialog::Accepted) {
-        // TODO Use new settings
+        readSettings();
     }
     delete dialog;
 }
@@ -147,10 +135,18 @@ void App::showAboutDialog()
     QString name = QApplication::instance()->applicationName();
     QString version = QApplication::instance()->applicationVersion();
     QString aboutText = QString(
-                tr("<p>%1 version %2</p>"
+                tr("<h2>"
+                   "<a href='http://quandoparte.garage.maemo.org'>%1</a> version %2"
+                   "</h2>"
                    "<p>Copyright (c) 2010, 2011</p>"
                    "<p>Luciano Montanaro (mikelima@cirulla.net)</p>"
-                   "<p>Licensed under the GNU Public License v2 or above</p>")).arg(name).arg(version);
+                   "<p>Licensed under the GNU Public License v2 or above</p>"
+                   "<p>Station geolocation data from "
+                   "<a href='http://www.openstreetmap.org'>OpenStreetMap</a>"
+                   "</p>"
+                   "<p>Realtime train data from "
+                   "<a href='http://mobile.viaggiatreno.it'>Viaggiatreno</a>"
+                   "</p>")).arg(name).arg(version);
     QMessageBox::about(stationView, name, aboutText);
 }
 
@@ -161,31 +157,30 @@ void App::showStationSelectView(void)
 
 void App::readSettings(void)
 {
-    QSettings settings;
-    queryBaseUrl = settings.value("QueryURL",
-                                  "http://mobile.viaggiatreno.it/viaggiatreno/mobile/stazione").toString();
-    stationView->setBaseUrl(queryBaseUrl);
-
-    recentStations = settings.value("RecentStations").toString().split(",");
-    checkingInterval = settings.value("CheckInterval", 2000).toInt();
+    Settings *settings = Settings::instance();
+    stationView->setBaseUrl(settings->queryBaseUrl() + "stazione");
+
+    /*
+       I would use > 0 here, but people may have an old settings file with a 2
+       seconds timeout which is way too short.
+       As a workaround I consider anything less than 30 seconds as too short
+       and disable the timer.
+    */
+    if (settings->checkingInterval() > 30000) {
+        checkingTimer->setInterval(settings->checkingInterval());
+        checkingTimer->start();
+    } else {
+        checkingTimer->setInterval(-1);
+        checkingTimer->stop();
+    }
 }
 
 void App::saveSettings(void)
 {
-    QSettings settings;
-
-    qDebug() << "Saving Settings to" << settings.fileName();
-
-    settings.setValue("QueryURL", queryBaseUrl);
-    settings.setValue("RecentStations", recentStations.join(","));
-    settings.setValue("CheckInterval", checkingInterval);
+    Settings::instance()->save();
 }
 
 QString App::dataDir(void)
 {
-#ifdef Q_WS_MAEMO_5
-    return QString("/opt/usr/share/apps/quandoparte/");
-#else
-    return QString("/usr/share/apps/quandoparte/");
-#endif
+    return QString(DATADIR);
 }