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: