diff --git a/crypto/fscrypt/Decrypt.cpp b/crypto/fscrypt/Decrypt.cpp
index 00554715..02173588 100755
--- a/crypto/fscrypt/Decrypt.cpp
+++ b/crypto/fscrypt/Decrypt.cpp
@@ -1080,15 +1080,21 @@ int Get_Password_Type(const userid_t user_id, std::string& filename) {
printf("Failed to Get_Password_Data\n");
return 0;
}
- if (pwd.password_type == 1) { // In Android this means pattern
+ // In Android type 1 is pattern
+ // In Android <11 type 2 is PIN or password
+ // In Android 11+ type 3 is PIN and type 4 is password
+ if (pwd.password_type == 2) {
+ printf("password type: password/PIN\n");
+ return 1; // In TWRP this means password or PIN (Android <11)
+ } else if (pwd.password_type == 4) {
+ printf("password type: password\n");
+ return 1; // In TWRP this means password
+ } else if (pwd.password_type == 1) {
printf("password type: pattern\n");
return 2; // In TWRP this means pattern
- }
- // In Android <11 type 2 is PIN or password
- // In Android 11 type 3 is PIN and type 4 is password
- else if (pwd.password_type > 1) {
- printf("password type: pin\n");
- return 1; // In TWRP this means PIN or password
+ } else if (pwd.password_type == 3) {
+ printf("password type: PIN\n");
+ return 3; // In TWRP this means PIN
}
printf("using default password\n");
return 0; // We'll try the default password
diff --git a/crypto/fscrypt/KeyStorage.cpp b/crypto/fscrypt/KeyStorage.cpp
index edb23a27..8afc5792 100755
--- a/crypto/fscrypt/KeyStorage.cpp
+++ b/crypto/fscrypt/KeyStorage.cpp
@@ -62,6 +62,8 @@ static constexpr size_t STRETCHED_BYTES = 1 << 6;
static constexpr uint32_t AUTH_TIMEOUT = 30; // Seconds
+static const std::string kPkmBlob("pKMblob\x00", 8);
+
static const char* kCurrentVersion = "1";
static const char* kRmPath = "/system/bin/rm";
static const char* kSecdiscardPath = "/system/bin/secdiscard";
@@ -247,6 +249,10 @@ static KeymasterOperation begin(Keymaster& keymaster, const std::string& dir,
auto kmKeyPath = dir + "/" + kFn_keymaster_key_blob;
std::string kmKey;
if (!readFileToString(kmKeyPath, &kmKey)) return KeymasterOperation();
+ // In A12 keymaster_key_blob format changed:
+ // it have useless for us bytes in beginning, so remove them to correctly handle key
+ if (!kmKey.compare(0, kPkmBlob.size(), kPkmBlob))
+ kmKey.erase(0, kPkmBlob.size());
km::AuthorizationSet inParams(keyParams);
inParams.append(opParams.begin(), opParams.end());
for (;;) {
@@ -590,6 +596,10 @@ bool retrieveKey(const std::string& dir, const KeyAuthentication& auth, KeyBuffe
static bool deleteKey(const std::string& dir) {
std::string kmKey;
if (!readFileToString(dir + "/" + kFn_keymaster_key_blob, &kmKey)) return false;
+ // In A12 keymaster_key_blob format changed:
+ // it have useless for us bytes in beginning, so remove them to correctly handle key
+ if (!kmKey.compare(0, kPkmBlob.size(), kPkmBlob))
+ kmKey.erase(0, kPkmBlob.size());
Keymaster keymaster;
if (!keymaster) return false;
if (!keymaster.deleteKey(kmKey)) return false;
diff --git a/crypto/fscrypt/MetadataCrypt.cpp b/crypto/fscrypt/MetadataCrypt.cpp
index e9b19672..853e81eb 100755
--- a/crypto/fscrypt/MetadataCrypt.cpp
+++ b/crypto/fscrypt/MetadataCrypt.cpp
@@ -174,7 +174,7 @@ static bool read_key(const std::string& metadata_key_dir, const KeyGeneration& g
unlink(newKeyPath.c_str());
}
bool needs_cp = cp_needsCheckpoint();
- if (!retrieveOrGenerateKey(dir, temp, kEmptyAuthentication, gen, key, needs_cp)) return false;
+ if (!retrieveOrGenerateKey(dir, temp, kEmptyAuthentication, gen, key, true)) return false;
if (needs_cp && pathExists(newKeyPath)) std::thread(commit_key, dir).detach();
return true;
}
diff --git a/gui/action.cpp b/gui/action.cpp
index 96727518..819e4ad8 100755
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -1942,15 +1942,15 @@ int GUIAction::setbootslot(std::string arg)
{
operation_start("Set Boot Slot");
if (!simulate) {
- if (!PartitionManager.UnMount_By_Path("/vendor", false)) {
- // PartitionManager failed to unmount /vendor, this should not happen,
- // but in case it does, do a lazy unmount
- LOGINFO("WARNING: vendor partition could not be unmounted normally!\n");
- umount2("/vendor", MNT_DETACH);
- PartitionManager.Set_Active_Slot(arg);
- } else {
- PartitionManager.Set_Active_Slot(arg);
+ if (PartitionManager.Find_Partition_By_Path("/vendor")) {
+ if (!PartitionManager.UnMount_By_Path("/vendor", false)) {
+ // PartitionManager failed to unmount /vendor, this should not happen,
+ // but in case it does, do a lazy unmount
+ LOGINFO("WARNING: vendor partition could not be unmounted normally!\n");
+ umount2("/vendor", MNT_DETACH);
+ }
}
+ PartitionManager.Set_Active_Slot(arg);
} else {
simulate_progress_bar();
}
diff --git a/gui/theme/common/landscape.xml b/gui/theme/common/landscape.xml
index fa00b8d8..157b4612 100755
--- a/gui/theme/common/landscape.xml
+++ b/gui/theme/common/landscape.xml
@@ -2196,6 +2196,83 @@
select_storage
+
+
+
+ restore_pin
+
+
+
+
+
+
+
+ restore_read
+
+
+
+
+
+ main
+
+
+
+
+ main
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tw_multiuser_warning_destination=restore
+ multiuser_warning
+
+
+
+
+
+ {@restore_hdr=Restore}
+
+
+
+
+ {@restore_sel_store_hdr=Select Backup from %tw_storage_display_name% (%tw_storage_free_size% MB)}
+
+
+
+
+
+
+ {@restore_sel_pack_fs=Select Package to Restore:}
+
+
+
+
+
+
+
+
+
+
+ restore_pin
+
+
@@ -2840,7 +2917,7 @@
-
+
tw_back=fastbootreboot
@@ -2867,13 +2944,6 @@
-
-
- reboot2
-
-
-
-
@@ -2978,7 +3048,7 @@
-
+
tw_back=reboot
@@ -2996,18 +3066,6 @@
-
-
@@ -4773,6 +4831,11 @@ edi
decrypt_pattern
+
+
+ decrypt_pin
+
+
{@mount_hdr=Mount}
@@ -4902,6 +4965,69 @@ edi
+
+
+
+
+
+ {@mount_hdr=Mount}
+
+
+
+
+ {@decrypt_data_hdr=Decrypt Data}
+
+
+
+
+
+ {@decrypt_data_enter_pass=Enter PIN:}
+
+
+
+
+
+ {@decrypt_data_enter_pass_fbe=Enter PIN for User [%tw_crypto_user_id%]}
+
+
+
+
+ %tw_crypto_display%
+
+
+ trydecrypt
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {@decrypt_data_failed=PIN failed, please try again!}
+
+
+
+
+
+
+
+
+
@@ -5982,5 +6108,63 @@ edi
+
+
+
+
+
+
+
+ {@restore_with_pin1=PIN/Password is enabled}
+
+
+
+
+
+ {@restore_with_pin2=PIN/Password should be disabled before restore}
+
+
+
+
+ {@restore_pin=Restore While PIN/Password Enabled?}
+
+
+
+
+
+ {@restore_with_pattern1=Pattern is enabled}
+
+
+
+
+
+ {@restore_with_pattern2=Pattern should be disabled before restore}
+
+
+
+
+
+ {@restore_pattern=Restore While Pattern Enabled?}
+
+
+
+ {@continue_restore_encrypted=Continue Restore?}
+
+ restore_force
+
+
+
+
+
+ main
+
+
+
+
+
+ main
+
+
+
diff --git a/gui/theme/common/languages/cz.xml b/gui/theme/common/languages/cz.xml
index 7f7fc3cb..e15b2a72 100644
--- a/gui/theme/common/languages/cz.xml
+++ b/gui/theme/common/languages/cz.xml
@@ -262,7 +262,7 @@
Recovery
Bootloader
Stáhnout
- Edl
+ EDL
Vypínání...
Potáhnout pro vypnutí
Vypnout
diff --git a/gui/theme/common/languages/de.xml b/gui/theme/common/languages/de.xml
index 09b5c98c..92cf03c7 100644
--- a/gui/theme/common/languages/de.xml
+++ b/gui/theme/common/languages/de.xml
@@ -292,7 +292,7 @@
Recovery
Bootloader
Download
- Edl
+ EDL
Ausschalten...
Gerät ausschalten
Ausschalten
diff --git a/gui/theme/common/languages/el.xml b/gui/theme/common/languages/el.xml
index 8ac681d2..688299a9 100644
--- a/gui/theme/common/languages/el.xml
+++ b/gui/theme/common/languages/el.xml
@@ -273,7 +273,7 @@
Recovery
Bootloader
Λήψη
- Edl
+ EDL
Απενεργοποίηση...
Σύρετε για Απενεργοποίηση
Απενεργοποίηση
diff --git a/gui/theme/common/languages/en.xml b/gui/theme/common/languages/en.xml
index f1b93b55..1f3e4949 100755
--- a/gui/theme/common/languages/en.xml
+++ b/gui/theme/common/languages/en.xml
@@ -293,7 +293,7 @@
Recovery
Bootloader
Download
- Edl
+ EDL
Turning Off...
Swipe to Power Off
Power Off
@@ -782,5 +782,16 @@
Merge Snapshots?
Merging Snapshots...
Merged Snapshots
+ Restore While PIN/Password Enabled?
+ Restore While Pattern Enabled?
+ Restore While PIN Enabled?
+ Continue Restore?
+ PIN/Password is enabled
+ PIN/Password should be disabled before restore
+ PIN is enabled
+ PIN should be disabled before restore
+ Pattern is enabled
+ Pattern should be disabled before restore
+ It is recommended to reboot Android once after first boot.
diff --git a/gui/theme/common/languages/es.xml b/gui/theme/common/languages/es.xml
index e096e660..bdf9b24b 100644
--- a/gui/theme/common/languages/es.xml
+++ b/gui/theme/common/languages/es.xml
@@ -263,7 +263,7 @@
Recovery
Bootloader
Descarga
- Edl
+ EDL
Apagando...
Deslice para Apagar
Apagar
diff --git a/gui/theme/common/languages/fr.xml b/gui/theme/common/languages/fr.xml
index 6ae3298e..6e824af5 100644
--- a/gui/theme/common/languages/fr.xml
+++ b/gui/theme/common/languages/fr.xml
@@ -260,7 +260,7 @@
Récupération
Amorçage
Télécharger
- Edl
+ EDL
Arrêt en cours...
Glisser pour éteindre
Éteindre
diff --git a/gui/theme/common/languages/hu.xml b/gui/theme/common/languages/hu.xml
index 96557ac7..2030889e 100644
--- a/gui/theme/common/languages/hu.xml
+++ b/gui/theme/common/languages/hu.xml
@@ -283,7 +283,7 @@
Recovery
Bootloader
Download mód
- Edl
+ EDL
Kikapcsolás...
Csúsztasson a kikapcsoláshoz
Kikapcsolás
diff --git a/gui/theme/common/languages/id.xml b/gui/theme/common/languages/id.xml
index ecbe7ff4..5ace582c 100755
--- a/gui/theme/common/languages/id.xml
+++ b/gui/theme/common/languages/id.xml
@@ -293,7 +293,7 @@
Recovery
Bootloader
Download
- Edl
+ EDL
Mematikan...
Geser untuk Matikan
Matikan Perangkat
diff --git a/gui/theme/common/languages/it.xml b/gui/theme/common/languages/it.xml
index ec74d59a..3427710f 100644
--- a/gui/theme/common/languages/it.xml
+++ b/gui/theme/common/languages/it.xml
@@ -283,7 +283,7 @@
Recovery
Bootloader
Download
- Edl
+ EDL
Spegnimento in corso...
Scorri per spegnere
Spegni
diff --git a/gui/theme/common/languages/nl.xml b/gui/theme/common/languages/nl.xml
index efd84e75..37e712a9 100644
--- a/gui/theme/common/languages/nl.xml
+++ b/gui/theme/common/languages/nl.xml
@@ -287,7 +287,7 @@
Recovery
Bootloader
Download
- Edl
+ EDL
Wordt uitgeschakeld...
Veeg om uit te schakelen
Uitschakelen
diff --git a/gui/theme/common/languages/pl.xml b/gui/theme/common/languages/pl.xml
index e337455a..697a7c41 100644
--- a/gui/theme/common/languages/pl.xml
+++ b/gui/theme/common/languages/pl.xml
@@ -270,7 +270,7 @@
Recovery
Bootloader
Download
- Edl
+ EDL
Wyłączanie...
Przesuń, aby wyłączyć
Wyłącz
diff --git a/gui/theme/common/languages/pt_BR.xml b/gui/theme/common/languages/pt_BR.xml
index f540e4c4..9f717b5e 100644
--- a/gui/theme/common/languages/pt_BR.xml
+++ b/gui/theme/common/languages/pt_BR.xml
@@ -262,7 +262,7 @@
Recuperação
Bootloader
Baixar
- Edl
+ EDL
Desligar...
Deslize para desligar
Desligar
diff --git a/gui/theme/common/languages/pt_PT.xml b/gui/theme/common/languages/pt_PT.xml
index 32463f1b..ee589eb0 100644
--- a/gui/theme/common/languages/pt_PT.xml
+++ b/gui/theme/common/languages/pt_PT.xml
@@ -291,7 +291,7 @@
Recovery
Bootloader
Descarregar
- Edl
+ EDL
A desligar...
Deslize para desligar
Desligar
diff --git a/gui/theme/common/languages/ru.xml b/gui/theme/common/languages/ru.xml
index 63878576..50e33676 100644
--- a/gui/theme/common/languages/ru.xml
+++ b/gui/theme/common/languages/ru.xml
@@ -317,6 +317,7 @@
Основные
Основные
Использовать rm -rf вместо форматирования
+ Автоматически перепрошивать TWRP после установки прошивки
Использовать 24-часовой формат времени
Инвертировать порядок навигационных кнопок
Имитация действий для тестирования темы
@@ -334,7 +335,7 @@
Часовой пояс
Выбор часового пояса:
+ feel free to change the location listed or drop the location entirely and just call it UTC -6 -->
(UTC-11, SST) о.Мидуэй, Самоа
(UTC-10, HAST) Гавайи
(UTC-9, AKST) Аляска
@@ -506,9 +507,16 @@
Установка завершена
Ошибка распаковки образа.
Ошибка перепаковки образа.
+ файлы рамдиска были изменены, неудалось создать рамдиск для установки, используйте fastboot boot twrp и попробуйте эту функцию снова или воспользуйтесь Установка рекавери в ramdisk.
+ неудалось создать рамдиск для установки.
Распаковка {1}...
Перепаковка {1}...
Выбор образа
+ Если устройство ранее было рутовано, тогда рут перезапишется и нужно будет переустановить его.
+ Установить текущее TWRP
+ Установить текущее TWRP?
+ Установка TWRP...
+ TWRP успешно установлено
Исправить циклическую перезагрузку рекавери
Исправить циклическую перезагрузку рекавери?
Исправление циклической перезагрузки рекавери...
@@ -518,16 +526,16 @@
Расшифровка пользователей
Выберите ID пользователя для расшифровки
Выбор пользователя
- В резервную копию не включены некоторые файлы пользователя {1}, потому что пользователь не расшифрован.
- Попытка расшифровать FBE пользователя {1}...
+ В резервную копию не включены некоторые файлы пользователя {1}, потому что пользователь не расшифрован.
+ Попытка расшифровать FBE пользователя {1}...
Пользователь {1} расшифрован успешно
Ошибка расшифровки пользователя {1}
Введите пароль пользователя [%tw_crypto_user_id%]
Введите шаблон пользователя [%tw_crypto_user_id%]
Не все пользователи расшифрованы!
- Резервное копирование или восстановление могут завершиться неудачно!
+ Резервное копирование или восстановление могут завершиться неудачно!
Всё равно продолжить
- Предупреждение о нескольких пользователях
+ Предупреждение о нескольких пользователях
Чтение SELinux-контекста не поддерживается ядром.
@@ -628,7 +636,7 @@
Невозможно изменить размер {1}.
Восстановление {1} перед изменением размера.
Не удаётся изменить размер {1}.
- Отсутствует файл контрольной суммы для '{1}'. Пожалуйста отмените выбор проверки контрольных сумм при восстановлении.
+ Отсутствует файл контрольной суммы для '{1}'. Пожалуйста, отмените выбор проверки контрольных сумм при восстановлении.
Контрольная сумма не соответствует '{1}'.
Контрольная сумма соответствует '{1}'.
Не удаётся расшифровать tar-файл '{1}'
@@ -733,7 +741,9 @@
-- эта опция позволяет делать резервное копирование по ADB
путь: {1} отсутствует в списке разделов.
Kernel Log скопирован в {1}
+ Logcat скопирован в {1}
Добавить Kernel Log
+ Добавить Logcat
Использовать SHA2 для контрольных сумм (иначе - MD5)
Ошибка смены слота загрузки bootloader на {1}
Размонтировать System перед установкой ZIP
@@ -744,11 +754,11 @@
Прошить в оба слота
Начало расшифровки Ozip...
Расшифровка Ozip завершена!
- ВНИМАНИЕ: {1} очищен. Устройство необходимо перезагрузить в ОС (не в рекавери) для установки начальной политики FBE после очистки.
Fastboot
Включить ADB
Включить Fastboot
Переход в режим Fastboot...
+ TWRP не пересоздаёт /data/media на FBE устройствах. Пожалуйста, перезагрузитесь в систему чтобы создать /data/media
Обнаружен сбой Android Rescue Party! Возможные решения:
1. Очистить Cache и/или
@@ -760,5 +770,28 @@
Смена папки TWRP
Папка TWRP изменена на
Папка с таким именем уже существует!
+ Отключить Super разделы
+ Отключить все Super разделы?
+ Отключение всех Super разделов...
+ Отлючены все Super разделы
+ Отлючить все Super разделы?
+ Отключение Super разделов...
+ Отлючены все Super разделы
+ Super-разделы могут не монтироваться до перезагрузки рекавери.
+ Слияние Снапшотов
+ Слить Снапшоты?
+ Слияние Снапшотов...
+ Снапшоты слиты
+ Восстановить при включенном PIN-коде/Пароле?
+ Восстановить при включенном графическом пароле?
+ Восстановить при включенном PIN-коде?
+ Продолжить восстановление?
+ PIN-код/Пароль включен
+ PIN-код/Пароль должен быть отключён перед восстановлением
+ PIN-код включен
+ PIN-код должен быть отключён перед восстановлением
+ Графический пароль включен
+ Графический пароль должен быть отключён перед восстановлением
+ Рекомендуется перезагрузить Android один раз после первой загрузки.
diff --git a/gui/theme/common/languages/sk.xml b/gui/theme/common/languages/sk.xml
index f4e56ef9..e212f7d8 100644
--- a/gui/theme/common/languages/sk.xml
+++ b/gui/theme/common/languages/sk.xml
@@ -262,7 +262,7 @@
Recovery
Bootloader
Stiahnuť
- Edl
+ EDL
Vypínanie...
Potiahnite pre vypnutie
Vypnúť
diff --git a/gui/theme/common/languages/sl.xml b/gui/theme/common/languages/sl.xml
index 4259e625..ef0a6922 100644
--- a/gui/theme/common/languages/sl.xml
+++ b/gui/theme/common/languages/sl.xml
@@ -262,7 +262,7 @@
Obnovitev
Zagonski nalagalnik
Prejmi
- Edl
+ EDL
Izklapljanje …
Povlecite za izklop
Izklopi
diff --git a/gui/theme/common/languages/sv.xml b/gui/theme/common/languages/sv.xml
index c8989577..1f4368ca 100644
--- a/gui/theme/common/languages/sv.xml
+++ b/gui/theme/common/languages/sv.xml
@@ -101,7 +101,7 @@
System
Bootloader
Ladda ner
- Edl
+ EDL
Stänger av...
Inställningar
Allmänt
diff --git a/gui/theme/common/languages/tr.xml b/gui/theme/common/languages/tr.xml
index 8e924cb5..3e040de1 100644
--- a/gui/theme/common/languages/tr.xml
+++ b/gui/theme/common/languages/tr.xml
@@ -284,7 +284,7 @@
Recovery
Bootloader
Download
- Edl
+ EDL
Kapatılıyor...
Kapatmak için Kaydır
Kapat
diff --git a/gui/theme/common/languages/uk.xml b/gui/theme/common/languages/uk.xml
index 9b267d26..d48310bb 100644
--- a/gui/theme/common/languages/uk.xml
+++ b/gui/theme/common/languages/uk.xml
@@ -266,7 +266,7 @@
Рекавері
Завантажувач
Режим завантаження
- Edl
+ EDL
Вимкнення...
Вимкнути
Вимкнення
diff --git a/gui/theme/common/portrait.xml b/gui/theme/common/portrait.xml
index 0057eec8..dac633a8 100755
--- a/gui/theme/common/portrait.xml
+++ b/gui/theme/common/portrait.xml
@@ -2358,6 +2358,78 @@
+
+
+
+ restore_keymaster
+
+
+
+
+
+
+
+ restore_read
+
+
+
+
+
+ main
+
+
+
+
+ main
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tw_multiuser_warning_destination=restore
+ multiuser_warning
+
+
+
+
+
+ {@restore_hdr=Restore}
+
+
+
+
+ {@restore_sel_store_hdr=Select Backup from %tw_storage_display_name% (%tw_storage_free_size% MB)}
+
+
+
+
+
+
+ {@restore_sel_pack_fs=Select Package to Restore:}
+
+
+
+
+
+
+
+
@@ -2996,7 +3068,7 @@
-
+
tw_back=fastbootreboot
@@ -3024,13 +3096,6 @@
-
-
- reboot2
-
-
-
-
@@ -3134,7 +3199,7 @@
-
+
tw_back=reboot
@@ -3154,11 +3219,11 @@
-
+
{@current_boot_slot=Current Slot: %tw_active_slot%}
-
-
+
{@boot_slot_b=Slot B}
@@ -3190,18 +3255,6 @@
-
-
-
-
- {@reboot_install_app_hdr=Install TWRP App}
-
- tw_back=reboot
- tw_appinstall_title={@reboot_hdr=Reboot}
- installapp
-
-
-
main
@@ -4896,6 +4949,11 @@
decrypt_pattern
+
+
+ decrypt_pin
+
+
{@mount_hdr=Mount}
@@ -5032,6 +5090,69 @@
+
+
+
+
+
+ {@mount_hdr=Mount}
+
+
+
+
+ {@decrypt_data_hdr=Decrypt Data}
+
+
+
+
+
+ {@decrypt_data_enter_pass=Enter PIN:}
+
+
+
+
+
+ {@decrypt_data_enter_pass_fbe=Enter PIN for User [%tw_crypto_user_id%]}
+
+
+
+
+ %tw_crypto_display%
+
+
+ trydecrypt
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {@decrypt_data_failed=PIN failed, please try again!}
+
+
+
+
+ {@cancel_btn=Cancel}
+ canceldecrypt
+
+
+
+
+ {@sel_lang_btn=Select Language}
+ select_language
+
+
+
+
+
@@ -5712,5 +5833,81 @@
+
+
+
+
+
+
+
+ {@restore_with_pin_password1=PIN/Password is enabled}
+
+
+
+
+
+ {@restore_with_pin_password2=PIN/Password should be disabled before restore}
+
+
+
+
+ {@restore_pin_password=Restore While PIN/Password Enabled?}
+
+
+
+
+
+ {@restore_with_pattern1=Pattern is enabled}
+
+
+
+
+
+ {@restore_with_pattern2=Pattern should be disabled before restore}
+
+
+
+
+
+ {@restore_pattern=Restore While Pattern Enabled?}
+
+
+
+
+
+ {@restore_with_pin1=PIN is enabled}
+
+
+
+
+
+ {@restore_with_pin2=PIN should be disabled before restore}
+
+
+
+
+
+ {@restore_pin=Restore While PIN Enabled?}
+
+
+
+ {@continue_restore_encrypted=Continue Restore?}
+
+ restore_force
+
+
+
+
+
+ main
+
+
+
+
+
+ main
+
+
+
diff --git a/gui/theme/common/watch.xml b/gui/theme/common/watch.xml
index 8fa1d238..bbf24cba 100755
--- a/gui/theme/common/watch.xml
+++ b/gui/theme/common/watch.xml
@@ -2709,6 +2709,75 @@
+
+
+
+ restore_pin
+
+
+
+
+
+
+
+ tw_back=restore
+ restore_read
+
+
+
+
+
+ main
+
+
+
+
+ main
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tw_multiuser_warning_destination=restore
+ multiuser_warning
+
+
+
+
+
+
+
+ {@restore_hdr=Restore} > {@sel_backup_hdr=Select Backup}
+
+
+
+
+ %tw_storage_display_name%
+
+
+
+
+
+
+
+
+
+
+
+ tw_storagetext={@restore_btn=Restore} > {@select_storage_btn=Select Storage}
+ tw_back=restore
+ select_storage
+
+
+
@@ -3399,13 +3468,6 @@
-
-
- reboot2
-
-
-
-
@@ -3504,7 +3566,7 @@
- {@rb_edl_btn=Edl}
+ {@rb_edl_btn=EDL}
tw_back=reboot
tw_action=reboot
@@ -5447,6 +5509,11 @@
decrypt_pattern
+
+
+ decrypt_pin
+
+
{@mount_hdr=Mount} > {@decrypt_data_hdr=Decrypt Data}
@@ -5617,6 +5684,66 @@
+
+
+
+
+
+
+
+ {@mount_hdr=Mount} > {@decrypt_data_hdr=Decrypt Data}
+
+
+
+
+
+ {@decrypt_data_enter_pass=Enter PIN:}
+
+
+
+
+
+ {@decrypt_data_enter_pass_fbe=Enter PIN for User [%tw_crypto_user_id%]}
+
+
+
+
+ %tw_crypto_display%
+
+
+ trydecrypt
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {@decrypt_data_failed=PIN failed, please try again!}
+
+
+
+
+ {@sel_lang_btn=Select Language}
+ settings_language
+
+
+
+
+ {@cancel_btn=Cancel}
+ canceldecrypt
+
+
+
+
+
@@ -6079,5 +6206,74 @@
+
+
+
+
+
+
+ {@restore_with_pin1=PIN/Password is enabled}
+
+
+
+
+ {@restore_with_pin2=PIN/Password should be disabled before restore}
+
+
+
+
+ {@restore_pin=Restore While PIN/Password Enabled?}
+
+
+
+
+ {@restore_with_pattern1=Pattern is enabled}
+
+
+
+
+ {@restore_with_pattern2=Pattern should be disabled before restore}
+
+
+
+
+ {@restore_pattern=Restore While Pattern Enabled?}
+
+
+
+
+
+ {@restore_with_pin1=PIN is enabled}
+
+
+
+
+
+ {@restore_with_pin2=PIN should be disabled before restore}
+
+
+
+
+
+ {@restore_pin=Restore While PIN Enabled?}
+
+
+
+ {@continue_restore_encrypted=Continue Restore?}
+
+ restore_force
+
+
+
+
+ main
+
+
+
+
+ main
+
+
+
diff --git a/gui/theme/extra-languages/languages/ja.xml b/gui/theme/extra-languages/languages/ja.xml
index 977b1708..9fe767ba 100644
--- a/gui/theme/extra-languages/languages/ja.xml
+++ b/gui/theme/extra-languages/languages/ja.xml
@@ -265,7 +265,7 @@
リカバリ
ブートローダー
ダウンロード
- Edl
+ EDL
電源を切っています...
スワイプで電源を切る
電源を切る
diff --git a/gui/theme/extra-languages/languages/zh_CN.xml b/gui/theme/extra-languages/languages/zh_CN.xml
index 40128bc2..bbd8fb01 100644
--- a/gui/theme/extra-languages/languages/zh_CN.xml
+++ b/gui/theme/extra-languages/languages/zh_CN.xml
@@ -292,7 +292,7 @@
Recovery
Bootloader
Download
- Edl
+ EDL
正在关机…
滑动滑块确认关机
关机
diff --git a/gui/theme/extra-languages/languages/zh_TW.xml b/gui/theme/extra-languages/languages/zh_TW.xml
index 74ebfb97..df120d49 100644
--- a/gui/theme/extra-languages/languages/zh_TW.xml
+++ b/gui/theme/extra-languages/languages/zh_TW.xml
@@ -292,7 +292,7 @@
Recovery
Bootloader
Download
- Edl
+ EDL
正在關機…
滑動滑塊確認關機
關機
diff --git a/gui/theme/landscape_hdpi/ui.xml b/gui/theme/landscape_hdpi/ui.xml
index 7f894435..da3c5fca 100755
--- a/gui/theme/landscape_hdpi/ui.xml
+++ b/gui/theme/landscape_hdpi/ui.xml
@@ -720,5 +720,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gui/theme/landscape_mdpi/ui.xml b/gui/theme/landscape_mdpi/ui.xml
index 65751ee8..e29aa6bf 100755
--- a/gui/theme/landscape_mdpi/ui.xml
+++ b/gui/theme/landscape_mdpi/ui.xml
@@ -720,5 +720,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gui/theme/portrait_hdpi/ui.xml b/gui/theme/portrait_hdpi/ui.xml
index 95c227a5..70df4e88 100755
--- a/gui/theme/portrait_hdpi/ui.xml
+++ b/gui/theme/portrait_hdpi/ui.xml
@@ -638,5 +638,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gui/theme/portrait_mdpi/ui.xml b/gui/theme/portrait_mdpi/ui.xml
index c2cbd44d..9ed1a20a 100755
--- a/gui/theme/portrait_mdpi/ui.xml
+++ b/gui/theme/portrait_mdpi/ui.xml
@@ -638,5 +638,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gui/theme/watch_mdpi/ui.xml b/gui/theme/watch_mdpi/ui.xml
index 2af1249d..8ec73dff 100644
--- a/gui/theme/watch_mdpi/ui.xml
+++ b/gui/theme/watch_mdpi/ui.xml
@@ -7,7 +7,7 @@
Backup Naowz
Default basic theme
preview.png
- 3
+ 4
@@ -388,5 +388,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/minuitwrp/Android.mk.old b/minuitwrp/Android.mk.old
deleted file mode 100644
index 94551307..00000000
--- a/minuitwrp/Android.mk.old
+++ /dev/null
@@ -1,218 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- graphics.cpp \
- graphics_fbdev.cpp \
- resources.cpp \
- truetype.cpp \
- graphics_utils.cpp \
- events.cpp
-
-ifeq ($(TW_SUPPORT_INPUT_1_2_HAPTICS),true)
- ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
- LOCAL_SHARED_LIBRARIES += android.hardware.vibrator@1.2 libhidlbase
- LOCAL_CFLAGS += -DUSE_QTI_HAPTICS
- endif
-endif
-
-ifneq ($(TW_BOARD_CUSTOM_GRAPHICS),)
- $(warning ****************************************************************************)
- $(warning * TW_BOARD_CUSTOM_GRAPHICS support has been deprecated in TWRP. *)
- $(warning ****************************************************************************)
- $(error stopping)
-endif
-
-ifeq ($(TW_TARGET_USES_QCOM_BSP), true)
- LOCAL_CFLAGS += -DMSM_BSP
- LOCAL_SRC_FILES += graphics_overlay.cpp
- ifeq ($(TARGET_PREBUILT_KERNEL),)
- ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0)
- LOCAL_REQUIRED_MODULES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
- else
- LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
- endif
- LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
- else
- ifeq ($(TARGET_CUSTOM_KERNEL_HEADERS),)
- LOCAL_C_INCLUDES += $(commands_recovery_local_path)/minuitwrp/include
- else
- LOCAL_C_INCLUDES += $(TARGET_CUSTOM_KERNEL_HEADERS)
- endif
- endif
-else
- LOCAL_C_INCLUDES += $(commands_recovery_local_path)/minuitwrp/include
- # The header files required for adf graphics can cause compile errors
- # with adf graphics.
- ifneq ($(wildcard system/core/adf/Android.*),)
- LOCAL_CFLAGS += -DHAS_ADF
- LOCAL_SRC_FILES += graphics_adf.cpp
- LOCAL_WHOLE_STATIC_LIBRARIES += libadf
- endif
-endif
-
-ifeq ($(TW_NEW_ION_HEAP), true)
- LOCAL_CFLAGS += -DNEW_ION_HEAP
-endif
-
-ifneq ($(wildcard external/libdrm/Android.*),)
- LOCAL_CFLAGS += -DHAS_DRM
- LOCAL_SRC_FILES += graphics_drm.cpp
- ifneq ($(wildcard external/libdrm/Android.common.mk),)
- LOCAL_WHOLE_STATIC_LIBRARIES += libdrm_platform
- else
- LOCAL_WHOLE_STATIC_LIBRARIES += libdrm
- endif
-endif
-
-LOCAL_C_INCLUDES += \
- external/libpng \
- external/zlib \
- system/core/include \
- external/freetype/include \
- external/libcxx/include \
- $(LOCAL_PATH)/../twrpinstall/include
-
-ifneq ($(TW_INCLUDE_JPEG),)
- LOCAL_C_INCLUDES += \
- external/jpeg
- LOCAL_CFLAGS += -DTW_INCLUDE_JPEG
-endif
-
-ifeq ($(RECOVERY_TOUCHSCREEN_SWAP_XY), true)
-LOCAL_CFLAGS += -DRECOVERY_TOUCHSCREEN_SWAP_XY
-endif
-
-ifeq ($(RECOVERY_TOUCHSCREEN_FLIP_X), true)
-LOCAL_CFLAGS += -DRECOVERY_TOUCHSCREEN_FLIP_X
-endif
-
-ifeq ($(RECOVERY_TOUCHSCREEN_FLIP_Y), true)
-LOCAL_CFLAGS += -DRECOVERY_TOUCHSCREEN_FLIP_Y
-endif
-
-ifeq ($(RECOVERY_GRAPHICS_FORCE_USE_LINELENGTH), true)
-LOCAL_CFLAGS += -DRECOVERY_GRAPHICS_FORCE_USE_LINELENGTH
-endif
-
-ifeq ($(RECOVERY_GRAPHICS_FORCE_SINGLE_BUFFER), true)
-LOCAL_CFLAGS += -DRECOVERY_GRAPHICS_FORCE_SINGLE_BUFFER
-endif
-
-#Remove the # from the line below to enable event logging
-#TWRP_EVENT_LOGGING := true
-ifeq ($(TWRP_EVENT_LOGGING), true)
-LOCAL_CFLAGS += -D_EVENT_LOGGING
-endif
-
-
-ifeq ($(subst ",,$(TARGET_RECOVERY_FORCE_PIXEL_FORMAT)),RGBA_8888)
- $(warning ****************************************************************************)
- $(warning * TARGET_RECOVERY_FORCE_PIXEL_FORMAT := RGBA_8888 not implemented yet *)
- $(warning ****************************************************************************)
- $(error stopping)
- LOCAL_CFLAGS += -DRECOVERY_RGBA
-endif
-ifeq ($(subst ",,$(TARGET_RECOVERY_FORCE_PIXEL_FORMAT)),RGBX_8888)
- $(warning ****************************************************************************)
- $(warning * TARGET_RECOVERY_FORCE_PIXEL_FORMAT := RGBX_8888 not implemented yet *)
- $(warning ****************************************************************************)
- $(error stopping)
- LOCAL_CFLAGS += -DRECOVERY_RGBX
-endif
-ifeq ($(subst ",,$(TARGET_RECOVERY_FORCE_PIXEL_FORMAT)),BGRA_8888)
- $(warning ****************************************************************************)
- $(warning * TARGET_RECOVERY_FORCE_PIXEL_FORMAT := BGRA_8888 not implemented yet *)
- $(warning ****************************************************************************)
- $(error stopping)
- LOCAL_CFLAGS += -DRECOVERY_BGRA
-endif
-ifeq ($(subst ",,$(TARGET_RECOVERY_FORCE_PIXEL_FORMAT)),RGB_565)
- LOCAL_CFLAGS += -DRECOVERY_FORCE_RGB_565
-endif
-
-# This used to compare against values in double-quotes (which are just
-# ordinary characters in this context). Strip double-quotes from the
-# value so that either will work.
-
-ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),ABGR_8888)
- LOCAL_CFLAGS += -DRECOVERY_ABGR
-endif
-ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),RGBX_8888)
- LOCAL_CFLAGS += -DRECOVERY_RGBX
-endif
-ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),BGRA_8888)
- LOCAL_CFLAGS += -DRECOVERY_BGRA
-endif
-
-ifneq ($(TARGET_RECOVERY_OVERSCAN_PERCENT),)
- LOCAL_CFLAGS += -DOVERSCAN_PERCENT=$(TARGET_RECOVERY_OVERSCAN_PERCENT)
-else
- LOCAL_CFLAGS += -DOVERSCAN_PERCENT=0
-endif
-ifeq ($(TW_FBIOPAN), true)
- LOCAL_CFLAGS += -DTW_FBIOPAN
-endif
-
-ifneq ($(TW_ROTATION),)
- ifeq (,$(filter 0 90 180 270, $(TW_ROTATION)))
- $(error TW_ROTATION must be set to 0, 90, 180 or 270. Currently set to $(TW_ROTATION))
- endif
- LOCAL_CFLAGS += -DTW_ROTATION=$(TW_ROTATION)
-else
- # Support for old flag
- ifeq ($(BOARD_HAS_FLIPPED_SCREEN), true)
- LOCAL_CFLAGS += -DTW_ROTATION=180
- else
- LOCAL_CFLAGS += -DTW_ROTATION=0
- endif
-endif
-
-ifeq ($(TW_IGNORE_MAJOR_AXIS_0), true)
-LOCAL_CFLAGS += -DTW_IGNORE_MAJOR_AXIS_0
-endif
-
-ifeq ($(TW_IGNORE_MT_POSITION_0), true)
-LOCAL_CFLAGS += -DTW_IGNORE_MT_POSITION_0
-endif
-
-ifeq ($(TW_IGNORE_ABS_MT_TRACKING_ID), true)
-LOCAL_CFLAGS += -DTW_IGNORE_ABS_MT_TRACKING_ID
-endif
-
-ifneq ($(TW_INPUT_BLACKLIST),)
- LOCAL_CFLAGS += -DTW_INPUT_BLACKLIST=$(TW_INPUT_BLACKLIST)
-endif
-
-ifneq ($(TW_WHITELIST_INPUT),)
- LOCAL_CFLAGS += -DWHITELIST_INPUT=$(TW_WHITELIST_INPUT)
-endif
-
-ifeq ($(TW_HAPTICS_TSPDRV), true)
- LOCAL_SRC_FILES += tspdrv.cpp
- LOCAL_CFLAGS += -DTW_HAPTICS_TSPDRV
-endif
-
-ifeq ($(TW_DISABLE_TTF), true)
- $(warning ****************************************************************************)
- $(warning * TW_DISABLE_TTF support has been deprecated in TWRP. *)
- $(warning ****************************************************************************)
- $(error stopping)
-endif
-
-LOCAL_CLANG := true
-
-LOCAL_CFLAGS += -DTWRES=\"$(TWRES_PATH)\"
-LOCAL_SHARED_LIBRARIES += libft2 libz libc libcutils libpng libutils libc++
-ifneq ($(TW_INCLUDE_JPEG),)
- LOCAL_SHARED_LIBRARIES += libjpeg
-endif
-LOCAL_STATIC_LIBRARIES += libpixelflinger_twrp
-ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 25; echo $$?),0)
-LOCAL_SHARED_LIBRARIES += libcutils liblog libutils
-endif
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE := libminuitwrp
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/minuitwrp/libminuitwrp_defaults.go b/minuitwrp/libminuitwrp_defaults.go
index 802533a1..2f82c6eb 100644
--- a/minuitwrp/libminuitwrp_defaults.go
+++ b/minuitwrp/libminuitwrp_defaults.go
@@ -132,8 +132,11 @@ func globalFlags(ctx android.BaseContext) []string {
var tw_rotation = getMakeVars(ctx, "TW_ROTATION")
switch tw_rotation {
case "0":
+ fallthrough
case "90":
+ fallthrough
case "180":
+ fallthrough
case "270":
cflags = append(cflags, "-DTW_ROTATION="+tw_rotation)
default:
diff --git a/partition.cpp b/partition.cpp
index 5af68c98..ecd5be59 100755
--- a/partition.cpp
+++ b/partition.cpp
@@ -754,10 +754,9 @@ bool TWPartition::Decrypt_FBE_DE() {
ExcludeAll(Mount_Point + "/misc/keystore");
ExcludeAll(Mount_Point + "/drm/kek.dat");
ExcludeAll(Mount_Point + "/system_de/0/spblob"); // contains data needed to decrypt synthetic password
- // ExcludeAll(Mount_Point + "/system/users/0/gatekeeper.password.key");
- // ExcludeAll(Mount_Point + "/system/users/0/gatekeeper.pattern.key");
+ ExcludeAll(Mount_Point + "/system/users/0/gatekeeper.password.key");
+ ExcludeAll(Mount_Point + "/system/users/0/gatekeeper.pattern.key");
ExcludeAll(Mount_Point + "/cache");
- ExcludeAll(Mount_Point + "/system/users/0");
ExcludeAll(Mount_Point + "/per_boot"); // removed each boot by init
ExcludeAll(Mount_Point + "/gsi"); // cow devices
@@ -1210,6 +1209,17 @@ void TWPartition::Setup_Data_Media() {
wipe_exclusions.add_absolute_dir(Mount_Point + "/misc/vold"); // adopted storage keys
ExcludeAll(Mount_Point + "/system/storage.xml");
} else {
+ int i;
+ string path;
+ for (i = 2; i <= 9; i++) {
+ path = "/sdcard" + TWFunc::to_string(i);
+ if (!TWFunc::Path_Exists(path)) {
+ Make_Dir(path, false);
+ Symlink_Mount_Point = path;
+ LOGINFO("'%s' data/media emulated storage symlinked to %s.\n", Mount_Point.c_str(), Symlink_Mount_Point.c_str());
+ break;
+ }
+ }
if (Mount(true) && TWFunc::Path_Exists(Mount_Point + "/media/0")) {
Storage_Path = Mount_Point + "/media/0";
Symlink_Path = Storage_Path;
@@ -3296,7 +3306,14 @@ int TWPartition::Decrypt_Adopted() {
char type_guid[80];
char part_guid[80];
- if (gpt_disk_get_partition_info(fd, 2, type_guid, part_guid) == 0) {
+ uint32_t p_num;
+ size_t last_digit = Primary_Block_Device.find_last_not_of("0123456789");
+ if ((last_digit != string::npos) && (last_digit != Primary_Block_Device.length()-1))
+ p_num = atoi(Primary_Block_Device.substr(last_digit + 1).c_str()) + 1;
+ else
+ p_num = 2;
+
+ if (gpt_disk_get_partition_info(fd, p_num, type_guid, part_guid) == 0) {
LOGINFO("type: '%s'\n", type_guid);
LOGINFO("part: '%s'\n", part_guid);
Adopted_GUID = part_guid;
@@ -3312,16 +3329,22 @@ int TWPartition::Decrypt_Adopted() {
* to disable USB Mass Storage whenever adopted storage
* is present.
*/
- LOGINFO("Detected adopted storage, disabling USB mass storage mode\n");
- DataManager::SetValue("tw_has_usb_storage", 0);
+ if (p_num == 2) {
+ // TODO: Properly detect mixed vs fully adopted storage. Maybe this
+ // should be moved to partitionmanager instead, and disable after
+ // checking all partitions. Also the presence of adopted storage does
+ // not necessarily mean it's being used as Internal Storage
+ LOGINFO("Detected adopted storage, disabling USB mass storage mode\n");
+ DataManager::SetValue("tw_has_usb_storage", 0);
+ }
}
}
}
if (Is_Adopted_Storage) {
- string Adopted_Block_Device = Alternate_Block_Device + "p2";
+ string Adopted_Block_Device = Alternate_Block_Device + "p" + TWFunc::to_string(p_num);
if (!TWFunc::Path_Exists(Adopted_Block_Device)) {
- Adopted_Block_Device = Alternate_Block_Device + "2";
+ Adopted_Block_Device = Alternate_Block_Device + TWFunc::to_string(p_num);
if (!TWFunc::Path_Exists(Adopted_Block_Device)) {
LOGINFO("Adopted block device does not exist\n");
goto exit;
diff --git a/partitionmanager.cpp b/partitionmanager.cpp
index 9e423184..a4d84ecb 100755
--- a/partitionmanager.cpp
+++ b/partitionmanager.cpp
@@ -1269,6 +1269,9 @@ int TWPartitionManager::Run_Restore(const string& Restore_Name) {
UnMount_Main_Partitions();
time(&rStop);
gui_msg(Msg(msg::kHighlight, "restore_completed=[RESTORE COMPLETED IN {1} SECONDS]")((int)difftime(rStop,rStart)));
+ TWPartition* Decrypt_Data = Find_Partition_By_Path("/data");
+ if (Decrypt_Data && Decrypt_Data->Is_Encrypted)
+ gui_msg(Msg(msg::kWarning, "reboot_after_restore=It is recommended to reboot Android once after first boot."));
DataManager::SetValue("tw_file_progress", "");
return true;
@@ -1834,23 +1837,30 @@ void TWPartitionManager::Parse_Users() {
user.userId = to_string(userId);
// Attempt to get name of user. Fallback to user ID if this fails.
- char* userFile = PageManager::LoadFileToBuffer("/data/system/users/" + to_string(userId) + ".xml", NULL);
- if (userFile == NULL) {
- user.userName = to_string(userId);
+ std::string path = "/data/system/users/" + to_string(userId) + ".xml";
+ if ((atoi(TWFunc::System_Property_Get("ro.build.version.sdk").c_str()) > 30) && TWFunc::Path_Exists(path)) {
+ if(!TWFunc::Check_Xml_Format(path))
+ user.userName = to_string(userId);
}
else {
- xml_document<> *userXml = new xml_document<>();
- userXml->parse<0>(userFile);
- xml_node<>* userNode = userXml->first_node("user");
- if (userNode == nullptr) {
+ char* userFile = PageManager::LoadFileToBuffer(path, NULL);
+ if (userFile == NULL) {
user.userName = to_string(userId);
- } else {
- xml_node<>* nameNode = userNode->first_node("name");
- if (nameNode == nullptr)
+ }
+ else {
+ xml_document<> *userXml = new xml_document<>();
+ userXml->parse<0>(userFile);
+ xml_node<>* userNode = userXml->first_node("user");
+ if (userNode == nullptr) {
user.userName = to_string(userId);
- else {
- string userName = nameNode->value();
- user.userName = userName + " (" + to_string(userId) + ")";
+ } else {
+ xml_node<>* nameNode = userNode->first_node("name");
+ if (nameNode == nullptr)
+ user.userName = to_string(userId);
+ else {
+ string userName = nameNode->value();
+ user.userName = userName + " (" + to_string(userId) + ")";
+ }
}
}
}
@@ -2147,8 +2157,12 @@ int TWPartitionManager::usb_storage_enable(void) {
Mount2 = Find_Next_Storage(Mount1->Mount_Point, true);
if (Mount2 && Mount2->Mount_Point != Mount1->Mount_Point) {
Open_Lun_File(Mount2->Mount_Point, lun_file);
+ // Mimic single lun code: Mount CurrentStoragePath if it's not /data
+ } else if (TWFunc::Get_Root_Path(DataManager::GetCurrentStoragePath()) != "/data") {
+ Open_Lun_File(DataManager::GetCurrentStoragePath(), lun_file);
}
- } else {
+ // Mimic single lun code: Mount CurrentStoragePath if it's not /data
+ } else if (TWFunc::Get_Root_Path(DataManager::GetCurrentStoragePath()) != "/data" && !Open_Lun_File(DataManager::GetCurrentStoragePath(), lun_file)) {
gui_err("unable_locate_storage=Unable to locate storage device.");
goto error_handle;
}
@@ -2982,6 +2996,16 @@ bool TWPartitionManager::Decrypt_Adopted() {
LOGERR("Cannot decrypt adopted storage because /data will not mount\n");
return false;
}
+
+ // In Android 12 xml format changed. Previously it was human-readable format with xml tags
+ // now it's ABX (Android Binary Xml). Sadly, rapidxml can't parse it, so check xml format firstly
+ std::string path = "/data/system/storage.xml";
+ if ((atoi(TWFunc::System_Property_Get("ro.build.version.sdk").c_str()) > 30) && TWFunc::Path_Exists(path))
+ if(!TWFunc::Check_Xml_Format(path)) {
+ LOGINFO("Android 12+: storage.xml is in ABX format. Skipping adopted storage decryption\n");
+ return false;
+ }
+
LOGINFO("Decrypt adopted storage starting\n");
char* xmlFile = PageManager::LoadFileToBuffer("/data/system/storage.xml", NULL);
xml_document<> *doc = NULL;
@@ -3592,4 +3616,4 @@ bool TWPartitionManager::Check_Pending_Merges() {
return false;
}
return true;
-}
\ No newline at end of file
+}
diff --git a/sepolicy/twrp.te b/sepolicy/twrp.te
index 2a5961f5..5ed1e886 100755
--- a/sepolicy/twrp.te
+++ b/sepolicy/twrp.te
@@ -4,10 +4,10 @@ recovery_only(`
permissive logd;
permissive adbd;
permissive fastbootd;
+ permissive postinstall;
allow kernel unlabeled:file rw_file_perms;
allow kernel tmpfs:file { read };
allow kernel recovery:fd { use };
allow unlabeled unlabeled:filesystem associate;
allow vendor_init rootfs:dir read;
- allow postinstall tmpfs:file { getattr read execute };
')
diff --git a/startupArgs.cpp b/startupArgs.cpp
index f385e27f..bf74f871 100755
--- a/startupArgs.cpp
+++ b/startupArgs.cpp
@@ -51,7 +51,7 @@ bool startupArgs::processRecoveryArgs(std::vector args, int index)
android::base::SetProperty("sys.usb.config", "fastboot");
DataManager::SetValue("tw_enable_adb", 0);
DataManager::SetValue("tw_enable_fastboot", 1);
- } else if (args[index].find(UPDATE_PACKAGE) != std::string::npos) {
+ } else if (args[index].find(UPDATE_PACKAGE) != std::string::npos || args[index].find(SPECIAL_UPDATE_PACKAGE) != std::string::npos) {
std::string::size_type eq_pos = args[index].find("=");
std::string arg = args[index].substr(eq_pos + 1, args[index].size());
if (arg.size() == 0) {
diff --git a/startupArgs.hpp b/startupArgs.hpp
index d388f55d..006a5fb7 100755
--- a/startupArgs.hpp
+++ b/startupArgs.hpp
@@ -33,6 +33,7 @@
class startupArgs {
public:
static inline std::string const UPDATE_PACKAGE = "--update_package";
+ static inline std::string const SPECIAL_UPDATE_PACKAGE = "--special_update_package";
static inline std::string const WIPE_CACHE = "--wipe_cache";
static inline std::string const WIPE_DATA = "--wipe_data";
static inline std::string const SEND_INTENT = "--send_intent";
diff --git a/twrp-functions.cpp b/twrp-functions.cpp
index 7249f18d..70f0affa 100755
--- a/twrp-functions.cpp
+++ b/twrp-functions.cpp
@@ -1499,4 +1499,20 @@ string TWFunc::Check_For_TwrpFolder() {
exit:
return TW_DEFAULT_RECOVERY_FOLDER;
}
+
+bool TWFunc::Check_Xml_Format(const std::string filename) {
+ std::string buffer(' ', 4);
+ std::string abx_hdr("ABX\x00", 4);
+ std::ifstream File;
+ File.open(filename);
+ if (File.is_open()) {
+ File.get(&buffer[0], buffer.size());
+ File.close();
+ // Android Binary Xml start from these bytes
+ if(!buffer.compare(0, abx_hdr.size(), abx_hdr))
+ return false; // bad format, not possible to parse
+ }
+ return true; // good format, possible to parse
+}
+
#endif // ndef BUILD_TWRPTAR_MAIN
diff --git a/twrp-functions.hpp b/twrp-functions.hpp
index 77ca1a23..89311a2b 100755
--- a/twrp-functions.hpp
+++ b/twrp-functions.hpp
@@ -129,6 +129,7 @@ public:
static void List_Mounts(); // List current mounts by the kernel
static void Clear_Bootloader_Message(); // Removes the bootloader message from misc for next boot
static string Check_For_TwrpFolder(); // Gets user defined path on storage where backups should be stored
+ static bool Check_Xml_Format(const std::string filename); // Return whether a xml is in plain xml or ABX format
private:
static void Copy_Log(string Source, string Destination);
diff --git a/twrp.cpp b/twrp.cpp
index 8ef809d4..66169088 100644
--- a/twrp.cpp
+++ b/twrp.cpp
@@ -99,6 +99,8 @@ static void Decrypt_Page(bool SkipDecryption, bool datamedia) {
static void process_fastbootd_mode() {
LOGINFO("starting fastboot\n");
+
+#ifdef TW_LOAD_VENDOR_MODULES
printf("=> Linking mtab\n");
symlink("/proc/mounts", "/etc/mtab");
std::string fstab_filename = "/etc/twrp.fstab";
@@ -113,7 +115,6 @@ static void process_fastbootd_mode() {
TWPartition* ven = PartitionManager.Find_Partition_By_Path("/vendor");
PartitionManager.Setup_Super_Devices();
PartitionManager.Prepare_Super_Volume(ven);
-#ifdef TW_LOAD_VENDOR_MODULES
KernelModuleLoader::Load_Vendor_Modules();
if (android::base::GetBoolProperty("ro.virtual_ab.enabled", false)) {
PartitionManager.Unmap_Super_Devices();
diff --git a/twrpRepacker.cpp b/twrpRepacker.cpp
index b9f85975..8ca1409a 100755
--- a/twrpRepacker.cpp
+++ b/twrpRepacker.cpp
@@ -216,6 +216,7 @@ bool twrpRepacker::Repack_Image_And_Flash(const std::string& Target_Image, const
else
PartitionManager.Override_Active_Slot("A");
DataManager::SetProgress(.25);
+ PartitionManager.Update_System_Details();
if (!Backup_Image_For_Repack(part, REPACK_ORIG_DIR, Repack_Options.Backup_First, gui_lookup("repack", "Repack")))
return false;
if (TWFunc::copy_file(REPACK_NEW_DIR "ramdisk.cpio", REPACK_ORIG_DIR "ramdisk.cpio", 0644)) {
diff --git a/variables.h b/variables.h
index 52ce4fc0..aeb26693 100755
--- a/variables.h
+++ b/variables.h
@@ -17,7 +17,7 @@
#ifndef _VARIABLES_HEADER_
#define _VARIABLES_HEADER_
-#define TW_MAIN_VERSION_STR "3.5.2_11"
+#define TW_MAIN_VERSION_STR "3.6.0_11"
#define TW_VERSION_STR TW_MAIN_VERSION_STR TW_DEVICE_VERSION
#define TW_SETTINGS_FILE ".twrps"
#define TW_RECOVERY_NAME "TWRP"