diff --git a/mocks/include/mocks/EmptyApplication.hpp b/mocks/include/mocks/EmptyApplication.hpp index 2b929aa37..26395e079 100644 --- a/mocks/include/mocks/EmptyApplication.hpp +++ b/mocks/include/mocks/EmptyApplication.hpp @@ -3,12 +3,18 @@ #include "Application.hpp" #include "common/Args.hpp" #include "singletons/Paths.hpp" +#include "singletons/Updates.hpp" namespace chatterino::mock { class EmptyApplication : public IApplication { public: + EmptyApplication() + : updates_(this->paths_) + { + } + virtual ~EmptyApplication() = default; const Paths &getPaths() override @@ -174,9 +180,15 @@ public: return nullptr; } + Updates &getUpdates() override + { + return this->updates_; + } + private: Paths paths_; Args args_; + Updates updates_; }; } // namespace chatterino::mock diff --git a/src/Application.cpp b/src/Application.cpp index 29a0f476d..16fe0bf78 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -108,7 +108,7 @@ IApplication::IApplication() // to each other Application::Application(Settings &_settings, const Paths &paths, - const Args &_args) + const Args &_args, Updates &_updates) : paths_(paths) , args_(_args) , themes(&this->emplace()) @@ -137,6 +137,7 @@ Application::Application(Settings &_settings, const Paths &paths, #ifdef CHATTERINO_HAVE_PLUGINS , plugins(&this->emplace(new PluginController(paths))) #endif + , updates(_updates) { Application::instance = this; @@ -239,8 +240,8 @@ int Application::run(QApplication &qtApp) } getSettings()->betaUpdates.connect( - [] { - Updates::instance().checkForUpdates(); + [this] { + this->updates.checkForUpdates(); }, false); diff --git a/src/Application.hpp b/src/Application.hpp index 8b95023eb..716d0f476 100644 --- a/src/Application.hpp +++ b/src/Application.hpp @@ -15,6 +15,7 @@ class Args; class TwitchIrcServer; class ITwitchIrcServer; class PubSub; +class Updates; class CommandController; class AccountController; @@ -79,6 +80,7 @@ public: virtual ITwitchLiveController *getTwitchLiveController() = 0; virtual ImageUploader *getImageUploader() = 0; virtual SeventvAPI *getSeventvAPI() = 0; + virtual Updates &getUpdates() = 0; }; class Application : public IApplication @@ -92,7 +94,8 @@ class Application : public IApplication public: static Application *instance; - Application(Settings &_settings, const Paths &paths, const Args &_args); + Application(Settings &_settings, const Paths &paths, const Args &_args, + Updates &_updates); ~Application() override; Application(const Application &) = delete; @@ -220,6 +223,10 @@ public: { return this->seventvAPI; } + Updates &getUpdates() override + { + return this->updates; + } pajlada::Signals::NoArgSignal streamerModeChanged; @@ -248,6 +255,7 @@ private: } NativeMessagingServer nmServer{}; + Updates &updates; }; Application *getApp(); diff --git a/src/RunGui.cpp b/src/RunGui.cpp index 4ab7ac830..87adf72d8 100644 --- a/src/RunGui.cpp +++ b/src/RunGui.cpp @@ -224,7 +224,7 @@ namespace { } // namespace void runGui(QApplication &a, const Paths &paths, Settings &settings, - const Args &args) + const Args &args, Updates &updates) { initQt(); initResources(); @@ -270,9 +270,9 @@ void runGui(QApplication &a, const Paths &paths, Settings &settings, }); chatterino::NetworkManager::init(); - chatterino::Updates::instance().checkForUpdates(); + updates.checkForUpdates(); - Application app(settings, paths, args); + Application app(settings, paths, args, updates); app.initialize(settings, paths); app.run(a); app.save(); diff --git a/src/RunGui.hpp b/src/RunGui.hpp index 7efbea89d..daf4cf155 100644 --- a/src/RunGui.hpp +++ b/src/RunGui.hpp @@ -7,8 +7,9 @@ namespace chatterino { class Args; class Paths; class Settings; +class Updates; void runGui(QApplication &a, const Paths &paths, Settings &settings, - const Args &args); + const Args &args, Updates &updates); } // namespace chatterino diff --git a/src/main.cpp b/src/main.cpp index 15d9e3c9f..871767918 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,6 +11,7 @@ #include "singletons/CrashHandler.hpp" #include "singletons/Paths.hpp" #include "singletons/Settings.hpp" +#include "singletons/Updates.hpp" #include "util/AttachToConsole.hpp" #include @@ -92,6 +93,8 @@ int main(int argc, char **argv) attachToConsole(); } + Updates updates(*paths); + NetworkConfigurationProvider::applyFromEnv(Env::get()); IvrApi::initialize(); @@ -99,7 +102,7 @@ int main(int argc, char **argv) Settings settings(paths->settingsDirectory); - runGui(a, *paths, settings, args); + runGui(a, *paths, settings, args, updates); } return 0; } diff --git a/src/singletons/Updates.cpp b/src/singletons/Updates.cpp index 55e43ec01..0a758e12d 100644 --- a/src/singletons/Updates.cpp +++ b/src/singletons/Updates.cpp @@ -26,21 +26,14 @@ namespace { } // namespace -Updates::Updates() - : currentVersion_(CHATTERINO_VERSION) +Updates::Updates(const Paths &paths_) + : paths(paths_) + , currentVersion_(CHATTERINO_VERSION) , updateGuideLink_("https://chatterino.com") { qCDebug(chatterinoUpdate) << "init UpdateManager"; } -Updates &Updates::instance() -{ - // fourtf: don't add this class to the application class - static Updates instance; - - return instance; -} - /// Checks if the online version is newer or older than the current version. bool Updates::isDowngradeOf(const QString &online, const QString ¤t) { @@ -97,7 +90,7 @@ void Updates::installUpdates() box->exec(); QDesktopServices::openUrl(this->updateGuideLink_); #elif defined Q_OS_WIN - if (getPaths()->isPortable()) + if (this->paths.isPortable()) { QMessageBox *box = new QMessageBox(QMessageBox::Information, "Chatterino Update", @@ -136,7 +129,7 @@ void Updates::installUpdates() QByteArray object = result.getData(); auto filename = - combinePath(getPaths()->miscDirectory, "update.zip"); + combinePath(this->paths.miscDirectory, "update.zip"); QFile file(filename); file.open(QIODevice::Truncate | QIODevice::WriteOnly); @@ -196,7 +189,7 @@ void Updates::installUpdates() QByteArray object = result.getData(); auto filePath = - combinePath(getPaths()->miscDirectory, "Update.exe"); + combinePath(this->paths.miscDirectory, "Update.exe"); QFile file(filePath); file.open(QIODevice::Truncate | QIODevice::WriteOnly); diff --git a/src/singletons/Updates.hpp b/src/singletons/Updates.hpp index e08b313ba..9711a0ca7 100644 --- a/src/singletons/Updates.hpp +++ b/src/singletons/Updates.hpp @@ -5,11 +5,15 @@ namespace chatterino { +class Paths; + class Updates { - Updates(); + const Paths &paths; public: + explicit Updates(const Paths &paths_); + enum Status { None, Searching, @@ -21,9 +25,6 @@ public: WriteFileFailed, }; - // fourtf: don't add this class to the application class - static Updates &instance(); - static bool isDowngradeOf(const QString &online, const QString ¤t); void checkForUpdates(); diff --git a/src/util/InitUpdateButton.cpp b/src/util/InitUpdateButton.cpp index ae46bdd34..349fb78bb 100644 --- a/src/util/InitUpdateButton.cpp +++ b/src/util/InitUpdateButton.cpp @@ -1,5 +1,6 @@ #include "util/InitUpdateButton.hpp" +#include "Application.hpp" #include "widgets/dialogs/UpdateDialog.hpp" #include "widgets/helper/Button.hpp" @@ -40,7 +41,7 @@ void initUpdateButton(Button &button, } break; case UpdateDialog::Install: { - Updates::instance().installUpdates(); + getIApp()->getUpdates().installUpdates(); } break; } @@ -52,17 +53,17 @@ void initUpdateButton(Button &button, // update image when state changes auto updateChange = [&button](auto) { - button.setVisible(Updates::instance().shouldShowUpdateButton()); + button.setVisible(getIApp()->getUpdates().shouldShowUpdateButton()); - const auto *imageUrl = Updates::instance().isError() + const auto *imageUrl = getIApp()->getUpdates().isError() ? ":/buttons/updateError.png" : ":/buttons/update.png"; button.setPixmap(QPixmap(imageUrl)); }; - updateChange(Updates::instance().getStatus()); + updateChange(getIApp()->getUpdates().getStatus()); - signalHolder.managedConnect(Updates::instance().statusUpdated, + signalHolder.managedConnect(getIApp()->getUpdates().statusUpdated, [updateChange](auto status) { updateChange(status); }); diff --git a/src/widgets/dialogs/UpdateDialog.cpp b/src/widgets/dialogs/UpdateDialog.cpp index d76e9f7f0..d9c6869f6 100644 --- a/src/widgets/dialogs/UpdateDialog.cpp +++ b/src/widgets/dialogs/UpdateDialog.cpp @@ -1,5 +1,6 @@ -#include "UpdateDialog.hpp" +#include "widgets/dialogs/UpdateDialog.hpp" +#include "Application.hpp" #include "singletons/Updates.hpp" #include "util/LayoutCreator.hpp" #include "widgets/Label.hpp" @@ -26,7 +27,7 @@ UpdateDialog::UpdateDialog() auto *dismiss = buttons->addButton("Dismiss", QDialogButtonBox::RejectRole); QObject::connect(install, &QPushButton::clicked, this, [this] { - Updates::instance().installUpdates(); + getIApp()->getUpdates().installUpdates(); this->close(); }); QObject::connect(dismiss, &QPushButton::clicked, this, [this] { @@ -34,8 +35,8 @@ UpdateDialog::UpdateDialog() this->close(); }); - this->updateStatusChanged(Updates::instance().getStatus()); - this->connections_.managedConnect(Updates::instance().statusUpdated, + this->updateStatusChanged(getIApp()->getUpdates().getStatus()); + this->connections_.managedConnect(getIApp()->getUpdates().statusUpdated, [this](auto status) { this->updateStatusChanged(status); }); @@ -52,17 +53,17 @@ void UpdateDialog::updateStatusChanged(Updates::Status status) { case Updates::UpdateAvailable: { this->ui_.label->setText(( - Updates::instance().isDowngrade() + getIApp()->getUpdates().isDowngrade() ? QString( "The version online (%1) seems to be\nlower than the " "current (%2).\nEither a version was reverted or " "you are\nrunning a newer build.\n\nDo you want to " "download and install it?") - .arg(Updates::instance().getOnlineVersion(), - Updates::instance().getCurrentVersion()) + .arg(getIApp()->getUpdates().getOnlineVersion(), + getIApp()->getUpdates().getCurrentVersion()) : QString("An update (%1) is available.\n\nDo you want to " "download and install it?") - .arg(Updates::instance().getOnlineVersion()))); + .arg(getIApp()->getUpdates().getOnlineVersion()))); this->updateGeometry(); } break;