1
0
Fork 0
mirror of https://github.com/HamletDuFromage/aio-switch-updater.git synced 2024-12-29 10:56:01 +00:00

Added option to launch Daybreak with arguments after a sysupdate download

This commit is contained in:
flb 2021-09-12 15:01:40 +02:00
parent d03bbb13ea
commit 811eb4c18c
7 changed files with 112 additions and 42 deletions

View file

@ -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;

View file

@ -2,22 +2,50 @@
#include <borealis.hpp>
#include <chrono>
#include <iostream>
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(); }
};

View file

@ -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)"
}
}
}

View file

@ -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(

View file

@ -2,6 +2,7 @@
#include <algorithm>
#include <filesystem>
#include <iostream>
#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);
}

View file

@ -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);

View file

@ -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;