diff --git a/include/constants.hpp b/include/constants.hpp index 6667897..2f33fba 100644 --- a/include/constants.hpp +++ b/include/constants.hpp @@ -95,6 +95,8 @@ constexpr const char HOMEBREW[] = "/config/aio-switch-updater/language.json"; constexpr const char ROMFS_FORWARDER[] = "romfs:/aiosu-forwarder.nro"; constexpr const char FORWARDER_PATH[] = "/config/aio-switch-updater/aiosu-forwarder.nro"; +constexpr const char DAYBREAK_PATH[] = "/switch/daybreak.nro"; + constexpr const char HIDDEN_AIO_FILE[] = "/config/aio-switch-updater/.aio-switch-updater"; constexpr const int LISTITEM_HEIGHT = 50; diff --git a/include/dialogue_page.hpp b/include/dialogue_page.hpp index 826aa08..5b3e180 100644 --- a/include/dialogue_page.hpp +++ b/include/dialogue_page.hpp @@ -2,22 +2,50 @@ #include #include +#include class DialoguePage : public brls::View { private: + std::chrono::system_clock::time_point start = std::chrono::high_resolution_clock::now(); + brls::NavigationMap navigationMap; + +protected: brls::Button* button1 = nullptr; brls::Button* button2 = nullptr; brls::Label* label = nullptr; - std::chrono::system_clock::time_point start = std::chrono::high_resolution_clock::now(); - brls::NavigationMap navigationMap; - bool erista = true; + virtual void CreateView(); + virtual void instantiateButtons(){}; public: - DialoguePage(brls::StagedAppletFrame* frame, const std::string& text, bool erista = true); + DialoguePage(){}; void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, brls::Style* style, brls::FrameContext* ctx) override; void layout(NVGcontext* vg, brls::Style* style, brls::FontStash* stash) override; brls::View* getDefaultFocus() override; brls::View* getNextFocus(brls::FocusDirection direction, brls::View* currentView); +}; + +class DialoguePage_fw : public DialoguePage +{ +private: + void instantiateButtons() override; + std::string text; + brls::StagedAppletFrame* frame; + +public: + DialoguePage_fw(brls::StagedAppletFrame* frame, const std::string& text) : DialoguePage(), text(text), frame(frame) { CreateView(); } + void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, brls::Style* style, brls::FrameContext* ctx) override; +}; + +class DialoguePage_ams : public DialoguePage +{ +private: + void instantiateButtons() override; + bool erista = true; + std::string text; + brls::StagedAppletFrame* frame; + +public: + DialoguePage_ams(brls::StagedAppletFrame* frame, const std::string& text, bool erista = true) : DialoguePage(), erista(erista), text(text), frame(frame) { CreateView(); } }; \ No newline at end of file diff --git a/resources/i18n/en-US/menus.json b/resources/i18n/en-US/menus.json index d373f38..d159f84 100644 --- a/resources/i18n/en-US/menus.json +++ b/resources/i18n/en-US/menus.json @@ -131,7 +131,7 @@ "download_cheats": "Download cheats", "tools": "Tools", "launch_warning": "Please pay attention to the following points before using the app:\n\n\ue016 Read up on how to manually update your Switch first. This will help you understand the app better and you'll know what to do in case something goes wrong.\n\ue016 Please note that using this app on a exFAT SD card is STRONGLY discouraged, as those are likely to corrupt.\n\n\ue016 Some new features and/or changes regarding current features may have been introduced. Please check them out via the Tools->Changelog menu.\n\nThis screen won't show again.", - "footer_text" : "v{} | {:.1f}GB available", + "footer_text": "v{} | {:.1f}GB available", "theme_warning": "It seems like you have a custom theme installed, this may cause your system to fail to boot after upgrading your firmware.\nPlease consider deleting it before upgrading." }, "hide": { @@ -185,6 +185,9 @@ "getting_ams": "Getting Atmosphère", "custom_packs_label": "Here are packs listed in the {} file. Be aware that those are not endorsed by aio-switch-updater so make sure you trust their source." }, + "firmware": { + "launch_daybreak": "Do you want to launch Daybreak to install the downloaded sysupdate?" + }, "net": { "title": "Internet settings" }, @@ -214,4 +217,4 @@ "zh-Hant": "Traditional Chinese (zh-Hant)", "zh-Hans": "Simplified Chinese (zh-Hans)" } -} +} \ No newline at end of file diff --git a/source/ams_tab.cpp b/source/ams_tab.cpp index f2ca2ef..e0cc117 100644 --- a/source/ams_tab.cpp +++ b/source/ams_tab.cpp @@ -104,7 +104,7 @@ void AmsTab::CreateStagedFrames(const std::string& text, const std::string& url, new WorkerPage(stagedFrame, "menus/common/extracting"_i18n, []() { util::extractArchive(archiveType::ams_cfw); })); if (hekate) { stagedFrame->addStage( - new DialoguePage(stagedFrame, text_hekate, erista)); + new DialoguePage_ams(stagedFrame, text_hekate, erista)); stagedFrame->addStage( new WorkerPage(stagedFrame, "menus/common/downloading"_i18n, [hekate_url]() { util::downloadArchive(hekate_url, archiveType::cfw); })); stagedFrame->addStage( diff --git a/source/dialogue_page.cpp b/source/dialogue_page.cpp index 3fd344d..d2b950f 100644 --- a/source/dialogue_page.cpp +++ b/source/dialogue_page.cpp @@ -2,6 +2,7 @@ #include #include +#include #include "fs.hpp" #include "main_frame.hpp" @@ -10,39 +11,15 @@ namespace i18n = brls::i18n; using namespace i18n::literals; -DialoguePage::DialoguePage(brls::StagedAppletFrame* frame, const std::string& text, bool erista) : erista(erista) +void DialoguePage::CreateView() { this->button1 = (new brls::Button(brls::ButtonStyle::REGULAR))->setLabel("menus/common/yes"_i18n); this->button1->setParent(this); this->button2 = (new brls::Button(brls::ButtonStyle::REGULAR))->setLabel("menus/common/no"_i18n); this->button2->setParent(this); - this->button1->getClickEvent()->subscribe([frame, this](View* view) { - if (!frame->isLastStage()) - frame->nextStage(); - else { - brls::Application::pushView(new MainFrame()); - } - }); + this->instantiateButtons(); - this->button2->getClickEvent()->subscribe([frame, this](View* view) { - if (this->erista) { - util::rebootToPayload(RCM_PAYLOAD_PATH); - } - else { - if (std::filesystem::exists(UPDATE_BIN_PATH)) { - fs::copyFile(UPDATE_BIN_PATH, MARIKO_PAYLOAD_PATH_TEMP); - } - else { - fs::copyFile(REBOOT_PAYLOAD_PATH, MARIKO_PAYLOAD_PATH_TEMP); - } - fs::copyFile(RCM_PAYLOAD_PATH, MARIKO_PAYLOAD_PATH); - util::shutDown(true); - } - brls::Application::popView(); - }); - - this->label = new brls::Label(brls::LabelStyle::DIALOG, "menus/ams_update/install_hekate"_i18n + "\n\n" + text, true); this->label->setHorizontalAlign(NVG_ALIGN_CENTER); this->label->setParent(this); @@ -114,3 +91,59 @@ brls::View* DialoguePage::getNextFocus(brls::FocusDirection direction, brls::Vie { return this->navigationMap.getNextFocus(direction, currentView); } + +void DialoguePage_ams::instantiateButtons() +{ + this->button1->getClickEvent()->subscribe([this](View* view) { + if (!frame->isLastStage()) + frame->nextStage(); + else { + brls::Application::pushView(new MainFrame()); + } + }); + + this->button2->getClickEvent()->subscribe([this](View* view) { + if (this->erista) { + util::rebootToPayload(RCM_PAYLOAD_PATH); + } + else { + if (std::filesystem::exists(UPDATE_BIN_PATH)) { + fs::copyFile(UPDATE_BIN_PATH, MARIKO_PAYLOAD_PATH_TEMP); + } + else { + fs::copyFile(REBOOT_PAYLOAD_PATH, MARIKO_PAYLOAD_PATH_TEMP); + } + fs::copyFile(RCM_PAYLOAD_PATH, MARIKO_PAYLOAD_PATH); + util::shutDown(true); + } + brls::Application::popView(); + }); + + this->label = new brls::Label(brls::LabelStyle::DIALOG, "menus/ams_update/install_hekate"_i18n + "\n\n" + this->text, true); +} + +void DialoguePage_fw::instantiateButtons() +{ + this->button2->getClickEvent()->subscribe([this](View* view) { + if (!frame->isLastStage()) + frame->nextStage(); + else { + brls::Application::pushView(new MainFrame()); + } + }); + + this->button1->getClickEvent()->subscribe([this](View* view) { + envSetNextLoad(DAYBREAK_PATH, fmt::format("\"{}\" \"/firmware\"", DAYBREAK_PATH).c_str()); + romfsExit(); + brls::Application::quit(); + }); + + this->label = new brls::Label(brls::LabelStyle::DIALOG, fmt::format("{}\n\n{}", this->text, "menus/firmware/launch_daybreak"_i18n), true); +} + +void DialoguePage_fw::draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, brls::Style* style, brls::FrameContext* ctx) +{ + this->label->frame(ctx); + this->button1->frame(ctx); + this->button2->frame(ctx); +} diff --git a/source/list_download_tab.cpp b/source/list_download_tab.cpp index b4454dc..3f08744 100644 --- a/source/list_download_tab.cpp +++ b/source/list_download_tab.cpp @@ -7,6 +7,7 @@ #include "app_page.hpp" #include "confirm_page.hpp" #include "current_cfw.hpp" +#include "dialogue_page.hpp" #include "download.hpp" #include "extract.hpp" #include "fs.hpp" @@ -92,14 +93,11 @@ ListDownloadTab::ListDownloadTab(const archiveType type) : brls::List() listItem->getClickEvent()->subscribe([&, text, url, type, operation, newCheatsVer, currentCheatsVer](brls::View* view) { brls::StagedAppletFrame* stagedFrame = new brls::StagedAppletFrame(); stagedFrame->setTitle(operation); - stagedFrame->addStage( - new ConfirmPage(stagedFrame, text)); + stagedFrame->addStage(new ConfirmPage(stagedFrame, text)); if (type != archiveType::cheats || newCheatsVer != currentCheatsVer || !std::filesystem::exists(CHEATS_ZIP_PATH)) { - stagedFrame->addStage( - new WorkerPage(stagedFrame, "menus/common/downloading"_i18n, [url, type]() { util::downloadArchive(url, type); })); + stagedFrame->addStage(new WorkerPage(stagedFrame, "menus/common/downloading"_i18n, [url, type]() { util::downloadArchive(url, type); })); } - stagedFrame->addStage( - new WorkerPage(stagedFrame, "menus/common/extracting"_i18n, [type]() { util::extractArchive(type); })); + stagedFrame->addStage(new WorkerPage(stagedFrame, "menus/common/extracting"_i18n, [type]() { util::extractArchive(type); })); std::string doneMsg = "menus/common/all_done"_i18n; switch (type) { case archiveType::fw: { @@ -110,16 +108,22 @@ ListDownloadTab::ListDownloadTab(const archiveType type) : brls::List() break; } } + if (std::filesystem::exists(DAYBREAK_PATH)) { + stagedFrame->addStage(new DialoguePage_fw(stagedFrame, doneMsg)); + } + else { + stagedFrame->addStage(new ConfirmPage(stagedFrame, doneMsg, true)); + } break; } case archiveType::sigpatches: doneMsg += "\n" + "menus/sigpatches/reboot"_i18n; + stagedFrame->addStage(new ConfirmPage(stagedFrame, doneMsg, true)); break; default: + stagedFrame->addStage(new ConfirmPage(stagedFrame, doneMsg, true)); break; } - stagedFrame->addStage( - new ConfirmPage(stagedFrame, doneMsg, true)); brls::Application::pushView(stagedFrame); }); this->addView(listItem); diff --git a/source/utils.cpp b/source/utils.cpp index 54abf53..19dc984 100644 --- a/source/utils.cpp +++ b/source/utils.cpp @@ -147,7 +147,7 @@ namespace util { case archiveType::app: extract::extract(APP_FILENAME, CONFIG_PATH); fs::copyFile(ROMFS_FORWARDER, FORWARDER_PATH); - envSetNextLoad(FORWARDER_PATH, ("\"" + std::string(FORWARDER_PATH) + "\"").c_str()); + envSetNextLoad(FORWARDER_PATH, fmt::format("\"{}\"", FORWARDER_PATH).c_str()); romfsExit(); brls::Application::quit(); break;