summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--Android.mk6
-rw-r--r--data.cpp4
-rw-r--r--gui/action.cpp59
-rwxr-xr-xgui/theme/common/landscape.xml87
-rwxr-xr-xgui/theme/common/languages/en.xml1
-rwxr-xr-xgui/theme/common/portrait.xml90
-rwxr-xr-xgui/theme/common/watch.xml91
-rw-r--r--partition.cpp18
-rw-r--r--partitionmanager.cpp165
-rw-r--r--prebuilt/Android.mk30
-rwxr-xr-xprebuilt/sgdisk_staticbin0 -> 489732 bytes
-rw-r--r--twrp-functions.cpp19
-rw-r--r--twrp-functions.hpp1
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
diff --git a/data.cpp b/data.cpp
index 5cca3a102..c945f2af0 100644
--- a/data.cpp
+++ b/data.cpp
@@ -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} &gt; {@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
new file mode 100755
index 000000000..eb8a129ce
--- /dev/null
+++ b/prebuilt/sgdisk_static
Binary files differ
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);