diff options
-rw-r--r-- | Android.mk | 6 | ||||
-rw-r--r-- | data.cpp | 4 | ||||
-rw-r--r-- | gui/action.cpp | 59 | ||||
-rwxr-xr-x | gui/theme/common/landscape.xml | 87 | ||||
-rwxr-xr-x | gui/theme/common/languages/en.xml | 1 | ||||
-rwxr-xr-x | gui/theme/common/portrait.xml | 90 | ||||
-rwxr-xr-x | gui/theme/common/watch.xml | 91 | ||||
-rw-r--r-- | partition.cpp | 18 | ||||
-rw-r--r-- | partitionmanager.cpp | 165 | ||||
-rw-r--r-- | prebuilt/Android.mk | 30 | ||||
-rwxr-xr-x | prebuilt/sgdisk_static | bin | 0 -> 489732 bytes | |||
-rw-r--r-- | twrp-functions.cpp | 19 | ||||
-rw-r--r-- | twrp-functions.hpp | 1 |
13 files changed, 411 insertions, 160 deletions
diff --git a/Android.mk b/Android.mk index 44149736b..0ac82ba99 100644 --- a/Android.mk +++ b/Android.mk @@ -374,7 +374,11 @@ ifneq ($(TW_NO_EXFAT), true) LOCAL_ADDITIONAL_DEPENDENCIES += mkexfatfs fsckexfat endif ifeq ($(BOARD_HAS_NO_REAL_SDCARD),) - LOCAL_ADDITIONAL_DEPENDENCIES += parted + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 22; echo $$?),0) + LOCAL_ADDITIONAL_DEPENDENCIES += sgdisk + else + LOCAL_ADDITIONAL_DEPENDENCIES += sgdisk_static + endif endif ifneq ($(TW_EXCLUDE_ENCRYPTED_BACKUPS), true) LOCAL_ADDITIONAL_DEPENDENCIES += openaes ../openaes/LICENSE @@ -794,8 +794,8 @@ void DataManager::SetDefaultValues() mValues.insert(make_pair(TW_RM_RF_VAR, make_pair("0", 1))); mValues.insert(make_pair(TW_SKIP_MD5_CHECK_VAR, make_pair("0", 1))); mValues.insert(make_pair(TW_SKIP_MD5_GENERATE_VAR, make_pair("0", 1))); - mValues.insert(make_pair(TW_SDEXT_SIZE, make_pair("512", 1))); - mValues.insert(make_pair(TW_SWAP_SIZE, make_pair("32", 1))); + mValues.insert(make_pair(TW_SDEXT_SIZE, make_pair("0", 1))); + mValues.insert(make_pair(TW_SWAP_SIZE, make_pair("0", 1))); mValues.insert(make_pair(TW_SDPART_FILE_SYSTEM, make_pair("ext3", 1))); mValues.insert(make_pair(TW_TIME_ZONE_GUISEL, make_pair("CST6;CDT,M3.2.0,M11.1.0", 1))); mValues.insert(make_pair(TW_TIME_ZONE_GUIOFFSET, make_pair("0", 1))); diff --git a/gui/action.cpp b/gui/action.cpp index 656c687b9..e13d15c68 100644 --- a/gui/action.cpp +++ b/gui/action.cpp @@ -792,25 +792,27 @@ int GUIAction::generatebackupname(std::string arg __unused) return 0; } -int GUIAction::checkpartitionlist(std::string arg __unused) +int GUIAction::checkpartitionlist(std::string arg) { - string Wipe_List, wipe_path; + string List, part_path; int count = 0; - DataManager::GetValue("tw_wipe_list", Wipe_List); - LOGINFO("checkpartitionlist list '%s'\n", Wipe_List.c_str()); - if (!Wipe_List.empty()) { - size_t start_pos = 0, end_pos = Wipe_List.find(";", start_pos); - while (end_pos != string::npos && start_pos < Wipe_List.size()) { - wipe_path = Wipe_List.substr(start_pos, end_pos - start_pos); - LOGINFO("checkpartitionlist wipe_path '%s'\n", wipe_path.c_str()); - if (wipe_path == "/and-sec" || wipe_path == "DALVIK" || wipe_path == "INTERNAL") { + if (arg.empty()) + arg = "tw_wipe_list"; + DataManager::GetValue(arg, List); + LOGINFO("checkpartitionlist list '%s'\n", List.c_str()); + if (!List.empty()) { + size_t start_pos = 0, end_pos = List.find(";", start_pos); + while (end_pos != string::npos && start_pos < List.size()) { + part_path = List.substr(start_pos, end_pos - start_pos); + LOGINFO("checkpartitionlist part_path '%s'\n", part_path.c_str()); + if (part_path == "/and-sec" || part_path == "DALVIK" || part_path == "INTERNAL") { // Do nothing } else { count++; } start_pos = end_pos + 1; - end_pos = Wipe_List.find(";", start_pos); + end_pos = List.find(";", start_pos); } DataManager::SetValue("tw_check_partition_list", count); } else { @@ -819,29 +821,32 @@ int GUIAction::checkpartitionlist(std::string arg __unused) return 0; } -int GUIAction::getpartitiondetails(std::string arg __unused) +int GUIAction::getpartitiondetails(std::string arg) { - string Wipe_List, wipe_path; + string List, part_path; int count = 0; - DataManager::GetValue("tw_wipe_list", Wipe_List); - LOGINFO("getpartitiondetails list '%s'\n", Wipe_List.c_str()); - if (!Wipe_List.empty()) { - size_t start_pos = 0, end_pos = Wipe_List.find(";", start_pos); - while (end_pos != string::npos && start_pos < Wipe_List.size()) { - wipe_path = Wipe_List.substr(start_pos, end_pos - start_pos); - LOGINFO("getpartitiondetails wipe_path '%s'\n", wipe_path.c_str()); - if (wipe_path == "/and-sec" || wipe_path == "DALVIK" || wipe_path == "INTERNAL") { + if (arg.empty()) + arg = "tw_wipe_list"; + DataManager::GetValue(arg, List); + LOGINFO("getpartitiondetails list '%s'\n", List.c_str()); + if (!List.empty()) { + size_t start_pos = 0, end_pos = List.find(";", start_pos); + part_path = List; + while (end_pos != string::npos && start_pos < List.size()) { + part_path = List.substr(start_pos, end_pos - start_pos); + LOGINFO("getpartitiondetails part_path '%s'\n", part_path.c_str()); + if (part_path == "/and-sec" || part_path == "DALVIK" || part_path == "INTERNAL") { // Do nothing } else { - DataManager::SetValue("tw_partition_path", wipe_path); + DataManager::SetValue("tw_partition_path", part_path); break; } start_pos = end_pos + 1; - end_pos = Wipe_List.find(";", start_pos); + end_pos = List.find(";", start_pos); } - if (!wipe_path.empty()) { - TWPartition* Part = PartitionManager.Find_Partition_By_Path(wipe_path); + if (!part_path.empty()) { + TWPartition* Part = PartitionManager.Find_Partition_By_Path(part_path); if (Part) { unsigned long long mb = 1048576; @@ -881,12 +886,14 @@ int GUIAction::getpartitiondetails(std::string arg __unused) DataManager::SetValue("tw_partition_ext", 0); return 0; } else { - LOGERR("Unable to locate partition: '%s'\n", wipe_path.c_str()); + LOGERR("Unable to locate partition: '%s'\n", part_path.c_str()); } } } DataManager::SetValue("tw_partition_name", ""); DataManager::SetValue("tw_partition_file_system", ""); + // Set this to 0 to prevent trying to partition this device, just in case + DataManager::SetValue("tw_partition_removable", 0); return 0; } diff --git a/gui/theme/common/landscape.xml b/gui/theme/common/landscape.xml index 6c91d0659..57fef4040 100755 --- a/gui/theme/common/landscape.xml +++ b/gui/theme/common/landscape.xml @@ -1068,7 +1068,7 @@ <placement x="%col1_x_left%" y="%row15a_y%"/> <text>{@repair_change_btn=Repair or Change File System}</text> <actions> - <action function="checkpartitionlist"/> + <action function="checkpartitionlist">tw_wipe_list</action> <action function="page">checkpartitionlist</action> </actions> </button> @@ -1179,7 +1179,7 @@ <condition var1="tw_check_partition_list" op="=" var2="1"/> <actions> <action function="set">partitionlisterror=0</action> - <action function="getpartitiondetails"/> + <action function="getpartitiondetails">tw_wipe_list</action> <action function="page">partitionoptions</action> </actions> </action> @@ -1188,7 +1188,6 @@ <condition var1="tw_check_partition_list" op="!=" var2="1"/> <actions> <action function="set">partitionlisterror=1</action> - <action function="set">tw_wipe_list=</action> <action function="page">advancedwipe</action> </actions> </action> @@ -1271,6 +1270,7 @@ <action function="set">tw_action_param=%tw_partition_mount_point%</action> <action function="set">tw_has_action2=1</action> <action function="set">tw_action2=getpartitiondetails</action> + <action function="set">tw_action2_param=tw_wipe_list</action> <action function="set">tw_text1={@resize_confirm=Resize %tw_partition_name%?}</action> <action function="set">tw_text2=</action> <action function="set">tw_action_text1={@resizing=Resizing...}</action> @@ -1320,7 +1320,7 @@ <condition var1="tw_check_partition_list" op="=" var2="1"/> <actions> <action function="set">partitionlisterror=0</action> - <action function="getpartitiondetails"/> + <action function="getpartitiondetails">tw_wipe_list</action> <action function="page">selectfilesystem</action> </actions> </action> @@ -3091,7 +3091,10 @@ <condition var1="tw_allow_partition_sdcard" var2="1"/> <placement x="%col1_x_left%" y="%row6a_y%"/> <text>{@part_sd_btn=Partition SD Card}</text> - <action function="page">partsdcard</action> + <actions> + <action function="set">partitionlisterror=0</action> + <action function="page">partsdcardsel</action> + </actions> </button> <button style="main_button"> @@ -3151,6 +3154,69 @@ </action> </page> + <page name="partsdcardsel"> + <template name="page"/> + + <text style="text_l"> + <placement x="%col1_x_header%" y="%row3_header_y%"/> + <text>{@advanced_hdr=Advanced}</text> + </text> + + <text style="text_m"> + <placement x="%col1_x_header%" y="%row4_header_y%"/> + <text>{@part_sd_hdr=Partition SD Card}</text> + </text> + + <partitionlist style="partitionlist_storage"> + <text>{@sel_storage_list=Select Storage}</text> + <data name="tw_storage_path"/> + <listtype name="storage"/> + </partitionlist> + + <button style="button_third_width"> + <placement x="%dialog_button_x%" y="%row13_y%"/> + <text>{@ok_btn=OK}</text> + <actions> + <action function="getpartitiondetails">tw_storage_path</action> + <action function="page">partsdcardcheck</action> + </actions> + </button> + + <text style="text_m_fail"> + <condition var1="partitionlisterror" var2="1"/> + <placement x="%center_x%" y="%row17_y%" placement="5"/> + <text>{@invalid_partsd_sel=You must select a removable device}</text> + </text> + + <action> + <touch key="home"/> + <action function="page">main</action> + </action> + + <action> + <touch key="back"/> + <action function="page">advanced</action> + </action> + </page> + + <page name="partsdcardcheck"> + <action> + <condition var1="tw_partition_removable" op="=" var2="1"/> + <actions> + <action function="set">partitionlisterror=0</action> + <action function="page">partsdcard</action> + </actions> + </action> + + <action> + <condition var1="tw_partition_removable" op="!=" var2="1"/> + <actions> + <action function="set">partitionlisterror=1</action> + <action function="page">partsdcardsel</action> + </actions> + </action> + </page> + <page name="partsdcard"> <template name="page"/> @@ -3187,13 +3253,13 @@ <button style="button_quarter_width"> <placement x="%btn4_col3_x_left%" y="%row5_y%"/> <text>{@part_sd_m=-}</text> - <action function="addsubtract">tw_sdext_size-128</action> + <action function="addsubtract">tw_sdext_size-256</action> </button> <button style="button_quarter_width"> <placement x="%btn4_col2_x_right%" y="%row5_y%"/> <text>{@part_sd_p=+}</text> - <action function="addsubtract">tw_sdext_size+128</action> + <action function="addsubtract">tw_sdext_size+256</action> </button> <text style="text_m_accent"> @@ -3209,13 +3275,13 @@ <button style="button_quarter_width"> <placement x="%btn4_col3_x_left%" y="%row9_y%"/> <text>{@part_sd_m=-}</text> - <action function="addsubtract">tw_swap_size-32</action> + <action function="addsubtract">tw_swap_size-64</action> </button> <button style="button_quarter_width"> <placement x="%btn4_col2_x_right%" y="%row9_y%"/> <text>{@part_sd_p=+}</text> - <action function="addsubtract">tw_swap_size+32</action> + <action function="addsubtract">tw_swap_size+64</action> </button> <text style="text_m_accent"> @@ -3263,7 +3329,7 @@ <action> <touch key="back"/> - <action function="page">advanced</action> + <action function="page">partsdcardsel</action> </action> </page> @@ -4353,7 +4419,6 @@ <slider style="slider_centered"> <text>{@swipe_to_sideload=Swipe to Start Sideload}</text> - <action function="page">partsdcardaction</action> <actions> <action function="set">tw_back=advanced</action> <action function="set">tw_action=adbsideload</action> diff --git a/gui/theme/common/languages/en.xml b/gui/theme/common/languages/en.xml index 9669e70ca..c77d3a2e1 100755 --- a/gui/theme/common/languages/en.xml +++ b/gui/theme/common/languages/en.xml @@ -379,6 +379,7 @@ <string name="inject_twrp_complete">TWRP Injection Complete</string> <string name="swipe_to_confirm">Swipe to Confirm</string> <string name="part_sd_hdr">Partition SD Card</string> + <string name="invalid_partsd_sel">You must select a removable device</string> <string name="part_sd_lose">You will lose all files on your SD card!</string> <string name="part_sd_undo">This action cannot be undone!</string> <string name="part_sd_ext_sz">EXT Size:</string> diff --git a/gui/theme/common/portrait.xml b/gui/theme/common/portrait.xml index 251be75c6..d93a2737e 100755 --- a/gui/theme/common/portrait.xml +++ b/gui/theme/common/portrait.xml @@ -1020,7 +1020,7 @@ <placement x="%indent%" y="%row18a_y%"/> <text>{@repair_change_btn=Repair or Change File System}</text> <actions> - <action function="checkpartitionlist"/> + <action function="checkpartitionlist">tw_wipe_list</action> <action function="page">checkpartitionlist</action> </actions> </button> @@ -1136,7 +1136,7 @@ <condition var1="tw_check_partition_list" op="=" var2="1"/> <actions> <action function="set">partitionlisterror=0</action> - <action function="getpartitiondetails"/> + <action function="getpartitiondetails">tw_wipe_list</action> <action function="page">partitionoptions</action> </actions> </action> @@ -1145,7 +1145,6 @@ <condition var1="tw_check_partition_list" op="!=" var2="1"/> <actions> <action function="set">partitionlisterror=1</action> - <action function="set">tw_wipe_list=</action> <action function="page">advancedwipe</action> </actions> </action> @@ -1228,6 +1227,7 @@ <action function="set">tw_action_param=%tw_partition_mount_point%</action> <action function="set">tw_has_action2=1</action> <action function="set">tw_action2=getpartitiondetails</action> + <action function="set">tw_action2_param=tw_wipe_list</action> <action function="set">tw_text1={@resize_confirm=Resize %tw_partition_name%?}</action> <action function="set">tw_text2=</action> <action function="set">tw_action_text1={@resizing=Resizing...}</action> @@ -1277,7 +1277,7 @@ <condition var1="tw_check_partition_list" op="=" var2="1"/> <actions> <action function="set">partitionlisterror=0</action> - <action function="getpartitiondetails"/> + <action function="getpartitiondetails">tw_wipe_list</action> <action function="page">selectfilesystem</action> </actions> </action> @@ -3161,7 +3161,10 @@ <condition var1="tw_allow_partition_sdcard" var2="1"/> <placement x="%indent%" y="%row8_y%"/> <text>{@part_sd_btn=Partition SD Card}</text> - <action function="page">partsdcard</action> + <actions> + <action function="set">partitionlisterror=0</action> + <action function="page">partsdcardsel</action> + </actions> </button> <button style="main_button"> @@ -3221,6 +3224,69 @@ </action> </page> + <page name="partsdcardsel"> + <template name="page"/> + + <text style="text_l"> + <placement x="%col1_x_header%" y="%row3_header_y%"/> + <text>{@advanced_hdr=Advanced}</text> + </text> + + <text style="text_m"> + <placement x="%col1_x_header%" y="%row4_header_y%"/> + <text>{@part_sd_hdr=Partition SD Card}</text> + </text> + + <partitionlist style="partitionlist_storage"> + <text>{@sel_storage_list=Select Storage}</text> + <data name="tw_storage_path"/> + <listtype name="storage"/> + </partitionlist> + + <text style="text_m_fail"> + <condition var1="partitionlisterror" var2="1"/> + <placement x="%center_x%" y="%row17_y%" placement="5"/> + <text>{@invalid_partsd_sel=You must select a removable device}</text> + </text> + + <button style="button_third_width"> + <placement x="%dialog_button_x%" y="%row14_y%"/> + <text>{@ok_btn=OK}</text> + <actions> + <action function="getpartitiondetails">tw_storage_path</action> + <action function="page">partsdcardcheck</action> + </actions> + </button> + + <action> + <touch key="home"/> + <action function="page">main</action> + </action> + + <action> + <touch key="back"/> + <action function="page">advanced</action> + </action> + </page> + + <page name="partsdcardcheck"> + <action> + <condition var1="tw_partition_removable" op="=" var2="1"/> + <actions> + <action function="set">partitionlisterror=0</action> + <action function="page">partsdcard</action> + </actions> + </action> + + <action> + <condition var1="tw_partition_removable" op="!=" var2="1"/> + <actions> + <action function="set">partitionlisterror=1</action> + <action function="page">partsdcardsel</action> + </actions> + </action> + </page> + <page name="partsdcard"> <template name="page"/> @@ -3257,13 +3323,13 @@ <button style="button_quarter_width"> <placement x="%indent%" y="%row6_y%"/> <text>{@part_sd_m=-}</text> - <action function="addsubtract">tw_sdext_size-128</action> + <action function="addsubtract">tw_sdext_size-256</action> </button> <button style="button_quarter_width"> <placement x="%btn4_col4_x%" y="%row6_y%"/> <text>{@part_sd_p=+}</text> - <action function="addsubtract">tw_sdext_size+128</action> + <action function="addsubtract">tw_sdext_size+256</action> </button> <text style="text_m_accent"> @@ -3279,13 +3345,13 @@ <button style="button_quarter_width"> <placement x="%indent%" y="%row10_y%"/> <text>{@part_sd_m=-}</text> - <action function="addsubtract">tw_swap_size-32</action> + <action function="addsubtract">tw_swap_size-64</action> </button> <button style="button_quarter_width"> <placement x="%btn4_col4_x%" y="%row10_y%"/> <text>{@part_sd_p=+}</text> - <action function="addsubtract">tw_swap_size+32</action> + <action function="addsubtract">tw_swap_size+64</action> </button> <text style="text_m_accent"> @@ -3333,7 +3399,10 @@ <action> <touch key="back"/> - <action function="page">advanced</action> + <actions> + <action function="set">partitionlisterror=0</action> + <action function="page">partsdcardsel</action> + </actions> </action> </page> @@ -4242,7 +4311,6 @@ <slider> <text>{@swipe_to_sideload=Swipe to Start Sideload}</text> - <action function="page">partsdcardaction</action> <actions> <action function="set">tw_back=advanced</action> <action function="set">tw_action=adbsideload</action> diff --git a/gui/theme/common/watch.xml b/gui/theme/common/watch.xml index 7d343ddb9..6ed0b8373 100755 --- a/gui/theme/common/watch.xml +++ b/gui/theme/common/watch.xml @@ -1422,7 +1422,7 @@ <condition var1="tw_check_partition_list" op="=" var2="1"/> <actions> <action function="set">partitionlisterror=0</action> - <action function="getpartitiondetails"/> + <action function="getpartitiondetails">tw_wipe_list</action> <action function="page">partitionoptions</action> </actions> </action> @@ -1431,7 +1431,6 @@ <condition var1="tw_check_partition_list" op="!=" var2="1"/> <actions> <action function="set">partitionlisterror=1</action> - <action function="set">tw_wipe_list=</action> <action function="page">partitionoptions_select</action> </actions> </action> @@ -1471,7 +1470,7 @@ <placement x="%btn4_col4_x%" y="%row11_y%"/> <highlight color="%highlight_color%"/> <image resource="q_btn_arrow_right"/><actions> - <action function="checkpartitionlist"/> + <action function="checkpartitionlist">tw_wipe_list</action> <action function="page">checkpartitionlist</action> </actions> </button> @@ -1562,6 +1561,7 @@ <action function="set">tw_action_param=%tw_partition_mount_point%</action> <action function="set">tw_has_action2=1</action> <action function="set">tw_action2=getpartitiondetails</action> + <action function="set">tw_action2_param=tw_wipe_list</action> <action function="set">tw_text1={@resize_confirm=Resize %tw_partition_name%?}</action> <action function="set">tw_text2=</action> <action function="set">tw_action_text1={@resizing=Resizing...}</action> @@ -1618,7 +1618,7 @@ <condition var1="tw_check_partition_list" op="=" var2="1"/> <actions> <action function="set">partitionlisterror=0</action> - <action function="getpartitiondetails"/> + <action function="getpartitiondetails">tw_wipe_list</action> <action function="page">selectfilesystem</action> </actions> </action> @@ -3896,7 +3896,10 @@ <condition var1="tw_allow_partition_sdcard" var2="1"/> <placement x="%col1_x_right%" y="%row6_y%"/> <text>{@part_sd_s_btn=SD Card}</text> - <action function="page">partsdcard</action> + <actions> + <action function="set">partitionlisterror=0</action> + <action function="page">partsdcardsel</action> + </actions> </button> <button style="main_button"> @@ -3932,6 +3935,73 @@ </action> </page> + <page name="partsdcardsel"> + <template name="page"/> + + <template name="statusbar"/> + + <text style="text_m"> + <placement x="%col1_x_left%" y="%row1_header_y%"/> + <text>{@advanced_hdr=Advanced} > {@part_sd_hdr=Partition SD Card}</text> + </text> + + <partitionlist style="partitionlist_headerless_rb"> + <data name="tw_storage_path"/> + <listtype name="storage"/> + </partitionlist> + + <text style="text_m_fail"> + <condition var1="partitionlisterror" var2="1"/> + <placement x="%center_x%" y="%row9_y%" placement="5"/> + <text>{@invalid_partsd_sel=You must select a removable device}</text> + </text> + + <button> + <placement x="%btn4_col2_x%" y="%row11_y%"/> + <highlight color="%highlight_color%"/> + <image resource="q_btn_refresh"/> + <action function="refreshsizes"/> + </button> + + <button> + <placement x="%btn4_col3_x%" y="%row11_y%"/> + <highlight color="%highlight_color%"/> + <image resource="q_btn_accept"/> + <actions> + <action function="getpartitiondetails">tw_storage_path</action> + <action function="page">partsdcardcheck</action> + </actions> + </button> + + <action> + <touch key="home"/> + <action function="page">main</action> + </action> + + <action> + <touch key="back"/> + <action function="page">advanced</action> + </action> + </page> + + <page name="partsdcardcheck"> + <action> + <condition var1="tw_partition_removable" op="=" var2="1"/> + <actions> + <action function="set">partitionlisterror=0</action> + <action function="page">partsdcard</action> + </actions> + </action> + + <action> + <condition var1="tw_partition_removable" op="!=" var2="1"/> + <actions> + <action function="set">partitionlisterror=1</action> + <action function="page">partsdcardsel</action> + </actions> + </action> + </page> + <page name="partsdcard"> <template name="page"/> @@ -3965,13 +4035,13 @@ <button style="main_button_quarter_width"> <placement x="%indent%" y="%row6_y%"/> <text>{@part_sd_m=-}</text> - <action function="addsubtract">tw_sdext_size-128</action> + <action function="addsubtract">tw_sdext_size-256</action> </button> <button style="main_button_quarter_width"> <placement x="%btn4_col4_x%" y="%row6_y%"/> <text>{@part_sd_p=+}</text> - <action function="addsubtract">tw_sdext_size+128</action> + <action function="addsubtract">tw_sdext_size+256</action> </button> <button> @@ -3988,7 +4058,7 @@ <action> <touch key="back"/> - <action function="page">advanced</action> + <action function="page">partsdcardsel</action> </action> </page> @@ -4025,13 +4095,13 @@ <button style="main_button_quarter_width"> <placement x="%indent%" y="%row6_y%"/> <text>{@part_sd_m=-}</text> - <action function="addsubtract">tw_swap_size-32</action> + <action function="addsubtract">tw_swap_size-64</action> </button> <button style="main_button_quarter_width"> <placement x="%btn4_col4_x%" y="%row6_y%"/> <text>{@part_sd_p=+}</text> - <action function="addsubtract">tw_swap_size+32</action> + <action function="addsubtract">tw_swap_size+64</action> </button> <button> @@ -5052,7 +5122,6 @@ <slider> <text>{@swipe_sideload= Start}</text> - <action function="page">partsdcardaction</action> <actions> <action function="set">tw_back=install_type</action> <action function="set">tw_action=adbsideload</action> diff --git a/partition.cpp b/partition.cpp index 2f37d6f89..a8de4a903 100644 --- a/partition.cpp +++ b/partition.cpp @@ -880,23 +880,9 @@ bool TWPartition::Get_Size_Via_df(bool Display_Error) { } unsigned long long TWPartition::IOCTL_Get_Block_Size() { - unsigned long block_device_size; - int ret = 0; - Find_Actual_Block_Device(); - int fd = open(Actual_Block_Device.c_str(), O_RDONLY); - if (fd < 0) { - LOGINFO("Find_Partition_Size: Failed to open '%s', (%s)\n", Actual_Block_Device.c_str(), strerror(errno)); - } else { - ret = ioctl(fd, BLKGETSIZE, &block_device_size); - close(fd); - if (ret) { - LOGINFO("Find_Partition_Size: ioctl error: (%s)\n", strerror(errno)); - } else { - return (unsigned long long)(block_device_size) * 512LLU; - } - } - return 0; + + return TWFunc::IOCTL_Get_Block_Size(Actual_Block_Device.c_str()); } bool TWPartition::Find_Partition_Size(void) { diff --git a/partitionmanager.cpp b/partitionmanager.cpp index c1cd29f22..4cd3e7d59 100644 --- a/partitionmanager.cpp +++ b/partitionmanager.cpp @@ -30,6 +30,8 @@ #include <iostream> #include <iomanip> #include <sys/wait.h> +#include <linux/fs.h> +#include <sys/mount.h> #include "variables.h" #include "twcommon.h" #include "partitions.hpp" @@ -1658,20 +1660,20 @@ void TWPartitionManager::UnMount_Main_Partitions(void) { int TWPartitionManager::Partition_SDCard(void) { char mkdir_path[255], temp[255], line[512]; - string Command, Device, fat_str, ext_str, swap_str, start_loc, end_loc, ext_format, sd_path, tmpdevice; + string Storage_Path, Command, Device, fat_str, ext_str, start_loc, end_loc, ext_format, sd_path, tmpdevice; int ext, swap, total_size = 0, fat_size; - FILE* fp; gui_msg("start_partition_sd=Partitioning SD Card..."); -#ifdef TW_EXTERNAL_STORAGE_PATH - TWPartition* SDCard = Find_Partition_By_Path(EXPAND(TW_EXTERNAL_STORAGE_PATH)); -#else - TWPartition* SDCard = Find_Partition_By_Path("/sdcard"); -#endif + + // Locate and validate device to partition + TWPartition* SDCard = Find_Partition_By_Path(DataManager::GetCurrentStoragePath()); + if (SDCard == NULL || !SDCard->Removable || SDCard->Has_Data_Media) { gui_err("partition_sd_locate=Unable to locate device to partition."); return false; } + + // Unmount everything if (!SDCard->UnMount(true)) return false; TWPartition* SDext = Find_Partition_By_Path("/sd-ext"); @@ -1679,58 +1681,57 @@ int TWPartitionManager::Partition_SDCard(void) { if (!SDext->UnMount(true)) return false; } - - TWFunc::Exec_Cmd("umount \"$SWAPPATH\""); - Device = SDCard->Actual_Block_Device; - // Just use the root block device - Device.resize(strlen("/dev/block/mmcblkX")); - - // Find the size of the block device: - fp = fopen("/proc/partitions", "rt"); - if (fp == NULL) { - gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")("/proc/partitions")(strerror(errno))); - return false; + char* swappath = getenv("SWAPPATH"); + if (swappath != NULL) { + LOGINFO("Unmounting swap at '%s'\n", swappath); + umount(swappath); } - while (fgets(line, sizeof(line), fp) != NULL) - { - unsigned long major, minor, blocks; - char device[512]; - char tmpString[64]; - - if (strlen(line) < 7 || line[0] == 'm') continue; - sscanf(line + 1, "%lu %lu %lu %s", &major, &minor, &blocks, device); - - tmpdevice = "/dev/block/"; - tmpdevice += device; - if (tmpdevice == Device) { - // Adjust block size to byte size - total_size = (int)(blocks * 1024ULL / 1000000LLU); - break; - } + // Determine block device + if (SDCard->Alternate_Block_Device.empty()) { + SDCard->Find_Actual_Block_Device(); + Device = SDCard->Actual_Block_Device; + // Just use the root block device + Device.resize(strlen("/dev/block/mmcblkX")); + } else { + Device = SDCard->Alternate_Block_Device; } - fclose(fp); + + // Find the size of the block device: + total_size = (int)(TWFunc::IOCTL_Get_Block_Size(Device.c_str()) / (1048576)); DataManager::GetValue("tw_sdext_size", ext); DataManager::GetValue("tw_swap_size", swap); DataManager::GetValue("tw_sdpart_file_system", ext_format); fat_size = total_size - ext - swap; - LOGINFO("sd card block device is '%s', sdcard size is: %iMB, fat size: %iMB, ext size: %iMB, ext system: '%s', swap size: %iMB\n", Device.c_str(), total_size, fat_size, ext, ext_format.c_str(), swap); - memset(temp, 0, sizeof(temp)); - sprintf(temp, "%i", fat_size); - fat_str = temp; - memset(temp, 0, sizeof(temp)); - sprintf(temp, "%i", fat_size + ext); - ext_str = temp; - memset(temp, 0, sizeof(temp)); - sprintf(temp, "%i", fat_size + ext + swap); - swap_str = temp; + LOGINFO("sd card mount point %s block device is '%s', sdcard size is: %iMB, fat size: %iMB, ext size: %iMB, ext system: '%s', swap size: %iMB\n", DataManager::GetCurrentStoragePath().c_str(), Device.c_str(), total_size, fat_size, ext, ext_format.c_str(), swap); + + // Determine partition sizes + if (swap == 0 && ext == 0) { + fat_str = "-0"; + } else { + memset(temp, 0, sizeof(temp)); + sprintf(temp, "%i", fat_size); + fat_str = temp; + fat_str += "MB"; + } + if (swap == 0) { + ext_str = "-0"; + } else { + memset(temp, 0, sizeof(temp)); + sprintf(temp, "%i", ext); + ext_str = "+"; + ext_str += temp; + ext_str += "MB"; + } + if (ext + swap > total_size) { gui_err("ext_swap_size=EXT + Swap size is larger than sdcard size."); return false; } + gui_msg("remove_part_table=Removing partition table..."); - Command = "parted -s " + Device + " mklabel msdos"; + Command = "sgdisk --zap-all " + Device; LOGINFO("Command is: '%s'\n", Command.c_str()); if (TWFunc::Exec_Cmd(Command) != 0) { gui_err("unable_rm_part=Unable to remove partition table."); @@ -1738,7 +1739,7 @@ int TWPartitionManager::Partition_SDCard(void) { return false; } gui_msg(Msg("create_part=Creating {1} partition...")("FAT32")); - Command = "parted " + Device + " mkpartfs primary fat32 0 " + fat_str + "MB"; + Command = "sgdisk --new=0:0:" + fat_str + " --change-name=0:\"Microsoft basic data\" " + Device; LOGINFO("Command is: '%s'\n", Command.c_str()); if (TWFunc::Exec_Cmd(Command) != 0) { gui_msg(Msg(msg::kError, "unable_to_create_part=Unable to create {1} partition.")("FAT32")); @@ -1746,7 +1747,7 @@ int TWPartitionManager::Partition_SDCard(void) { } if (ext > 0) { gui_msg(Msg("create_part=Creating {1} partition...")("EXT")); - Command = "parted " + Device + " mkpartfs primary ext2 " + fat_str + "MB " + ext_str + "MB"; + Command = "sgdisk --new=0:0:" + ext_str + " --change-name=0:\"Linux filesystem\" " + Device; LOGINFO("Command is: '%s'\n", Command.c_str()); if (TWFunc::Exec_Cmd(Command) != 0) { gui_msg(Msg(msg::kError, "unable_to_create_part=Unable to create {1} partition.")("EXT")); @@ -1756,7 +1757,7 @@ int TWPartitionManager::Partition_SDCard(void) { } if (swap > 0) { gui_msg(Msg("create_part=Creating {1} partition...")("swap")); - Command = "parted " + Device + " mkpartfs primary linux-swap " + ext_str + "MB " + swap_str + "MB"; + Command = "sgdisk --new=0:0:-0 --change-name=0:\"Linux swap\" --typecode=0:0657FD6D-A4AB-43C4-84E5-0933C84B4F4F " + Device; LOGINFO("Command is: '%s'\n", Command.c_str()); if (TWFunc::Exec_Cmd(Command) != 0) { gui_msg(Msg(msg::kError, "unable_to_create_part=Unable to create {1} partition.")("swap")); @@ -1764,38 +1765,52 @@ int TWPartitionManager::Partition_SDCard(void) { return false; } } - // recreate TWRP folder and rewrite settings - these will be gone after sdcard is partitioned -#ifdef TW_EXTERNAL_STORAGE_PATH - Mount_By_Path(EXPAND(TW_EXTERNAL_STORAGE_PATH), 1); - DataManager::GetValue(TW_EXTERNAL_PATH, sd_path); - memset(mkdir_path, 0, sizeof(mkdir_path)); - sprintf(mkdir_path, "%s/TWRP", sd_path.c_str()); -#else - Mount_By_Path("/sdcard", 1); - strcpy(mkdir_path, "/sdcard/TWRP"); -#endif - mkdir(mkdir_path, 0777); - DataManager::Flush(); -#ifdef TW_EXTERNAL_STORAGE_PATH - DataManager::SetValue(TW_ZIP_EXTERNAL_VAR, EXPAND(TW_EXTERNAL_STORAGE_PATH)); - if (DataManager::GetIntValue(TW_USE_EXTERNAL_STORAGE) == 1) - DataManager::SetValue(TW_ZIP_LOCATION_VAR, EXPAND(TW_EXTERNAL_STORAGE_PATH)); -#else - DataManager::SetValue(TW_ZIP_EXTERNAL_VAR, "/sdcard"); - if (DataManager::GetIntValue(TW_USE_EXTERNAL_STORAGE) == 1) - DataManager::SetValue(TW_ZIP_LOCATION_VAR, "/sdcard"); -#endif + + // Convert GPT to MBR + Command = "sgdisk --gpttombr " + Device; + if (TWFunc::Exec_Cmd(Command) != 0) + LOGINFO("Failed to covert partition GPT to MBR\n"); + + // Tell the kernel to rescan the partition table + int fd = open(Device.c_str(), O_RDONLY); + ioctl(fd, BLKRRPART, 0); + close(fd); + + string format_device = Device; + if (Device.substr(0, 17) == "/dev/block/mmcblk") + format_device += "p"; + + // Format new partitions to proper file system + if (fat_size > 0) { + Command = "mkfs.fat " + format_device + "1"; + TWFunc::Exec_Cmd(Command); + } if (ext > 0) { if (SDext == NULL) { - LOGERR("Unable to locate sd-ext partition.\n"); - return false; + Command = "mke2fs -t " + ext_format + " -m 0 " + format_device + "2"; + gui_msg(Msg("format_sdext_as=Formatting sd-ext as {1}...")(ext_format)); + LOGINFO("Formatting sd-ext after partitioning, command: '%s'\n", Command.c_str()); + TWFunc::Exec_Cmd(Command); + } else { + SDext->Wipe(ext_format); } - Command = "mke2fs -t " + ext_format + " -m 0 " + SDext->Actual_Block_Device; - gui_msg(Msg("format_sdext_as=Formatting sd-ext as {1}...")(ext_format)); - LOGINFO("Formatting sd-ext after partitioning, command: '%s'\n", Command.c_str()); + } + if (swap > 0) { + Command = "mkswap " + format_device; + if (ext > 0) + Command += "3"; + else + Command += "2"; TWFunc::Exec_Cmd(Command); } + // recreate TWRP folder and rewrite settings - these will be gone after sdcard is partitioned + if (SDCard->Mount(true)) { + string TWRP_Folder = SDCard->Mount_Point + "/TWRP"; + mkdir(TWRP_Folder.c_str(), 0777); + DataManager::Flush(); + } + Update_System_Details(); gui_msg("part_complete=Partitioning complete."); return true; diff --git a/prebuilt/Android.mk b/prebuilt/Android.mk index df14bbdac..81954257c 100644 --- a/prebuilt/Android.mk +++ b/prebuilt/Android.mk @@ -201,6 +201,11 @@ else RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mkntfs endif endif +ifeq ($(BOARD_HAS_NO_REAL_SDCARD),) + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 22; echo $$?),0) + RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/sgdisk + endif +endif TWRP_AUTOGEN := $(intermediates)/teamwin @@ -241,14 +246,25 @@ LOCAL_SRC_FILES := $(LOCAL_MODULE) include $(BUILD_PREBUILT) ifeq ($(BOARD_HAS_NO_REAL_SDCARD),) + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0) + #prebuilt, static sgdisk + include $(CLEAR_VARS) + LOCAL_MODULE := sgdisk_static + LOCAL_MODULE_STEM := sgdisk + LOCAL_MODULE_TAGS := eng + LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES + LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin + LOCAL_SRC_FILES := $(LOCAL_MODULE) + include $(BUILD_PREBUILT) + endif #parted - include $(CLEAR_VARS) - LOCAL_MODULE := parted - LOCAL_MODULE_TAGS := eng - LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES - LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin - LOCAL_SRC_FILES := $(LOCAL_MODULE) - include $(BUILD_PREBUILT) + #include $(CLEAR_VARS) + #LOCAL_MODULE := parted + #LOCAL_MODULE_TAGS := eng + #LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES + #LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin + #LOCAL_SRC_FILES := $(LOCAL_MODULE) + #include $(BUILD_PREBUILT) endif # copy license file for OpenAES diff --git a/prebuilt/sgdisk_static b/prebuilt/sgdisk_static Binary files differnew file mode 100755 index 000000000..eb8a129ce --- /dev/null +++ b/prebuilt/sgdisk_static diff --git a/twrp-functions.cpp b/twrp-functions.cpp index 6eb6cd59d..def265ca6 100644 --- a/twrp-functions.cpp +++ b/twrp-functions.cpp @@ -1043,4 +1043,23 @@ void TWFunc::Disable_Stock_Recovery_Replace(void) { } } +unsigned long long TWFunc::IOCTL_Get_Block_Size(const char* block_device) { + unsigned long block_device_size; + int ret = 0; + + int fd = open(block_device, O_RDONLY); + if (fd < 0) { + LOGINFO("Find_Partition_Size: Failed to open '%s', (%s)\n", block_device, strerror(errno)); + } else { + ret = ioctl(fd, BLKGETSIZE, &block_device_size); + close(fd); + if (ret) { + LOGINFO("Find_Partition_Size: ioctl error: (%s)\n", strerror(errno)); + } else { + return (unsigned long long)(block_device_size) * 512LLU; + } + } + return 0; +} + #endif // ndef BUILD_TWRPTAR_MAIN diff --git a/twrp-functions.hpp b/twrp-functions.hpp index d49cd8499..d72c9161b 100644 --- a/twrp-functions.hpp +++ b/twrp-functions.hpp @@ -85,6 +85,7 @@ public: static std::string to_string(unsigned long value); //convert ul to string static void SetPerformanceMode(bool mode); // support recovery.perf.mode 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); private: static void Copy_Log(string Source, string Destination); |