diff --git a/components/Notifier.qml b/components/Notifier.qml
new file mode 100644
index 00000000..ed380945
--- /dev/null
+++ b/components/Notifier.qml
@@ -0,0 +1,84 @@
+// Copyright (c) 2017, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import QtQuick 2.0
+import QtQuick.Controls 1.4
+import moneroComponents.Wallet 1.0
+
+Item {
+ id: item
+ property string message: ""
+ property bool active: false
+ height: 120
+ width: 240
+ x: parent.width - width
+ y: parent.height - height * scale.yScale
+ anchors.margins:15
+ anchors.bottom: parent.bottom
+ anchors.right: parent.right
+
+ Rectangle {
+ color: "#FF6C3C"
+ border.color: "black"
+ anchors.fill: parent
+
+ TextArea {
+ id:versionText
+ readOnly: true
+ backgroundVisible: false
+ textFormat: TextEdit.AutoText
+ anchors.fill: parent
+ font.family: "Arial"
+ font.pixelSize: 12
+ textMargin: 20
+ textColor: "white"
+ text: item.message
+ }
+ }
+
+ transform: Scale {
+ id: scale
+ yScale: item.active ? 1 : 0
+
+ Behavior on yScale {
+ NumberAnimation { duration: 500; easing.type: Easing.InOutCubic }
+ }
+ }
+
+ Timer {
+ id: hider
+ interval: 12000; running: false; repeat: false
+ onTriggered: { item.active = false }
+ }
+
+ function show(message) {
+ item.message = message
+ item.active = true
+ hider.running = true
+ }
+}
diff --git a/main.qml b/main.qml
index 3aa9d6cc..d7c25d34 100644
--- a/main.qml
+++ b/main.qml
@@ -765,6 +765,7 @@ ApplicationWindow {
initialize(persistentSettings);
}
+ checkUpdates();
}
onRightPanelExpandedChanged: {
@@ -1216,6 +1217,9 @@ ApplicationWindow {
}
}
+ Notifier {
+ id: notifier
+ }
}
onClosing: {
// Close wallet non async on exit
@@ -1223,4 +1227,30 @@ ApplicationWindow {
// Stop daemon and pool miner
daemonManager.stop();
}
+
+ function checkUpdates() {
+ var update = walletManager.checkUpdates("monero-gui", "gui")
+ if (update === "")
+ return
+ print("Update found: " + update)
+ var parts = update.split("|")
+ if (parts.length == 4) {
+ var version = parts[0]
+ var hash = parts[1]
+ var user_url = parts[2]
+ var auto_url = parts[3]
+ var msg = qsTr("New version of monero-wallet-gui is available: %1
%2").arg(version).arg(user_url) + translationManager.emptyString
+ notifier.show(msg)
+ }
+ else {
+ print("Failed to parse update spec")
+ }
+ }
+
+ Timer {
+ id: updatesTimer
+ interval: 3600*1000; running: true; repeat: true
+ onTriggered: checkUpdates()
+ }
+
}
diff --git a/qml.qrc b/qml.qrc
index c7b67fdd..18bd7428 100644
--- a/qml.qrc
+++ b/qml.qrc
@@ -126,5 +126,6 @@
wizard/WizardCreateViewOnlyWallet.qml
components/DaemonConsole.qml
components/QRCodeScanner.qml
+ components/Notifier.qml
diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp
index 5298743a..8533f7ef 100644
--- a/src/daemon/DaemonManager.cpp
+++ b/src/daemon/DaemonManager.cpp
@@ -40,9 +40,10 @@ bool DaemonManager::start(const QString &flags)
arguments << str;
}
+ arguments << "--updates" << "disabled";
qDebug() << "starting monerod " + m_monerod;
- qDebug() << "With command line arguments " << m_monerod;
+ qDebug() << "With command line arguments " << arguments;
m_daemon = new QProcess();
initialized = true;
diff --git a/src/libwalletqt/WalletManager.cpp b/src/libwalletqt/WalletManager.cpp
index df0ffdbd..de3378d5 100644
--- a/src/libwalletqt/WalletManager.cpp
+++ b/src/libwalletqt/WalletManager.cpp
@@ -328,6 +328,14 @@ bool WalletManager::saveQrCode(const QString &code, const QString &path) const
return QRCodeImageProvider::genQrImage(code, &size).scaled(size.expandedTo(QSize(240, 240)), Qt::KeepAspectRatio).save(path, "PNG", 100);
}
+QString WalletManager::checkUpdates(const QString &software, const QString &subdir) const
+{
+ const std::tuple result = Monero::WalletManager::checkUpdates(software.toStdString(), subdir.toStdString());
+ if (!std::get<0>(result))
+ return QString("");
+ return QString::fromStdString(std::get<1>(result) + "|" + std::get<2>(result) + "|" + std::get<3>(result) + "|" + std::get<4>(result));
+}
+
WalletManager::WalletManager(QObject *parent) : QObject(parent)
{
m_pimpl = Monero::WalletManagerFactory::getWalletManager();
diff --git a/src/libwalletqt/WalletManager.h b/src/libwalletqt/WalletManager.h
index 6bba0ce6..bb55c587 100644
--- a/src/libwalletqt/WalletManager.h
+++ b/src/libwalletqt/WalletManager.h
@@ -134,6 +134,7 @@ public:
Q_INVOKABLE QString resolveOpenAlias(const QString &address) const;
Q_INVOKABLE bool parse_uri(const QString &uri, QString &address, QString &payment_id, uint64_t &amount, QString &tx_description, QString &recipient_name, QVector &unknown_parameters, QString &error);
Q_INVOKABLE bool saveQrCode(const QString &, const QString &) const;
+ Q_INVOKABLE QString checkUpdates(const QString &software, const QString &subdir) const;
signals: