copy log: add option to include logcat

Change-Id: I9689df4560d5209f385fbbc3e233859754b3ebbd
diff --git a/data.cpp b/data.cpp
index a40a7e5..bc31a65 100755
--- a/data.cpp
+++ b/data.cpp
@@ -932,6 +932,11 @@
 
 	mData.SetValue("tw_enable_adb_backup", "0");
 
+	if (TWFunc::Path_Exists("/sbin/logcat"))
+		mConst.SetValue("tw_logcat_exists", "1");
+	else
+		mConst.SetValue("tw_logcat_exists", "0");
+
 	if (TWFunc::Path_Exists("/sbin/magiskboot"))
 		mConst.SetValue("tw_has_repack_tools", "1");
 	else
diff --git a/gui/action.cpp b/gui/action.cpp
index dbe4ae7..b23fdeb 100755
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -669,8 +669,10 @@
 	{
 		string dst, curr_storage;
 		int copy_kernel_log = 0;
+		int copy_logcat = 1;
 
 		DataManager::GetValue("tw_include_kernel_log", copy_kernel_log);
+		DataManager::GetValue("tw_include_logcat", copy_logcat);
 		PartitionManager.Mount_Current_Storage(true);
 		curr_storage = DataManager::GetCurrentStoragePath();
 		dst = curr_storage + "/recovery.log";
@@ -678,6 +680,8 @@
 		tw_set_default_metadata(dst.c_str());
 		if (copy_kernel_log)
 			TWFunc::copy_kernel_log(curr_storage);
+		if (copy_logcat)
+			TWFunc::copy_logcat(curr_storage);
 		sync();
 		gui_msg(Msg("copy_log=Copied recovery log to {1}")(dst));
 	} else
diff --git a/gui/theme/common/landscape.xml b/gui/theme/common/landscape.xml
index 99cd126..ae9b4be 100755
--- a/gui/theme/common/landscape.xml
+++ b/gui/theme/common/landscape.xml
@@ -2842,7 +2842,7 @@
 						<action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
 						<action function="page">rebootcheck</action>
 					</actions>
-				</button>
+				</listitem>
 			</listbox>
 
 			<button style="main_button">
@@ -3465,7 +3465,14 @@
 			</text>
 
 			<checkbox>
+				<condition var1="tw_logcat_exists" var2="1"/>
 				<placement x="%indent%" y="%row4_y%"/>
+				<text>{@include_logcat=Include Logcat}</text>
+				<data variable="tw_include_logcat" value="1"/>
+			</checkbox>
+
+			<checkbox>
+				<placement x="%indent%" y="%row6_y%"/>
 				<text>{@include_kernel_log=Include Kernel Log}</text>
 				<data variable="tw_include_kernel_log" value="1"/>
 			</checkbox>
diff --git a/gui/theme/common/languages/en.xml b/gui/theme/common/languages/en.xml
index ac603e6..13b2975 100755
--- a/gui/theme/common/languages/en.xml
+++ b/gui/theme/common/languages/en.xml
@@ -740,7 +740,9 @@
 		<string name="twrp_adbbu_option">--twrp option is required to enable twrp adb backup</string>
 		<string name="partition_not_found">path: {1} not found in partititon list</string>
 		<string name="copy_kernel_log">Copied kernel log to {1}</string>
+		<string name="copy_logcat">Copied logcat to {1}</string>
 		<string name="include_kernel_log">Include Kernel Log</string>
+		<string name="include_logcat">Include Logcat</string>
 		<string name="sha2_chk">Use SHA2 for hashing</string>
 		<string name="unable_set_boot_slot">Error changing bootloader boot slot to {1}</string>
 		<string name="unmount_sys_install">Unmount System before installing a ZIP</string>
diff --git a/gui/theme/common/portrait.xml b/gui/theme/common/portrait.xml
index 4f36e46..4efed64 100755
--- a/gui/theme/common/portrait.xml
+++ b/gui/theme/common/portrait.xml
@@ -2998,7 +2998,7 @@
 						<action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
 						<action function="page">rebootcheck</action>
 					</actions>
-				</button>
+				</listitem>
 			</listbox>
 
 			<text style="text_m">
@@ -3586,7 +3586,14 @@
 			</text>
 
 			<checkbox>
+				<condition var1="tw_logcat_exists" var2="1"/>
 				<placement x="%indent%" y="%row4_y%"/>
+				<text>{@include_logcat=Include Logcat}</text>
+				<data variable="tw_include_logcat" value="1"/>
+			</checkbox>
+
+			<checkbox>
+				<placement x="%indent%" y="%row6_y%"/>
 				<text>{@include_kernel_log=Include Kernel Log}</text>
 				<data variable="tw_include_kernel_log" value="1"/>
 			</checkbox>
diff --git a/gui/theme/common/watch.xml b/gui/theme/common/watch.xml
index 251e0f6..171fc38 100755
--- a/gui/theme/common/watch.xml
+++ b/gui/theme/common/watch.xml
@@ -266,6 +266,13 @@
 				<data variable="tw_include_kernel_log" value="1"/>
 			</checkbox>
 
+			<checkbox>
+				<condition var1="tw_logcat_exists" var2="1"/>
+				<placement x="%indent%" y="%row2_y%"/>
+				<text>{@include_logcat=Include Logcat}</text>
+				<data variable="tw_include_logcat" value="1"/>
+			</checkbox>
+
 			<slider>
 				<text>{@swipe_confirm=   Confirm}</text>
 				<actions>
diff --git a/twrp-functions.cpp b/twrp-functions.cpp
index 983d277..246d73e 100755
--- a/twrp-functions.cpp
+++ b/twrp-functions.cpp
@@ -1231,6 +1231,17 @@
 	tw_set_default_metadata(dmesgDst.c_str());
 }
 
+void TWFunc::copy_logcat(string curr_storage) {
+	std::string logcatDst = curr_storage + "/logcat.txt";
+	std::string logcatCmd = "logcat -d";
+
+	std::string result;
+	Exec_Cmd(logcatCmd, result, false);
+	write_to_file(logcatDst, result);
+	gui_msg(Msg("copy_logcat=Copied logcat to {1}")(logcatDst));
+	tw_set_default_metadata(logcatDst.c_str());
+}
+
 bool TWFunc::isNumber(string strtocheck) {
 	int num = 0;
 	std::istringstream iss(strtocheck);
diff --git a/twrp-functions.hpp b/twrp-functions.hpp
index cd772e5..0009c8b 100755
--- a/twrp-functions.hpp
+++ b/twrp-functions.hpp
@@ -113,6 +113,7 @@
 	static void Disable_Stock_Recovery_Replace(); // Disable stock ROMs from replacing TWRP with stock recovery
 	static unsigned long long IOCTL_Get_Block_Size(const char* block_device);
 	static void copy_kernel_log(string curr_storage); // Copy Kernel Log to Current Storage (PSTORE/KMSG)
+	static void copy_logcat(string curr_storage); // Copy Logcat to Current Storage
 	static bool isNumber(string strtocheck); // return true if number, false if not a number
 	static int stream_adb_backup(string &Restore_Name); // Tell ADB Backup to Stream to TWRP from GUI selection
 	static std::string get_log_dir(); // return recovery log storage directory