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