Improve adb sideload -- add cancel
Also copy zip from /tmp to storage and remove from /tmp to
prevent running out of RAM.
diff --git a/adb_install.cpp b/adb_install.cpp
index 12bce1c..f5ba89c 100644
--- a/adb_install.cpp
+++ b/adb_install.cpp
@@ -33,6 +33,7 @@
extern "C" {
#include "minadbd/adb.h"
#include "twinstall.h"
+#include "data.h"
int TWinstall_zip(const char* path, int* wipe_cache);
}
@@ -86,6 +87,7 @@
execl("/sbin/recovery", "recovery", "--adbd", NULL);
_exit(-1);
}
+ DataManager_SetIntValue("tw_child_pid", child);
int status;
// TODO(dougz): there should be a way to cancel waiting for a
// package (by pushing some button combo on the device). For now
@@ -108,5 +110,17 @@
}
return INSTALL_ERROR;
}
- return TWinstall_zip(ADB_SIDELOAD_FILENAME, wipe_cache);
+ char zip_file[255];
+ if (strncmp(ADB_SIDELOAD_FILENAME, "/tmp", 4) == 0) {
+ char command[255];
+ sprintf(zip_file, "%s/%s", DataManager_GetCurrentStoragePath(), "sideload.zip");
+ ui->Print("Copying zip to '%s'\n", zip_file);
+ sprintf(command, "cp %s %s", ADB_SIDELOAD_FILENAME, zip_file);
+ system(command);
+ sprintf(command, "rm %s", ADB_SIDELOAD_FILENAME);
+ system(command);
+ } else {
+ strcpy(zip_file, ADB_SIDELOAD_FILENAME);
+ }
+ return TWinstall_zip(zip_file, wipe_cache);
}
diff --git a/gui/action.cpp b/gui/action.cpp
index 5118b4c..4114bf0 100644
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -1057,16 +1057,42 @@
simulate_progress_bar();
} else {
int wipe_cache = 0;
+ string Command;
+
+ if (!PartitionManager.Mount_Current_Storage(true)) {
+ operation_end(1, simulate);
+ return 0;
+ }
+ if (TWFunc::Path_Exists(ADB_SIDELOAD_FILENAME)) {
+ Command = "rm ";
+ Command += ADB_SIDELOAD_FILENAME;
+ system(Command.c_str());
+ }
+ Command = "touch ";
+ Command += ADB_SIDELOAD_FILENAME;
+ system(Command.c_str());
ui_print("Starting ADB sideload feature...\n");
- system("touch /tmp/update.zip");
- ret = apply_from_adb(ui, &wipe_cache, "/tmp/last_install");
- LOGI("Result was: %i\n", ret);
+ ret = apply_from_adb(ui, &wipe_cache, "/tmp/install_log");
if (ret != 0)
- ret = 1;
+ ret = 1; // failure
+ else if (wipe_cache)
+ PartitionManager.Wipe_By_Path("/cache");
}
operation_end(ret, simulate);
return 0;
}
+ if (function == "adbsideloadcancel")
+ {
+ int child_pid;
+ string Command;
+ Command = "rm ";
+ Command += ADB_SIDELOAD_FILENAME;
+ system(Command.c_str());
+ DataManager::GetValue("tw_child_pid", child_pid);
+ ui_print("Cancelling ADB sideload...\n");
+ kill(child_pid, SIGTERM);
+ return 0;
+ }
}
else
{
diff --git a/gui/devices/800x1280/res/ui.xml b/gui/devices/800x1280/res/ui.xml
index decfcad..a131e89 100755
--- a/gui/devices/800x1280/res/ui.xml
+++ b/gui/devices/800x1280/res/ui.xml
@@ -67,7 +67,7 @@
<variable name="row9_text_y" value="570" />
<variable name="row10_text_y" value="620" />
<variable name="row11_text_y" value="670" />
- <variable name="row12_text_y" value="700" />
+ <variable name="row12_text_y" value="720" />
<variable name="row13_text_y" value="770" />
<variable name="row14_text_y" value="820" />
<variable name="row15_text_y" value="870" />
@@ -909,6 +909,69 @@
</object>
</page>
+ <page name="action_page_cancel">
+ <object type="template" name="header" />
+
+ <object type="text" color="%text_color%">
+ <font resource="font" />
+ <placement x="%center_x%" y="%row1_text_y%" placement="5" />
+ <text>%tw_action_text1%</text>
+ </object>
+
+ <object type="text" color="%text_color%">
+ <font resource="font" />
+ <placement x="%center_x%" y="%row2_text_y%" placement="5" />
+ <text>%tw_action_text2%</text>
+ </object>
+
+ <object type="button">
+ <placement x="%col_center_x%" y="%row4_y%" />
+ <font resource="font" color="%button_text_color%" />
+ <text>Cancel</text>
+ <image resource="main_button" />
+ <action function="%tw_cancel_function%"></action>
+ </object>
+
+ <object type="template" name="action_page_console" />
+
+ <object type="template" name="progress_bar" />
+
+ <object type="action">
+ <conditions>
+ <condition var1="tw_operation_state" var2="1" />
+ <condition var1="tw_operation_status" var2="0" />
+ </conditions>
+ <actions>
+ <action function="page">action_complete</action>
+ </actions>
+ </object>
+
+ <object type="action">
+ <conditions>
+ <condition var1="tw_operation_state" var2="1" />
+ <condition var1="tw_operation_status" op="!=" var2="0" />
+ </conditions>
+ <actions>
+ <action function="page">action_complete</action>
+ </actions>
+ </object>
+
+ <object type="action">
+ <condition var1="tw_has_action2" var2="0" />
+ <actions>
+ <action function="%tw_action%">%tw_action_param%</action>
+ </actions>
+ </object>
+
+ <object type="action">
+ <condition var1="tw_has_action2" var2="1" />
+ <actions>
+ <action function="%tw_action%">%tw_action_param%</action>
+ <action function="%tw_action2%">%tw_action2_param%</action>
+ </actions>
+ </object>
+ </page>
+
<page name="action_complete">
<object type="template" name="header" />
@@ -2546,12 +2609,13 @@
<text>ADB Sideload</text>
<image resource="main_button" />
<actions>
+ <action function="set">tw_back=advanced</action>
<action function="set">tw_action=adbsideload</action>
<action function="set">tw_action_text1=ADB Sideload</action>
<action function="set">tw_action_text2=Usage: adb sideload filename.zip</action>
<action function="set">tw_complete_text1=ADB Sideload Complete</action>
- <action function="set">tw_slider_text=Swipe to Wipe</action>
- <action function="page">action_page</action>
+ <action function="set">tw_cancel_function=adbsideloadcancel</action>
+ <action function="page">action_page_cancel</action>
</actions>
</object>
diff --git a/recovery.cpp b/recovery.cpp
index b333db9..b8bb099 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -773,6 +773,10 @@
int
main(int argc, char **argv) {
+ // Recovery needs to install world-readable files, so clear umask
+ // set by init
+ umask(0);
+
time_t start = time(NULL);
// If these fail, there's not really anywhere to complain...
@@ -792,9 +796,6 @@
}
printf("Starting TWRP %s on %s", TW_VERSION_STR, ctime(&start));
- // Recovery needs to install world-readable files, so clear umask
- // set by init
- umask(0);
Device* device = make_device();
ui = device->GetUI();