From 4bc09ae4361b6fc1f1a5044ea102e3fe6f3ce540 Mon Sep 17 00:00:00 2001 From: Dees_Troy Date: Fri, 18 Jan 2013 17:00:54 +0000 Subject: Improve ORS sideload to display GUI with cancel button --- gui/action.cpp | 6 ++-- gui/gui.cpp | 80 ++++++++++++++++++++++++++++++++++++++++++++++++-- gui/gui.h | 1 + openrecoveryscript.cpp | 52 +++++++++++++++----------------- 4 files changed, 106 insertions(+), 33 deletions(-) diff --git a/gui/action.cpp b/gui/action.cpp index 1f3647d16..14ef71609 100644 --- a/gui/action.cpp +++ b/gui/action.cpp @@ -253,9 +253,8 @@ int GUIAction::doActions() LOGE("Error setting pthread_attr_setstacksize\n"); return -1; } - LOGI("creating thread\n"); + LOGI("Creating thread\n"); int ret = pthread_create(&t, &tattr, thread_start, this); - LOGI("after thread creation\n"); if (ret) { LOGE("Unable to create more threads for actions... continuing in same thread! %i\n", ret); thread_start(this); @@ -1071,6 +1070,7 @@ int GUIAction::doAction(Action action, int isThreaded /* = 0 */) string result, Sideload_File; if (!PartitionManager.Mount_Current_Storage(true)) { + DataManager::SetValue("tw_page_done", "1"); // For OpenRecoveryScript support operation_end(1, simulate); return 0; } @@ -1101,6 +1101,7 @@ int GUIAction::doAction(Action action, int isThreaded /* = 0 */) } } } + DataManager::SetValue("tw_page_done", "1"); // For OpenRecoveryScript support operation_end(ret, simulate); return 0; } @@ -1113,6 +1114,7 @@ int GUIAction::doAction(Action action, int isThreaded /* = 0 */) DataManager::GetValue("tw_child_pid", child_pid); ui_print("Cancelling ADB sideload...\n"); kill(child_pid, SIGTERM); + DataManager::SetValue("tw_page_done", "1"); // For OpenRecoveryScript support return 0; } } diff --git a/gui/gui.cpp b/gui/gui.cpp index e128337b5..c431d8fe0 100644 --- a/gui/gui.cpp +++ b/gui/gui.cpp @@ -60,6 +60,7 @@ static int gGuiConsoleRunning = 0; static int gGuiConsoleTerminate = 0; static int gForceRender = 0; static int gNoAnimation = 1; +static int gGuiInputRunning = 0; // Needed by pages.cpp too int gGuiRunning = 0; @@ -391,6 +392,56 @@ static int runPages(void) return 0; } +static int runPage(const char* page_name) +{ + gui_changePage(page_name); + + // Raise the curtain + if (gCurtain != NULL) + { + gr_surface surface; + + PageManager::Render(); + gr_get_surface(&surface); + curtainRaise(surface); + gr_free_surface(surface); + } + + gGuiRunning = 1; + + DataManager::SetValue("tw_loaded", 1); + + for (;;) + { + loopTimer(); + + if (!gForceRender) + { + int ret; + + ret = PageManager::Update(); + if (ret > 1) + PageManager::Render(); + + if (ret > 0) + flip(); + } + else + { + gForceRender = 0; + PageManager::Render(); + flip(); + } + if (DataManager::GetIntValue("tw_page_done") != 0) { + gui_changePage("main"); + break; + } + } + + gGuiRunning = 0; + return 0; +} + int gui_forceRender(void) { gForceRender = 1; @@ -537,13 +588,36 @@ extern "C" int gui_start() // Set the default package PageManager::SelectPackage("TWRP"); - // Start by spinning off an input handler. - pthread_t t; - pthread_create(&t, NULL, input_thread, NULL); + if (!gGuiInputRunning) { + // Start by spinning off an input handler. + pthread_t t; + pthread_create(&t, NULL, input_thread, NULL); + gGuiInputRunning = 1; + } return runPages(); } +extern "C" int gui_startPage(const char* page_name) +{ + if (!gGuiInitialized) return -1; + + gGuiConsoleTerminate = 1; + while (gGuiConsoleRunning) loopTimer(); + + // Set the default package + PageManager::SelectPackage("TWRP"); + + if (!gGuiInputRunning) { + // Start by spinning off an input handler. + pthread_t t; + pthread_create(&t, NULL, input_thread, NULL); + gGuiInputRunning = 1; + } + + return runPage(page_name); +} + static void *console_thread(void *cookie) { PageManager::SwitchToConsole(); diff --git a/gui/gui.h b/gui/gui.h index 948e11b36..ee3cc272a 100644 --- a/gui/gui.h +++ b/gui/gui.h @@ -5,6 +5,7 @@ int gui_console_only(); int gui_init(); int gui_loadResources(); int gui_start(); +int gui_startPage(const char* page_name); void gui_print(const char *fmt, ...); void gui_print_overwrite(const char *fmt, ...); diff --git a/openrecoveryscript.cpp b/openrecoveryscript.cpp index e05f059fd..8e95555f7 100644 --- a/openrecoveryscript.cpp +++ b/openrecoveryscript.cpp @@ -40,6 +40,7 @@ extern "C" { #include "data.h" #include "twinstall.h" +#include "gui/gui.h" int TWinstall_zip(const char* path, int* wipe_cache); } @@ -66,7 +67,7 @@ int OpenRecoveryScript::check_for_script_file(void) { int OpenRecoveryScript::run_script_file(void) { FILE *fp = fopen(SCRIPT_FILE_TMP, "r"); - int ret_val = 0, cindex, line_len, i, remove_nl, install_cmd = 0; + int ret_val = 0, cindex, line_len, i, remove_nl, install_cmd = 0, sideload = 0; char script_line[SCRIPT_COMMAND_SIZE], command[SCRIPT_COMMAND_SIZE], value[SCRIPT_COMMAND_SIZE], mount[SCRIPT_COMMAND_SIZE], value1[SCRIPT_COMMAND_SIZE], value2[SCRIPT_COMMAND_SIZE]; @@ -328,34 +329,27 @@ int OpenRecoveryScript::run_script_file(void) { } else if (strcmp(command, "print") == 0) { ui_print("%s\n", value); } else if (strcmp(command, "sideload") == 0) { - int wipe_cache = 0; - string result, Sideload_File; - - if (!PartitionManager.Mount_Current_Storage(true)) { - continue; - } - Sideload_File = DataManager_GetCurrentStoragePath(); - Sideload_File += "/sideload.zip"; - if (TWFunc::Path_Exists(Sideload_File)) { - unlink(Sideload_File.c_str()); - } - ui_print("Starting ADB sideload feature...\n"); - ret_val = apply_from_adb(ui, &wipe_cache, Sideload_File.c_str()); - if (!ret_val && wipe_cache) - PartitionManager.Wipe_By_Path("/cache"); - if (DataManager_GetIntValue(TW_HAS_INJECTTWRP) == 1 && DataManager_GetIntValue(TW_INJECT_AFTER_ZIP) == 1) { - ui_print("Injecting TWRP into boot image...\n"); - TWPartition* Boot = PartitionManager.Find_Partition_By_Path("/boot"); - if (Boot == NULL || Boot->Current_File_System != "emmc") - TWFunc::Exec_Cmd("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash", result); - else { - string injectcmd = "injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash bd=" + Boot->Actual_Block_Device; - TWFunc::Exec_Cmd(injectcmd, result); - } - ui_print("TWRP injection complete.\n"); + // ADB Sideload + DataManager_SetStrValue("tw_page_done", "0"); + DataManager_SetStrValue("tw_back", "main"); + DataManager_SetStrValue("tw_action", "adbsideload"); + DataManager_SetStrValue("tw_has_action2", "0"); + DataManager_SetStrValue("tw_action2", ""); + DataManager_SetStrValue("tw_action2_param", ""); + DataManager_SetStrValue("tw_action_text1", "ADB Sideload"); + DataManager_SetStrValue("tw_action_text2", "Usage: adb sideload filename.zip"); + DataManager_SetStrValue("tw_complete_text1", "ADB Sideload Complete"); + DataManager_SetIntValue("tw_has_cancel", 1); + DataManager_SetIntValue("tw_show_reboot", 1); + DataManager_SetStrValue("tw_cancel_action", "adbsideloadcancel"); + DataManager_SetStrValue("tw_cancel_param", ""); + if (gui_startPage("action_page") != 0) { + LOGE("Failed to load sideload GUI page.\n"); } - ret_val = 1; // Causes device to go to the home screen afterwards - ui_print("Sideload finished.\nGoing to main screen.\n"); + DataManager_SetIntValue("tw_page_done", 1); + gui_console_only(); + sideload = 1; // Causes device to go to the home screen afterwards + ui_print("Sideload finished.\n"); } else { LOGE("Unrecognized script command: '%s'\n", command); ret_val = 1; @@ -379,6 +373,8 @@ int OpenRecoveryScript::run_script_file(void) { } ui_print("TWRP injection complete.\n"); } + if (sideload) + ret_val = 1; // Forces booting to the home page after sideload return ret_val; } -- cgit v1.2.3