From 642eae96cb03469ee8a0fcc14368fd2106894543 Mon Sep 17 00:00:00 2001 From: Alejandro Martinez Date: Sat, 2 Mar 2024 19:02:30 -0300 Subject: [PATCH] Deprecate Today's Plan integration Fixes #4450 --- appveyor.yml | 3 -- {src/Cloud => deprecated}/TodaysPlan.cpp | 0 {src/Cloud => deprecated}/TodaysPlan.h | 0 .../TodaysPlanBodyMeasures.cpp | 0 .../TodaysPlanBodyMeasures.h | 0 src/Charts/OverviewItems.cpp | 2 +- src/Cloud/MeasuresDownload.cpp | 26 ------------- src/Cloud/MeasuresDownload.h | 6 +-- src/Cloud/OAuthDialog.cpp | 36 +----------------- src/Cloud/OAuthDialog.h | 1 - src/Core/Measures.cpp | 2 - src/Core/Measures.h | 2 +- src/Core/Secrets.h | 4 -- src/Core/Settings.h | 10 ----- src/Gui/MainWindow.cpp | 24 ------------ src/Gui/MainWindow.h | 1 - src/Resources/application.qrc | 1 - src/Resources/images/services/todaysplan.png | Bin 29156 -> 0 bytes src/Train/TrainSidebar.cpp | 3 -- src/src.pro | 14 +------ travis/linux/before_script.sh | 1 - travis/osx/before_script.sh | 1 - 22 files changed, 7 insertions(+), 130 deletions(-) rename {src/Cloud => deprecated}/TodaysPlan.cpp (100%) rename {src/Cloud => deprecated}/TodaysPlan.h (100%) rename {src/Cloud => deprecated}/TodaysPlanBodyMeasures.cpp (100%) rename {src/Cloud => deprecated}/TodaysPlanBodyMeasures.h (100%) delete mode 100644 src/Resources/images/services/todaysplan.png diff --git a/appveyor.yml b/appveyor.yml index 842d85536..a497b2fb6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -21,8 +21,6 @@ environment: secure: 7pCVnVEKKmSU4SZN6IFqUw== GC_STRAVA_CLIENT_SECRET: secure: n3cMS1yy709xhSnTeWABMsoAIkJzy5euh3Pw4ehv0BzszJKoWkypF0cyW8RXSm3M - GC_TODAYSPLAN_CLIENT_SECRET: - secure: 7PnFB8cfahFT6LyP64eB7N1vkbwVaULpB2ORmEkn+J75zNB1xxGClFNXSHZ7kXhB GC_CYCLINGANALYTICS_CLIENT_SECRET: secure: UY+m3YypNNLUzKyGdrLw8xdCvxuQWRZi9EHS3j1ubLC4qyRL7iEVW6ubumfdh6gT GC_CLOUD_DB_BASIC_AUTH: @@ -151,7 +149,6 @@ before_build: - ps: (Get-Content src\Core\Secrets.h) -replace '__GC_NOKIA_CLIENT_SECRET__', $env:GC_NOKIA_CLIENT_SECRET | Set-Content src\Core\Secrets.h - ps: (Get-Content src\Core\Secrets.h) -replace '__GC_DROPBOX_CLIENT_SECRET__', $env:GC_DROPBOX_CLIENT_SECRET | Set-Content src\Core\Secrets.h - ps: (Get-Content src\Core\Secrets.h) -replace '__GC_STRAVA_CLIENT_SECRET__', $env:GC_STRAVA_CLIENT_SECRET | Set-Content src\Core\Secrets.h -- ps: (Get-Content src\Core\Secrets.h) -replace '__GC_TODAYSPLAN_CLIENT_SECRET__', $env:GC_TODAYSPLAN_CLIENT_SECRET | Set-Content src\Core\Secrets.h - ps: (Get-Content src\Core\Secrets.h) -replace '__GC_CYCLINGANALYTICS_CLIENT_SECRET__', $env:GC_CYCLINGANALYTICS_CLIENT_SECRET | Set-Content src\Core\Secrets.h - ps: (Get-Content src\Core\Secrets.h) -replace '__GC_CLOUD_DB_BASIC_AUTH__', $env:GC_CLOUD_DB_BASIC_AUTH | Set-Content src\Core\Secrets.h - ps: (Get-Content src\Core\Secrets.h) -replace '__GC_CLOUD_DB_APP_NAME__', $env:GC_CLOUD_DB_APP_NAME | Set-Content src\Core\Secrets.h diff --git a/src/Cloud/TodaysPlan.cpp b/deprecated/TodaysPlan.cpp similarity index 100% rename from src/Cloud/TodaysPlan.cpp rename to deprecated/TodaysPlan.cpp diff --git a/src/Cloud/TodaysPlan.h b/deprecated/TodaysPlan.h similarity index 100% rename from src/Cloud/TodaysPlan.h rename to deprecated/TodaysPlan.h diff --git a/src/Cloud/TodaysPlanBodyMeasures.cpp b/deprecated/TodaysPlanBodyMeasures.cpp similarity index 100% rename from src/Cloud/TodaysPlanBodyMeasures.cpp rename to deprecated/TodaysPlanBodyMeasures.cpp diff --git a/src/Cloud/TodaysPlanBodyMeasures.h b/deprecated/TodaysPlanBodyMeasures.h similarity index 100% rename from src/Cloud/TodaysPlanBodyMeasures.h rename to deprecated/TodaysPlanBodyMeasures.h diff --git a/src/Charts/OverviewItems.cpp b/src/Charts/OverviewItems.cpp index 8388e935b..fc683dbb9 100644 --- a/src/Charts/OverviewItems.cpp +++ b/src/Charts/OverviewItems.cpp @@ -4268,7 +4268,7 @@ static QColor FosterColors[11]={ void RPErating::setValue(QString value) { - // RPE values from other sources (e.g. TodaysPlan) are "double" + // RPE values from other sources are "double" this->value = value; int v = qRound(value.toDouble()); if (v <0 || v>10) { diff --git a/src/Cloud/MeasuresDownload.cpp b/src/Cloud/MeasuresDownload.cpp index 6c738cc95..ef860e7d1 100644 --- a/src/Cloud/MeasuresDownload.cpp +++ b/src/Cloud/MeasuresDownload.cpp @@ -42,11 +42,9 @@ MeasuresDownload::MeasuresDownload(Context *context, MeasuresGroup *measuresGrou QGroupBox *groupBox1 = new QGroupBox(tr("Choose the download or import source")); downloadWithings = new QRadioButton(tr("Withings")); - downloadTP = new QRadioButton(tr("Today's Plan")); downloadCSV = new QRadioButton(tr("Import CSV file")); QVBoxLayout *vbox1 = new QVBoxLayout; vbox1->addWidget(downloadWithings); - vbox1->addWidget(downloadTP); vbox1->addWidget(downloadCSV); groupBox1->setLayout(vbox1); mainLayout->addWidget(groupBox1); @@ -109,14 +107,11 @@ MeasuresDownload::MeasuresDownload(Context *context, MeasuresGroup *measuresGrou connect(dateRangeManual, SIGNAL(toggled(bool)), this, SLOT(dateRangeManualSettingChanged(bool))); connect(downloadWithings, SIGNAL(toggled(bool)), this, SLOT(downloadWithingsSettingChanged(bool))); - connect(downloadTP, SIGNAL(toggled(bool)), this, SLOT(downloadTPSettingChanged(bool))); connect(downloadCSV, SIGNAL(toggled(bool)), this, SLOT(downloadCSVSettingChanged(bool))); // don't allow options which are not authorized downloadWithings->setEnabled((measuresGroup->getSymbol() == "Body") && (appsettings->cvalue(context->athlete->cyclist, GC_NOKIA_TOKEN, "").toString() !="")); - downloadTP->setEnabled((measuresGroup->getSymbol() == "Body") && - (appsettings->cvalue(context->athlete->cyclist, GC_TODAYSPLAN_TOKEN, "").toString() != "")); // select the default checked / based on available properties and last selection int last_selection = appsettings->cvalue(context->athlete->cyclist, GC_BM_LAST_TYPE, 0).toInt(); @@ -127,12 +122,6 @@ MeasuresDownload::MeasuresDownload(Context *context, MeasuresGroup *measuresGrou done = true; } } - if (!done && downloadTP->isEnabled()) { - if (last_selection == 0 || last_selection == TP) { - downloadTP->setChecked(true); - done = true; - } - } if (!done) { downloadCSV->setChecked(true); } @@ -157,14 +146,9 @@ MeasuresDownload::MeasuresDownload(Context *context, MeasuresGroup *measuresGrou // initialize the downloader withingsDownload = new WithingsDownload(context); - todaysPlanBodyMeasureDownload = new TodaysPlanBodyMeasures(context); csvFileImport = new MeasuresCsvImport(context, this); // connect the progress bar - connect(todaysPlanBodyMeasureDownload, SIGNAL(downloadStarted(int)), this, SLOT(downloadProgressStart(int))); - connect(todaysPlanBodyMeasureDownload, SIGNAL(downloadProgress(int)), this, SLOT(downloadProgress(int))); - connect(todaysPlanBodyMeasureDownload, SIGNAL(downloadEnded(int)), this, SLOT(downloadProgressEnd(int))); - connect(withingsDownload, SIGNAL(downloadStarted(int)), this, SLOT(downloadProgressStart(int))); connect(withingsDownload, SIGNAL(downloadProgress(int)), this, SLOT(downloadProgress(int))); connect(withingsDownload, SIGNAL(downloadEnded(int)), this, SLOT(downloadProgressEnd(int))); @@ -177,7 +161,6 @@ MeasuresDownload::MeasuresDownload(Context *context, MeasuresGroup *measuresGrou MeasuresDownload::~MeasuresDownload() { delete withingsDownload; - delete todaysPlanBodyMeasureDownload; delete csvFileImport; } @@ -241,8 +224,6 @@ MeasuresDownload::download() { // do the download if (downloadWithings->isChecked()) { downloadOk = withingsDownload->getBodyMeasures(err, fromDate, toDate, measures); - } else if (downloadTP->isChecked()) { - downloadOk = todaysPlanBodyMeasureDownload->getBodyMeasures(err, fromDate, toDate, measures); } else if (downloadCSV->isChecked()) { downloadOk = csvFileImport->getMeasures(measuresGroup, err, fromDate, toDate, measures); } else return; @@ -326,13 +307,6 @@ MeasuresDownload::downloadWithingsSettingChanged(bool checked) { } } -void -MeasuresDownload::downloadTPSettingChanged(bool checked) { - - if (checked) { - appsettings->setCValue(context->athlete->cyclist, GC_BM_LAST_TYPE, TP); - } -} void MeasuresDownload::downloadCSVSettingChanged(bool checked) { diff --git a/src/Cloud/MeasuresDownload.h b/src/Cloud/MeasuresDownload.h index c0df8421a..92495f609 100644 --- a/src/Cloud/MeasuresDownload.h +++ b/src/Cloud/MeasuresDownload.h @@ -23,7 +23,6 @@ #include "Context.h" #include "WithingsDownload.h" -#include "TodaysPlanBodyMeasures.h" #include "MeasuresCsvImport.h" #include @@ -53,7 +52,6 @@ private: MeasuresGroup *measuresGroup; WithingsDownload *withingsDownload; - TodaysPlanBodyMeasures *todaysPlanBodyMeasureDownload; MeasuresCsvImport *csvFileImport; QPushButton *downloadButton; @@ -61,9 +59,8 @@ private: QCheckBox *discardExistingMeasures; - // withings, todaysplan, csv file + // withings, csv file QRadioButton *downloadWithings; - QRadioButton *downloadTP; QRadioButton *downloadCSV; // all, from last measure, manual date interval @@ -95,7 +92,6 @@ private slots: void dateRangeManualSettingChanged(bool); void downloadWithingsSettingChanged(bool); - void downloadTPSettingChanged(bool); void downloadCSVSettingChanged(bool); void downloadProgressStart(int); diff --git a/src/Cloud/OAuthDialog.cpp b/src/Cloud/OAuthDialog.cpp index efc1cd583..6cc905be1 100644 --- a/src/Cloud/OAuthDialog.cpp +++ b/src/Cloud/OAuthDialog.cpp @@ -44,7 +44,6 @@ OAuthDialog::OAuthDialog(Context *context, OAuthSite site, CloudService *service if (service->id() == "Dropbox") site = this->site = DROPBOX; if (service->id() == "Cycling Analytics") site = this->site = CYCLING_ANALYTICS; if (service->id() == "Nolio") site = this->site = NOLIO; - if (service->id() == "Today's Plan") site = this->site = TODAYSPLAN; if (service->id() == "Withings") site = this->site = WITHINGS; if (service->id() == "PolarFlow") site = this->site = POLAR; if (service->id() == "SportTracks.mobi") site = this->site = SPORTTRACKS; @@ -125,13 +124,6 @@ OAuthDialog::OAuthDialog(Context *context, OAuthSite site, CloudService *service urlstr.append("response_type=code&"); urlstr.append("approval_prompt=force"); - } else if (site == TODAYSPLAN) { - - //urlstr = QString("https://whats.todaysplan.com.au/en/authorize/"); //XXX fixup below when pages.cpp goes - if (baseURL=="") baseURL=service->getSetting(GC_TODAYSPLAN_URL, "https://whats.todaysplan.com.au").toString(); - urlstr = QString("%1/authorize/").arg(baseURL); - urlstr.append(GC_TODAYSPLAN_CLIENT_ID); - } else if (site == POLAR) { // OAUTH 2.0 - Polar flow for installed applications @@ -174,7 +166,7 @@ OAuthDialog::OAuthDialog(Context *context, OAuthSite site, CloudService *service // // STEP 1: LOGIN AND AUTHORISE THE APPLICATION // - if (site == NOLIO || site == DROPBOX || site == STRAVA || site == CYCLING_ANALYTICS || site == POLAR || site == SPORTTRACKS || site == TODAYSPLAN || site == WITHINGS || site == AZUM) { + if (site == NOLIO || site == DROPBOX || site == STRAVA || site == CYCLING_ANALYTICS || site == POLAR || site == SPORTTRACKS || site == WITHINGS || site == AZUM) { url = QUrl(urlstr); view->setUrl(url); // connects @@ -210,7 +202,7 @@ OAuthDialog::urlChanged(const QUrl &url) QString authheader; // sites that use this scheme - if (site == NOLIO || site == DROPBOX || site == STRAVA || site == CYCLING_ANALYTICS || site == TODAYSPLAN || site == POLAR || site == SPORTTRACKS || site == XERT || site == RIDEWITHGPS || site == WITHINGS || site == AZUM) { + if (site == NOLIO || site == DROPBOX || site == STRAVA || site == CYCLING_ANALYTICS || site == POLAR || site == SPORTTRACKS || site == XERT || site == RIDEWITHGPS || site == WITHINGS || site == AZUM) { if (url.toString().startsWith("http://www.goldencheetah.org/?state=&code=") || url.toString().contains("blank.html?code=") || @@ -280,23 +272,6 @@ OAuthDialog::urlChanged(const QUrl &url) #endif params.addQueryItem("grant_type", "authorization_code"); - } else if (site == TODAYSPLAN) { - - if (baseURL=="") baseURL=service->getSetting(GC_TODAYSPLAN_URL, "https://whats.todaysplan.com.au").toString(); - urlstr = QString("%1/rest/oauth/access_token?").arg(baseURL); - params.addQueryItem("client_id", GC_TODAYSPLAN_CLIENT_ID); -#ifdef GC_TODAYSPLAN_CLIENT_SECRET - if (clientsecret != "") //XXX get rid when pages.cpp goes - params.addQueryItem("client_secret", clientsecret); - else if (service->getSetting(GC_TODAYSPLAN_USERKEY, "").toString() != "") - params.addQueryItem("client_secret", service->getSetting(GC_TODAYSPLAN_USERKEY, "").toString()); - else - params.addQueryItem("client_secret", GC_TODAYSPLAN_CLIENT_SECRET); - -#endif - params.addQueryItem("grant_type", "authorization_code"); - params.addQueryItem("redirect_uri", "https://goldencheetah.github.io/blank.html"); - } else if (site == XERT) { urlstr = QString("https://www.xertonline.com/oauth/token"); @@ -472,13 +447,6 @@ OAuthDialog::networkRequestFinished(QNetworkReply *reply) QMessageBox information(QMessageBox::Information, tr("Information"), info); information.exec(); - } else if (site == TODAYSPLAN) { - - service->setSetting(GC_TODAYSPLAN_TOKEN, access_token); - QString info = QString(tr("Today's Plan authorization was successful.")); - QMessageBox information(QMessageBox::Information, tr("Information"), info); - information.exec(); - } else if (site == XERT) { service->setSetting(GC_XERT_TOKEN, access_token); diff --git a/src/Cloud/OAuthDialog.h b/src/Cloud/OAuthDialog.h index dcd75321d..dade803ee 100644 --- a/src/Cloud/OAuthDialog.h +++ b/src/Cloud/OAuthDialog.h @@ -51,7 +51,6 @@ public: CYCLING_ANALYTICS, NOLIO, SPORTTRACKS, - TODAYSPLAN, WITHINGS, POLAR, XERT, diff --git a/src/Core/Measures.cpp b/src/Core/Measures.cpp index a848c2deb..da51cd398 100644 --- a/src/Core/Measures.cpp +++ b/src/Core/Measures.cpp @@ -60,8 +60,6 @@ Measure::getSourceDescription() const return tr("Manual entry"); case Measure::Withings: return tr("Withings"); - case Measure::TodaysPlan: - return tr("Today's Plan"); case Measure::CSV: return tr("CSV Upload"); default: diff --git a/src/Core/Measures.h b/src/Core/Measures.h index 27d5d4826..258ca57bb 100644 --- a/src/Core/Measures.h +++ b/src/Core/Measures.h @@ -31,7 +31,7 @@ class Measure { Q_DECLARE_TR_FUNCTIONS(Measure) public: - enum measuresource { Manual, Withings, TodaysPlan, CSV }; + enum measuresource { Manual, Withings, CSV }; typedef enum measuresource MeasureSource; enum bodymeasuretype { WeightKg = 0, FatKg = 1, MuscleKg = 2, BonesKg = 3, LeanKg = 4, FatPercent = 5 }; diff --git a/src/Core/Secrets.h b/src/Core/Secrets.h index 256f01fdd..0d362dfa3 100644 --- a/src/Core/Secrets.h +++ b/src/Core/Secrets.h @@ -69,10 +69,6 @@ #define GC_STRAVA_CLIENT_SECRET "__GC_STRAVA_CLIENT_SECRET__" #endif -#ifndef GC_TODAYSPLAN_CLIENT_SECRET -#define GC_TODAYSPLAN_CLIENT_SECRET "__GC_TODAYSPLAN_CLIENT_SECRET__" -#endif - #ifndef GC_CYCLINGANALYTICS_CLIENT_SECRET #define GC_CYCLINGANALYTICS_CLIENT_SECRET "__GC_CYCLINGANALYTICS_CLIENT_SECRET__" #endif diff --git a/src/Core/Settings.h b/src/Core/Settings.h index f16359d87..099f5b5de 100644 --- a/src/Core/Settings.h +++ b/src/Core/Settings.h @@ -36,9 +36,6 @@ #define GC_UNIT_METRIC "Metric" #define GC_UNIT_IMPERIAL "Imperial" -//Today's Plan -#define GC_TODAYSPLAN_CLIENT_ID "GoldenCheetah" // app id - //Cycling Analytics / see also Athlete parameter #define GC_CYCLINGANALYTICS_CLIENT_ID "1504958" // app id @@ -389,13 +386,6 @@ //Cycling Analytics #define GC_CYCLINGANALYTICS_TOKEN "cyclinganalytics_token" -//Today's Plan -#define GC_TODAYSPLAN_TOKEN "todaysplan_token" -#define GC_TODAYSPLAN_URL "todaysplan_url" -#define GC_TODAYSPLAN_USERKEY "todaysplan_userkey" -#define GC_TODAYSPLAN_ATHLETE_ID "todaysplan_athlete_id" -#define GC_TODAYSPLAN_ATHLETE_NAME "todaysplan_athlete_name" - //SixCycle #define GC_SIXCYCLE_USER "sixcycle_user" #define GC_SIXCYCLE_PASS "sixcycle_pass" diff --git a/src/Gui/MainWindow.cpp b/src/Gui/MainWindow.cpp index 32944ca23..c56d46ec6 100644 --- a/src/Gui/MainWindow.cpp +++ b/src/Gui/MainWindow.cpp @@ -42,7 +42,6 @@ #include "RideFile.h" #include "Settings.h" #include "ErgDB.h" -#include "TodaysPlanWorkoutDownload.h" #include "Library.h" #include "LibraryParser.h" #include "TrainDB.h" @@ -66,7 +65,6 @@ #include "MergeActivityWizard.h" #include "GenerateHeatMapDialog.h" #include "BatchProcessingDialog.h" -#include "TodaysPlan.h" #include "MeasuresDownload.h" #include "WorkoutWizard.h" #include "ErgDBDownloadDialog.h" @@ -550,7 +548,6 @@ MainWindow::MainWindow(const QDir &home) optionsMenu->addSeparator(); optionsMenu->addAction(tr("Create a new workout..."), this, SLOT(showWorkoutWizard())); optionsMenu->addAction(tr("Download workouts from ErgDB..."), this, SLOT(downloadErgDB())); - optionsMenu->addAction(tr("Download workouts from Today's Plan..."), this, SLOT(downloadTodaysPlanWorkouts())); optionsMenu->addAction(tr("Import workouts, videos, videoSyncs..."), this, SLOT(importWorkout())); optionsMenu->addAction(tr("Scan disk for workouts, videos, videoSyncs..."), this, SLOT(manageLibrary())); @@ -2424,27 +2421,6 @@ MainWindow::downloadErgDB() } } -/*---------------------------------------------------------------------- - * TodaysPlan Workouts - *--------------------------------------------------------------------*/ - -void -MainWindow::downloadTodaysPlanWorkouts() -{ - QString workoutDir = appsettings->value(this, GC_WORKOUTDIR).toString(); - - QFileInfo fi(workoutDir); - - if (fi.exists() && fi.isDir()) { - TodaysPlanWorkoutDownload *d = new TodaysPlanWorkoutDownload(currentAthleteTab->context); - d->exec(); - } else{ - QMessageBox::critical(this, tr("Workout Directory Invalid"), - tr("The workout directory is not configured, or the directory selected no longer exists.\n\n" - "Please check your preference settings.")); - } -} - /*---------------------------------------------------------------------- * Workout/Media Library *--------------------------------------------------------------------*/ diff --git a/src/Gui/MainWindow.h b/src/Gui/MainWindow.h index 5a28471c7..7abb76764 100644 --- a/src/Gui/MainWindow.h +++ b/src/Gui/MainWindow.h @@ -234,7 +234,6 @@ class MainWindow : public QMainWindow // Training View void addDevice(); void downloadErgDB(); - void downloadTodaysPlanWorkouts(); void manageLibrary(); void showWorkoutWizard(); void importWorkout(); diff --git a/src/Resources/application.qrc b/src/Resources/application.qrc index 46bd21f8d..124e0d814 100644 --- a/src/Resources/application.qrc +++ b/src/Resources/application.qrc @@ -198,7 +198,6 @@ images/services/sixcycle.png images/services/sportplushealth.png images/services/strava.png - images/services/todaysplan.png images/services/trainingstagebuch.png images/services/velohero.png images/services/polarflow.png diff --git a/src/Resources/images/services/todaysplan.png b/src/Resources/images/services/todaysplan.png deleted file mode 100644 index dcaef95348af7578fb4a71afc258a4cb7f9a394c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29156 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, SLOT(importWorkout(void))); connect(wizard, SIGNAL(triggered(void)), context->mainWindow, SLOT(showWorkoutWizard(void))); connect(download, SIGNAL(triggered(void)), context->mainWindow, SLOT(downloadErgDB(void))); - connect(dlTodaysPlan, SIGNAL(triggered(void)), context->mainWindow, SLOT(downloadTodaysPlanWorkouts(void))); connect(scan, SIGNAL(triggered(void)), context->mainWindow, SLOT(manageLibrary(void))); // execute the menu diff --git a/src/src.pro b/src/src.pro index f8aee7e22..a90c2d198 100644 --- a/src/src.pro +++ b/src/src.pro @@ -554,8 +554,6 @@ SOURCES += Cloud/PolarFlow.cpp HEADERS += Cloud/PolarFlow.h SOURCES += Cloud/SportTracks.cpp HEADERS += Cloud/SportTracks.h -SOURCES += Cloud/TodaysPlan.cpp -HEADERS += Cloud/TodaysPlan.h SOURCES += Cloud/Nolio.cpp HEADERS += Cloud/Nolio.h @@ -629,7 +627,7 @@ HEADERS += Charts/Aerolab.h Charts/AerolabWindow.h Charts/AllPlot.h Charts/AllPl # cloud services HEADERS += Cloud/CalendarDownload.h Cloud/CloudService.h \ - Cloud/LocalFileStore.h Cloud/OAuthDialog.h Cloud/TodaysPlanBodyMeasures.h \ + Cloud/LocalFileStore.h Cloud/OAuthDialog.h \ Cloud/WithingsDownload.h Cloud/Strava.h Cloud/CyclingAnalytics.h Cloud/RideWithGPS.h \ Cloud/TrainingsTageBuch.h Cloud/Selfloops.h Cloud/Velohero.h Cloud/SportsPlusHealth.h \ Cloud/AddCloudWizard.h Cloud/Withings.h Cloud/MeasuresDownload.h Cloud/Xert.h \ @@ -700,10 +698,6 @@ HEADERS += Train/AddDeviceWizard.h Train/CalibrationData.h Train/ComputrainerCon Train/SpinScanPlotWindow.h Train/SpinScanPolarPlot.h Train/GarminServiceHelper.h Train/PhysicsUtility.h Train/BicycleSim.h \ Train/PolynomialRegression.h Train/MultiRegressionizer.h -greaterThan(QT_MAJOR_VERSION, 4) { - HEADERS += Train/TodaysPlanWorkoutDownload.h -} - HEADERS += Train/TrainBottom.h Train/TrainDB.h Train/TrainSidebar.h \ Train/VideoLayoutParser.h Train/VideoSyncFile.h Train/WorkoutPlotWindow.h Train/WebPageWindow.h \ Train/WorkoutWidget.h Train/WorkoutWidgetItems.h Train/WorkoutWindow.h Train/WorkoutWizard.h Train/ZwoParser.h \ @@ -732,7 +726,7 @@ SOURCES += Charts/Aerolab.cpp Charts/AerolabWindow.cpp Charts/AllPlot.cpp Charts ## Cloud Services / Web resources SOURCES += Cloud/CalendarDownload.cpp Cloud/CloudService.cpp \ - Cloud/LocalFileStore.cpp Cloud/OAuthDialog.cpp Cloud/TodaysPlanBodyMeasures.cpp \ + Cloud/LocalFileStore.cpp Cloud/OAuthDialog.cpp \ Cloud/WithingsDownload.cpp Cloud/Strava.cpp Cloud/CyclingAnalytics.cpp Cloud/RideWithGPS.cpp \ Cloud/TrainingsTageBuch.cpp Cloud/Selfloops.cpp Cloud/Velohero.cpp Cloud/SportsPlusHealth.cpp \ Cloud/AddCloudWizard.cpp Cloud/Withings.cpp Cloud/MeasuresDownload.cpp Cloud/Xert.cpp \ @@ -812,10 +806,6 @@ SOURCES += Train/AddDeviceWizard.cpp Train/CalibrationData.cpp Train/Computraine Train/SpinScanPlotWindow.cpp Train/SpinScanPolarPlot.cpp Train/GarminServiceHelper.cpp Train/PhysicsUtility.cpp Train/BicycleSim.cpp \ Train/PolynomialRegression.cpp -greaterThan(QT_MAJOR_VERSION, 4) { - SOURCES += Train/TodaysPlanWorkoutDownload.cpp -} - SOURCES += Train/TrainBottom.cpp Train/TrainDB.cpp Train/TrainSidebar.cpp \ Train/VideoLayoutParser.cpp Train/VideoSyncFile.cpp Train/WorkoutPlotWindow.cpp Train/WebPageWindow.cpp \ Train/WorkoutWidget.cpp Train/WorkoutWidgetItems.cpp Train/WorkoutWindow.cpp Train/WorkoutWizard.cpp Train/ZwoParser.cpp \ diff --git a/travis/linux/before_script.sh b/travis/linux/before_script.sh index 3293bfbda..a03ac192b 100755 --- a/travis/linux/before_script.sh +++ b/travis/linux/before_script.sh @@ -53,7 +53,6 @@ sed -i "s/__GC_CLOUD_DB_APP_NAME__/"$GC_CLOUD_DB_APP_NAME"/" src/Core/Secrets.h sed -i "s/__GC_GOOGLE_DRIVE_CLIENT_ID__/"$GC_GOOGLE_DRIVE_CLIENT_ID"/" src/Core/Secrets.h sed -i "s/__GC_GOOGLE_DRIVE_CLIENT_SECRET__/"$GC_GOOGLE_DRIVE_CLIENT_SECRET"/" src/Core/Secrets.h sed -i "s/__GC_GOOGLE_DRIVE_API_KEY__/"$GC_GOOGLE_DRIVE_API_KEY"/" src/Core/Secrets.h -sed -i "s/__GC_TODAYSPLAN_CLIENT_SECRET__/"$GC_TODAYSPLAN_CLIENT_SECRET"/" src/Core/Secrets.h sed -i "s/__GC_WITHINGS_CONSUMER_SECRET__/"$GC_WITHINGS_CONSUMER_SECRET"/" src/Core/Secrets.h sed -i "s/__GC_NOKIA_CLIENT_SECRET__/"$GC_NOKIA_CLIENT_SECRET"/" src/Core/Secrets.h sed -i "s/__GC_SPORTTRACKS_CLIENT_SECRET__/"$GC_SPORTTRACKS_CLIENT_SECRET"/" src/Core/Secrets.h diff --git a/travis/osx/before_script.sh b/travis/osx/before_script.sh index 2087e1824..a349a547e 100755 --- a/travis/osx/before_script.sh +++ b/travis/osx/before_script.sh @@ -78,7 +78,6 @@ sed -i "" "s/__GC_CLOUD_DB_APP_NAME__/"$GC_CLOUD_DB_APP_NAME"/" src/Core/Secrets sed -i "" "s/__GC_GOOGLE_DRIVE_CLIENT_ID__/"$GC_GOOGLE_DRIVE_CLIENT_ID"/" src/Core/Secrets.h sed -i "" "s/__GC_GOOGLE_DRIVE_CLIENT_SECRET__/"$GC_GOOGLE_DRIVE_CLIENT_SECRET"/" src/Core/Secrets.h sed -i "" "s/__GC_GOOGLE_DRIVE_API_KEY__/"$GC_GOOGLE_DRIVE_API_KEY"/" src/Core/Secrets.h -sed -i "" "s/__GC_TODAYSPLAN_CLIENT_SECRET__/"$GC_TODAYSPLAN_CLIENT_SECRET"/" src/Core/Secrets.h sed -i "" "s/__GC_WITHINGS_CONSUMER_SECRET__/"$GC_WITHINGS_CONSUMER_SECRET"/" src/Core/Secrets.h sed -i "" "s/__GC_NOKIA_CLIENT_SECRET__/"$GC_NOKIA_CLIENT_SECRET"/" src/Core/Secrets.h sed -i "" "s/__GC_SPORTTRACKS_CLIENT_SECRET__/"$GC_SPORTTRACKS_CLIENT_SECRET"/" src/Core/Secrets.h