Unverified Commit 6716ff47 authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #6891 from DonLakeFlyer/VersionCheck

Stable desktop version check
parents a070fb9c 76d21b92
...@@ -4,7 +4,8 @@ Note: This file only contains high level features or important fixes. ...@@ -4,7 +4,8 @@ Note: This file only contains high level features or important fixes.
## 3.4 ## 3.4
### 3.4.4 - Not yet released ### 3.4.4
* Stable desktop versions now inform user at boot if newer version is available.
* Multi-Vehicle Start Mission and Pause now work correctly. Issue #6864. * Multi-Vehicle Start Mission and Pause now work correctly. Issue #6864.
### 3.4.3 ### 3.4.3
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <QStyleFactory> #include <QStyleFactory>
#include <QAction> #include <QAction>
#include <QStringListModel> #include <QStringListModel>
#include <QRegularExpression>
#ifdef QGC_ENABLE_BLUETOOTH #ifdef QGC_ENABLE_BLUETOOTH
#include <QBluetoothLocalDevice> #include <QBluetoothLocalDevice>
...@@ -86,6 +87,7 @@ ...@@ -86,6 +87,7 @@
#include "EditPositionDialogController.h" #include "EditPositionDialogController.h"
#include "FactValueSliderListModel.h" #include "FactValueSliderListModel.h"
#include "KMLFileHelper.h" #include "KMLFileHelper.h"
#include "QGCFileDownload.h"
#ifndef NO_SERIAL_LINK #ifndef NO_SERIAL_LINK
#include "SerialLink.h" #include "SerialLink.h"
...@@ -148,20 +150,24 @@ static QObject* kmlFileHelperSingletonFactory(QQmlEngine*, QJSEngine*) ...@@ -148,20 +150,24 @@ static QObject* kmlFileHelperSingletonFactory(QQmlEngine*, QJSEngine*)
QGCApplication::QGCApplication(int &argc, char* argv[], bool unitTesting) QGCApplication::QGCApplication(int &argc, char* argv[], bool unitTesting)
#ifdef __mobile__ #ifdef __mobile__
: QGuiApplication (argc, argv) : QGuiApplication (argc, argv)
, _qmlAppEngine (NULL) , _qmlAppEngine (nullptr)
#else #else
: QApplication (argc, argv) : QApplication (argc, argv)
#endif #endif
, _runningUnitTests (unitTesting) , _runningUnitTests (unitTesting)
, _logOutput (false) , _logOutput (false)
, _fakeMobile (false) , _fakeMobile (false)
, _settingsUpgraded (false) , _settingsUpgraded (false)
, _majorVersion (0)
, _minorVersion (0)
, _buildVersion (0)
, _currentVersionDownload (nullptr)
#ifdef QT_DEBUG #ifdef QT_DEBUG
, _testHighDPI (false) , _testHighDPI (false)
#endif #endif
, _toolbox (NULL) , _toolbox (nullptr)
, _bluetoothAvailable (false) , _bluetoothAvailable (false)
{ {
_app = this; _app = this;
...@@ -322,6 +328,8 @@ QGCApplication::QGCApplication(int &argc, char* argv[], bool unitTesting) ...@@ -322,6 +328,8 @@ QGCApplication::QGCApplication(int &argc, char* argv[], bool unitTesting)
_toolbox = new QGCToolbox(this); _toolbox = new QGCToolbox(this);
_toolbox->setChildToolboxes(); _toolbox->setChildToolboxes();
_checkForNewVersion();
} }
void QGCApplication::_shutdown(void) void QGCApplication::_shutdown(void)
...@@ -692,3 +700,68 @@ bool QGCApplication::isInternetAvailable() ...@@ -692,3 +700,68 @@ bool QGCApplication::isInternetAvailable()
{ {
return getQGCMapEngine()->isInternetActive(); return getQGCMapEngine()->isInternetActive();
} }
void QGCApplication::_checkForNewVersion(void)
{
#ifndef __mobile__
if (!_runningUnitTests) {
if (_parseVersionText(applicationVersion(), _majorVersion, _minorVersion, _buildVersion)) {
QString versionCheckFile = toolbox()->corePlugin()->stableVersionCheckFileUrl();
if (!versionCheckFile.isEmpty()) {
_currentVersionDownload = new QGCFileDownload(this);
connect(_currentVersionDownload, &QGCFileDownload::downloadFinished, this, &QGCApplication::_currentVersionDownloadFinished);
connect(_currentVersionDownload, &QGCFileDownload::error, this, &QGCApplication::_currentVersionDownloadError);
_currentVersionDownload->download(versionCheckFile);
}
}
}
#endif
}
void QGCApplication::_currentVersionDownloadFinished(QString remoteFile, QString localFile)
{
Q_UNUSED(remoteFile);
#ifdef __mobile__
Q_UNUSED(localFile);
#else
QFile versionFile(localFile);
if (versionFile.open(QIODevice::ReadOnly)) {
QTextStream textStream(&versionFile);
QString version = textStream.readLine();
qDebug() << version;
int majorVersion, minorVersion, buildVersion;
if (_parseVersionText(version, majorVersion, minorVersion, buildVersion)) {
if (_majorVersion < majorVersion ||
(_majorVersion == majorVersion && _minorVersion < minorVersion) ||
(_majorVersion == majorVersion && _minorVersion == minorVersion && _buildVersion < buildVersion)) {
QGCMessageBox::information(tr("New Version Available"), tr("There is a newer version of %1 available. You can download it from %2.").arg(applicationName()).arg(toolbox()->corePlugin()->stableDownloadLocation()));
}
}
}
_currentVersionDownload->deleteLater();
#endif
}
void QGCApplication::_currentVersionDownloadError(QString errorMsg)
{
Q_UNUSED(errorMsg);
_currentVersionDownload->deleteLater();
}
bool QGCApplication::_parseVersionText(const QString& versionString, int& majorVersion, int& minorVersion, int& buildVersion)
{
QRegularExpression regExp("v(\\d+)\\.(\\d+)\\.(\\d+)");
QRegularExpressionMatch match = regExp.match(versionString);
if (match.hasMatch() && match.lastCapturedIndex() == 3) {
majorVersion = match.captured(1).toInt();
minorVersion = match.captured(2).toInt();
buildVersion = match.captured(3).toInt();
return true;
}
return false;
}
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
class QGCSingleton; class QGCSingleton;
class MainWindow; class MainWindow;
class QGCToolbox; class QGCToolbox;
class QGCFileDownload;
/** /**
* @brief The main application and management class. * @brief The main application and management class.
...@@ -152,9 +153,13 @@ public: ...@@ -152,9 +153,13 @@ public:
private slots: private slots:
void _missingParamsDisplay(void); void _missingParamsDisplay(void);
void _currentVersionDownloadFinished(QString remoteFile, QString localFile);
void _currentVersionDownloadError(QString errorMsg);
bool _parseVersionText(const QString& versionString, int& majorVersion, int& minorVersion, int& buildVersion);
private: private:
QObject* _rootQmlObject(void); QObject* _rootQmlObject(void);
void _checkForNewVersion(void);
#ifdef __mobile__ #ifdef __mobile__
QQmlApplicationEngine* _qmlAppEngine; QQmlApplicationEngine* _qmlAppEngine;
...@@ -170,6 +175,10 @@ private: ...@@ -170,6 +175,10 @@ private:
QStringList _missingParams; ///< List of missing facts to be displayed QStringList _missingParams; ///< List of missing facts to be displayed
bool _fakeMobile; ///< true: Fake ui into displaying mobile interface bool _fakeMobile; ///< true: Fake ui into displaying mobile interface
bool _settingsUpgraded; ///< true: Settings format has been upgrade to new version bool _settingsUpgraded; ///< true: Settings format has been upgrade to new version
int _majorVersion;
int _minorVersion;
int _buildVersion;
QGCFileDownload* _currentVersionDownload;
#ifdef QT_DEBUG #ifdef QT_DEBUG
bool _testHighDPI; ///< true: double fonts sizes for simulating high dpi devices bool _testHighDPI; ///< true: double fonts sizes for simulating high dpi devices
......
...@@ -303,3 +303,13 @@ bool QGCCorePlugin::guidedActionsControllerLogging(void) const ...@@ -303,3 +303,13 @@ bool QGCCorePlugin::guidedActionsControllerLogging(void) const
{ {
return GuidedActionsControllerLog().isDebugEnabled(); return GuidedActionsControllerLog().isDebugEnabled();
} }
QString QGCCorePlugin::stableVersionCheckFileUrl(void) const
{
#ifdef QGC_CUSTOM_BUILD
// Custom builds must override to turn on and provide their own location
return QString();
#else
return QString("https://s3-us-west-2.amazonaws.com/qgroundcontrol/latest/QGC.version.txt");
#endif
}
...@@ -112,6 +112,18 @@ public: ...@@ -112,6 +112,18 @@ public:
/// should derive from QmlComponentInfo and set the url property. /// should derive from QmlComponentInfo and set the url property.
virtual QmlObjectListModel* customMapItems(void); virtual QmlObjectListModel* customMapItems(void);
/// Returns the url to download the stable version check file. Return QString() to indicate no version check should be performed.
/// Default QGC mainline implemenentation returns QGC Stable file location. Default QGC custom build code returns QString().
/// Custom builds can override to turn on and provide their own location.
/// The contents of this file should be a single line in the form:
/// v3.4.4
/// This indicates the latest stable version number.
virtual QString stableVersionCheckFileUrl(void) const;
/// Returns the user visible url to show user where to download new stable builds from.
/// Custom builds must override to provide their own location.
virtual QString stableDownloadLocation(void) const { return QString("qgroundcontrol.com"); }
bool showTouchAreas(void) const { return _showTouchAreas; } bool showTouchAreas(void) const { return _showTouchAreas; }
bool showAdvancedUI(void) const { return _showAdvancedUI; } bool showAdvancedUI(void) const { return _showAdvancedUI; }
void setShowTouchAreas(bool show); void setShowTouchAreas(bool show);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment