[tor-commits] [orbot/master] Legacy Onion Service Backup/Restore and
n8fr8 at torproject.org
n8fr8 at torproject.org
Wed Oct 7 12:37:35 UTC 2020
commit cdb8581ca78d9ec4be707cf88117c29390d9242b
Author: bim <dsnake at protonmail.com>
Date: Wed Sep 23 11:49:10 2020 -0400
Legacy Onion Service Backup/Restore and
Cookie backup/restore works.
Cleaned up many more old resources, styled dialogs
to match Android conventions.
---
app-mini/src/main/res/values-ay/strings.xml | 3 +-
app-mini/src/main/res/values-be/strings.xml | 3 +-
app-mini/src/main/res/values-ca/strings.xml | 1 -
app-mini/src/main/res/values-de/strings.xml | 1 -
app-mini/src/main/res/values-el/strings.xml | 1 -
app-mini/src/main/res/values-es/strings.xml | 1 -
app-mini/src/main/res/values-eu/strings.xml | 1 -
app-mini/src/main/res/values-fa/strings.xml | 1 -
app-mini/src/main/res/values-fr/strings.xml | 1 -
app-mini/src/main/res/values-gl/strings.xml | 1 -
app-mini/src/main/res/values-he/strings.xml | 1 -
app-mini/src/main/res/values-hi/strings.xml | 1 -
app-mini/src/main/res/values-hu/strings.xml | 1 -
app-mini/src/main/res/values-is/strings.xml | 1 -
app-mini/src/main/res/values-it/strings.xml | 1 -
app-mini/src/main/res/values-ja/strings.xml | 1 -
app-mini/src/main/res/values-mk/strings.xml | 3 +-
app-mini/src/main/res/values-nl/strings.xml | 1 -
app-mini/src/main/res/values-pt-rBR/strings.xml | 1 -
app-mini/src/main/res/values-ru/strings.xml | 1 -
app-mini/src/main/res/values-sr/strings.xml | 1 -
app-mini/src/main/res/values-sv/strings.xml | 1 -
app-mini/src/main/res/values-th/strings.xml | 1 -
app-mini/src/main/res/values-tr/strings.xml | 3 +-
app-mini/src/main/res/values-uk/strings.xml | 1 -
app-mini/src/main/res/values-zh-rTW/strings.xml | 1 -
app-mini/src/main/res/values/strings.xml | 1 -
app/src/main/AndroidManifest.xml | 8 +-
.../android/ui/dialog/AboutDialogFragment.java | 21 +--
.../ui/hiddenservices/ClientCookiesActivity.java | 76 ++++----
.../ui/hiddenservices/HiddenServicesActivity.java | 78 ++++----
.../adapters/ClientCookiesAdapter.java | 8 +-
.../hiddenservices/adapters/OnionListAdapter.java | 10 +-
.../ui/hiddenservices/backup/BackupUtils.java | 200 ++++++++-------------
.../android/ui/hiddenservices/backup/ZipIt.java | 37 +++-
.../ui/hiddenservices/dialogs/AddCookieDialog.java | 35 ++--
.../dialogs/CookieActionsDialog.java | 65 ++++---
.../hiddenservices/dialogs/CookieDeleteDialog.java | 37 ++--
.../ui/hiddenservices/dialogs/HSActionsDialog.java | 137 +++++++-------
.../ui/hiddenservices/dialogs/HSCookieDialog.java | 79 ++++----
.../ui/hiddenservices/dialogs/HSDataDialog.java | 63 +++----
.../ui/hiddenservices/dialogs/HSDeleteDialog.java | 62 +++----
.../permissions/PermissionManager.java | 37 +---
.../ui/onboarding/CustomBridgesActivity.java | 14 +-
.../res/layout/layout_activity_client_cookies.xml | 5 +-
.../res/layout/layout_add_client_cookie_dialog.xml | 33 +---
.../res/layout/layout_client_cookie_list_item.xml | 2 +-
app/src/main/res/layout/layout_cookie_actions.xml | 27 ---
app/src/main/res/layout/layout_hs_actions.xml | 36 ----
app/src/main/res/layout/layout_hs_cookie.xml | 32 ----
app/src/main/res/layout/layout_hs_data_dialog.xml | 36 +---
app/src/main/res/layout/layout_hs_list_item.xml | 78 ++++----
app/src/main/res/layout/layout_hs_list_view.xml | 5 +-
app/src/main/res/values-ar/strings.xml | 4 +-
app/src/main/res/values-ay/strings.xml | 7 +-
app/src/main/res/values-az/strings.xml | 1 -
app/src/main/res/values-be/strings.xml | 7 +-
app/src/main/res/values-bg/strings.xml | 1 -
app/src/main/res/values-bn/strings.xml | 2 +-
app/src/main/res/values-brx/strings.xml | 2 +-
app/src/main/res/values-bs/strings.xml | 3 +-
app/src/main/res/values-ca/strings.xml | 5 +-
app/src/main/res/values-cs-rCZ/strings.xml | 1 -
app/src/main/res/values-cs/strings.xml | 3 +-
app/src/main/res/values-cy/strings.xml | 1 -
app/src/main/res/values-da/strings.xml | 1 -
app/src/main/res/values-de/strings.xml | 5 +-
app/src/main/res/values-el/strings.xml | 5 +-
app/src/main/res/values-eo/strings.xml | 3 +-
app/src/main/res/values-es-rAR/strings.xml | 3 +-
app/src/main/res/values-es/strings.xml | 5 +-
app/src/main/res/values-eu/strings.xml | 5 +-
app/src/main/res/values-fa/strings.xml | 7 +-
app/src/main/res/values-fi/strings.xml | 1 -
app/src/main/res/values-fr-rFR/strings.xml | 1 -
app/src/main/res/values-fr/strings.xml | 5 +-
app/src/main/res/values-gl/strings.xml | 5 +-
app/src/main/res/values-gu/strings.xml | 1 -
app/src/main/res/values-he/strings.xml | 7 +-
app/src/main/res/values-hi/strings.xml | 5 +-
app/src/main/res/values-hr/strings.xml | 1 -
app/src/main/res/values-hu/strings.xml | 5 +-
app/src/main/res/values-hy-rAM/strings.xml | 2 +-
app/src/main/res/values-id/strings.xml | 1 -
app/src/main/res/values-in-rID/strings.xml | 1 -
app/src/main/res/values-in/strings.xml | 2 +-
app/src/main/res/values-is/strings.xml | 5 +-
app/src/main/res/values-it/strings.xml | 5 +-
app/src/main/res/values-iw/strings.xml | 1 -
app/src/main/res/values-ja/strings.xml | 5 +-
app/src/main/res/values-kn/strings.xml | 2 +-
app/src/main/res/values-ko/strings.xml | 1 -
app/src/main/res/values-lt/strings.xml | 1 -
app/src/main/res/values-lv/strings.xml | 1 -
app/src/main/res/values-mk/strings.xml | 7 +-
app/src/main/res/values-ml/strings.xml | 2 +-
app/src/main/res/values-my/strings.xml | 3 +-
app/src/main/res/values-nb/strings.xml | 4 +-
app/src/main/res/values-nl/strings.xml | 5 +-
app/src/main/res/values-pl/strings.xml | 1 -
app/src/main/res/values-pt-rBR/strings.xml | 5 +-
app/src/main/res/values-pt-rPT/strings.xml | 1 -
app/src/main/res/values-pt/strings.xml | 1 -
app/src/main/res/values-ro/strings.xml | 1 -
app/src/main/res/values-ru/strings.xml | 5 +-
app/src/main/res/values-si-rLK/strings.xml | 1 -
app/src/main/res/values-sk/strings.xml | 1 -
app/src/main/res/values-sl/strings.xml | 1 -
app/src/main/res/values-sn/strings.xml | 2 +-
app/src/main/res/values-sq/strings.xml | 1 -
app/src/main/res/values-sr/strings.xml | 5 +-
app/src/main/res/values-sv/strings.xml | 5 +-
app/src/main/res/values-ta/strings.xml | 1 -
app/src/main/res/values-th/strings.xml | 5 +-
app/src/main/res/values-tl/strings.xml | 1 -
app/src/main/res/values-tr/strings.xml | 7 +-
app/src/main/res/values-uk/strings.xml | 5 +-
app/src/main/res/values-ur/strings.xml | 2 +-
app/src/main/res/values-uz/strings.xml | 2 +-
app/src/main/res/values-vi/strings.xml | 1 -
app/src/main/res/values-zh-rCN/strings.xml | 1 -
app/src/main/res/values-zh-rTW/strings.xml | 5 +-
app/src/main/res/values/strings.xml | 4 +-
.../org/torproject/android/core/ClipboardUtils.kt | 17 ++
.../java/org/torproject/android/core/DiskUtils.kt | 39 +++-
.../android/core/ui/SettingsPreferencesActivity.kt | 10 +-
126 files changed, 594 insertions(+), 942 deletions(-)
diff --git a/app-mini/src/main/res/values-ay/strings.xml b/app-mini/src/main/res/values-ay/strings.xml
index 7d1da038..55ad3641 100644
--- a/app-mini/src/main/res/values-ay/strings.xml
+++ b/app-mini/src/main/res/values-ay/strings.xml
@@ -147,8 +147,7 @@
<string name="delete_service">Lurañanak pichsuña</string>
<string name="backup_saved_at_external_storage">Imat luratanakamax yaqha yänakar imataxiwa</string>
<string name="backup_restored">Imat luratanakamax mayamp apnaqatäxiwa</string>
- <string name="please_grant_permissions_for_external_storage">Yaqha yänakar imañatak iyaw sam, amp suma</string>
- <string name="restore_backup">Imat luratanak mayamp aqtayam</string>
+ <string name="restore_backup">Imat luratanak mayamp aqtayam</string>
<string name="name_can_t_be_empty">Sutix qillqantatäñapapuniwa</string>
<string name="fields_can_t_be_empty">Janiw kunas ch\'usäñapakiti</string>
<string name="start_tor_again_for_finish_the_process">Tukuyañatakix Tor mayamp naktayam</string>
diff --git a/app-mini/src/main/res/values-be/strings.xml b/app-mini/src/main/res/values-be/strings.xml
index cefedc3d..600128ec 100644
--- a/app-mini/src/main/res/values-be/strings.xml
+++ b/app-mini/src/main/res/values-be/strings.xml
@@ -147,8 +147,7 @@
<string name="delete_service">ÐÑдалÑÑÑ ÑлÑжбÑ</string>
<string name="backup_saved_at_external_storage">Ð ÑзеÑÐ²Ð¾Ð²Ð°Ñ ÐºÐ¾Ð¿ÑÑ Ð·Ð°Ñ
авана на вонкавÑм ÑÑ
овÑÑÑÑ</string>
<string name="backup_restored">ÐдноÑлена з ÑÑзеÑвовай копÑÑ</string>
- <string name="please_grant_permissions_for_external_storage">ÐайÑе дазвол Ð´Ð»Ñ Ð´Ð¾ÑÑÑÐ¿Ñ Ð´Ð° вонкавага ÑÑ
овÑÑÑа</string>
- <string name="restore_backup">ÐднавÑÑÑ Ð· копÑÑ</string>
+ <string name="restore_backup">ÐднавÑÑÑ Ð· копÑÑ</string>
<string name="name_can_t_be_empty">ÐÐ¼Ñ Ð½Ðµ можа бÑÑÑ Ð¿ÑÑÑÑм</string>
<string name="fields_can_t_be_empty">ÐÐ°Ð»Ñ Ð½Ðµ могÑÑÑ Ð±ÑÑÑ Ð¿ÑÑÑÑмÑ</string>
<string name="start_tor_again_for_finish_the_process">ÐапÑÑÑÑÑе Tor ÑÐ·Ð½Ð¾Ñ Ð´Ð»Ñ Ð·Ð°Ð²ÑÑÑÑÐ½Ð½Ñ Ð¿ÑаÑÑÑÑ</string>
diff --git a/app-mini/src/main/res/values-ca/strings.xml b/app-mini/src/main/res/values-ca/strings.xml
index 87933a11..c73e46f8 100644
--- a/app-mini/src/main/res/values-ca/strings.xml
+++ b/app-mini/src/main/res/values-ca/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">Esborrar servei</string>
<string name="backup_saved_at_external_storage">Còpia de seguretat desada a emmagatzematge extern</string>
<string name="backup_restored">Còpia de seguretat restaurada</string>
- <string name="please_grant_permissions_for_external_storage">Si us plau concedeix permisos per emmagatzematge extern</string>
<string name="restore_backup">Restaurar còpia de seguretat</string>
<string name="name_can_t_be_empty">El nom no pot estar buit</string>
<string name="fields_can_t_be_empty">Els camps no poden estar buits</string>
diff --git a/app-mini/src/main/res/values-de/strings.xml b/app-mini/src/main/res/values-de/strings.xml
index 839ce6d8..8bc5e311 100644
--- a/app-mini/src/main/res/values-de/strings.xml
+++ b/app-mini/src/main/res/values-de/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">Dienst löschen</string>
<string name="backup_saved_at_external_storage">Sicherung auf externem Speicher gespeichert </string>
<string name="backup_restored">Sicherung wiederhergestellt</string>
- <string name="please_grant_permissions_for_external_storage">Bitte Zugriffsrechte auf externen Speicher gewähren</string>
<string name="restore_backup">Sicherung wiederherstellen</string>
<string name="name_can_t_be_empty">Name darf nicht leer sein</string>
<string name="fields_can_t_be_empty">Felder dürfen nicht leer sein</string>
diff --git a/app-mini/src/main/res/values-el/strings.xml b/app-mini/src/main/res/values-el/strings.xml
index 236827f3..c3ae2c1a 100644
--- a/app-mini/src/main/res/values-el/strings.xml
+++ b/app-mini/src/main/res/values-el/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">ÎιαγÏαÏή Ï
ÏηÏεÏίαÏ</string>
<string name="backup_saved_at_external_storage">Το ανÏίγÏάÏο αÏÏÎ±Î»ÎµÎ¯Î±Ï Î±ÏοθηκεÏθηκε Ïε εξÏÏεÏÎ¹ÎºÏ Î¼ÎÏο αÏοθήκεÏ
ÏηÏ</string>
<string name="backup_restored">Το ανÏίγÏαÏο αÏÏÎ±Î»ÎµÎ¯Î±Ï ÎµÏαναÏÎÏθηκε</string>
- <string name="please_grant_permissions_for_external_storage">ΠαÏακαλοÏμε να ÏαÏαÏÏÏήÏεÏε δικαιÏμαÏα για εξÏÏεÏική αÏοθήκεÏ
Ïη</string>
<string name="restore_backup">ÎÏαναÏοÏά ανÏιγÏάÏοÏ
αÏÏαλείαÏ</string>
<string name="name_can_t_be_empty">Το Ïνομα δεν γίνεÏαι να είναι κενÏ</string>
<string name="fields_can_t_be_empty">Τα Ïεδία δεν μÏοÏεί να είναι κενά</string>
diff --git a/app-mini/src/main/res/values-es/strings.xml b/app-mini/src/main/res/values-es/strings.xml
index e983e86b..6b6a268d 100644
--- a/app-mini/src/main/res/values-es/strings.xml
+++ b/app-mini/src/main/res/values-es/strings.xml
@@ -149,7 +149,6 @@ direcciones (o rangos). No prevalecen sobre las configuraciones de exclusión de
<string name="delete_service">Borrar servicio</string>
<string name="backup_saved_at_external_storage">Copia de seguridad guardada en un almacenamiento externo</string>
<string name="backup_restored">Copia de seguridad restaurada</string>
- <string name="please_grant_permissions_for_external_storage">Por favor, conceda permisos para almacenamiento externo</string>
<string name="restore_backup">Restaurar copia de seguridad</string>
<string name="name_can_t_be_empty">El nombre no puede estar vacÃo</string>
<string name="fields_can_t_be_empty">Los campos no pueden estar vacÃos</string>
diff --git a/app-mini/src/main/res/values-eu/strings.xml b/app-mini/src/main/res/values-eu/strings.xml
index 7e96ed03..cb3c4a2d 100644
--- a/app-mini/src/main/res/values-eu/strings.xml
+++ b/app-mini/src/main/res/values-eu/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">Ezabatu zerbitzua</string>
<string name="backup_saved_at_external_storage">Babeskopia kanpo biltegiratzean gorde da</string>
<string name="backup_restored">Babeskopia berrezarri da</string>
- <string name="please_grant_permissions_for_external_storage">Eman kanpo biltegiratzerako baimena</string>
<string name="restore_backup">Berrezarri babeskopia</string>
<string name="name_can_t_be_empty">Izena ezin da hutsik egon</string>
<string name="fields_can_t_be_empty">Eremuak ezin dira hutsik egon</string>
diff --git a/app-mini/src/main/res/values-fa/strings.xml b/app-mini/src/main/res/values-fa/strings.xml
index aeec4bc9..5d2c9083 100644
--- a/app-mini/src/main/res/values-fa/strings.xml
+++ b/app-mini/src/main/res/values-fa/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">Øذ٠سرÙÛس</string>
<string name="backup_saved_at_external_storage">بکâآپ در اÙØ¨Ø§Ø±Ù Ø®Ø§Ø±Ø¬Û Ø°Ø®Ûر٠شد</string>
<string name="backup_restored">بکâآپ بازگرداÙد٠شد</string>
- <string name="please_grant_permissions_for_external_storage">ÙØ·Ùا ب٠اÙØ¨Ø§Ø±Ù Ø®Ø§Ø±Ø¬Û Ø§Ø¬Ø§Ø²Ù Ø¯Ø³ØªØ±Ø³Û Ø¨Ø¯ÙÛد</string>
<string name="restore_backup">برگرداÙد٠بکâآپ</string>
<string name="name_can_t_be_empty">ÙاÙ
ÙباÛد خاÙÛ Ø¨Ø§Ø´Ø¯</string>
<string name="fields_can_t_be_empty">زÙ
ÛÙÙâÙا ÙباÛد خاÙÛ Ø¨Ø§Ø´Ùد</string>
diff --git a/app-mini/src/main/res/values-fr/strings.xml b/app-mini/src/main/res/values-fr/strings.xml
index e9297469..13fa4c32 100644
--- a/app-mini/src/main/res/values-fr/strings.xml
+++ b/app-mini/src/main/res/values-fr/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">Supprimer le service</string>
<string name="backup_saved_at_external_storage">La sauvegarde a été enregistrée sur une mémoire externe</string>
<string name="backup_restored">La sauvegarde a été restaurée</string>
- <string name="please_grant_permissions_for_external_storage">Veuillez accorder les droits vers la mémoire externe</string>
<string name="restore_backup">Restaurer la sauvegarde</string>
<string name="name_can_t_be_empty">Le nom ne peut pas être vide</string>
<string name="fields_can_t_be_empty">Les champs ne peuvent pas être vides</string>
diff --git a/app-mini/src/main/res/values-gl/strings.xml b/app-mini/src/main/res/values-gl/strings.xml
index e864f280..7c1fa842 100644
--- a/app-mini/src/main/res/values-gl/strings.xml
+++ b/app-mini/src/main/res/values-gl/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">Eliminar servizo</string>
<string name="backup_saved_at_external_storage">Respaldo gardado en almacenamento externo</string>
<string name="backup_restored">Respaldo restaurado</string>
- <string name="please_grant_permissions_for_external_storage">Por favor, conceda permiso para o almacenamento externo</string>
<string name="restore_backup">Restaurar respaldo</string>
<string name="name_can_t_be_empty">O nome non pode quedar baldeiro</string>
<string name="fields_can_t_be_empty">Os campos non poden estar baldeiros</string>
diff --git a/app-mini/src/main/res/values-he/strings.xml b/app-mini/src/main/res/values-he/strings.xml
index 61047bd7..648cf7dd 100644
--- a/app-mini/src/main/res/values-he/strings.xml
+++ b/app-mini/src/main/res/values-he/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">××ק ש×ר×ת</string>
<string name="backup_saved_at_external_storage">××××× × ×©×ר ×××ס×× ××צ×× ×</string>
<string name="backup_restored">××××× ×©×××ר</string>
- <string name="please_grant_permissions_for_external_storage">×× × ××¢× ×§ ×רש××ת ×¢××ר ××ס×× ××צ×× ×</string>
<string name="restore_backup">ש××ר ×××××</string>
<string name="name_can_t_be_empty">×©× ××× × ×××× ××××ת ר×ק</string>
<string name="fields_can_t_be_empty">ש××ת ××× × ×××××× ××××ת ר×ק××</string>
diff --git a/app-mini/src/main/res/values-hi/strings.xml b/app-mini/src/main/res/values-hi/strings.xml
index 94c08db6..8e9088ab 100644
--- a/app-mini/src/main/res/values-hi/strings.xml
+++ b/app-mini/src/main/res/values-hi/strings.xml
@@ -149,7 +149,6 @@
<string name="delete_service">सà¥à¤µà¤¾ हà¤à¤¾à¤à¤</string>
<string name="backup_saved_at_external_storage">बाहà¥à¤¯ सà¤à¤à¥à¤°à¤¹à¤£ मà¥à¤ बà¥à¤à¤
प सहà¥à¤à¤¾ à¤à¤¯à¤¾</string>
<string name="backup_restored">बà¥à¤à¤
प à¤à¥ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ à¤à¤¿à¤¯à¤¾ à¤à¤¯à¤¾</string>
- <string name="please_grant_permissions_for_external_storage">à¤à¥à¤ªà¤¯à¤¾ बाहरॠसà¤à¤à¥à¤°à¤¹à¤£ à¤à¥ लिठà¤
नà¥à¤®à¤¤à¤¿ दà¥à¤</string>
<string name="restore_backup">बà¥à¤à¤
प बहाल</string>
<string name="name_can_t_be_empty">नाम रिà¤à¥à¤¤ नहà¥à¤ हॠसà¤à¤¤à¤¾</string>
<string name="fields_can_t_be_empty">फ़à¥à¤²à¥à¤¡ रिà¤à¥à¤¤ नहà¥à¤ हॠसà¤à¤¤à¥</string>
diff --git a/app-mini/src/main/res/values-hu/strings.xml b/app-mini/src/main/res/values-hu/strings.xml
index b41c415c..246f581f 100644
--- a/app-mini/src/main/res/values-hu/strings.xml
+++ b/app-mini/src/main/res/values-hu/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">Szolgáltatás Törlése</string>
<string name="backup_saved_at_external_storage">KülsŠtárhelyre mentve</string>
<string name="backup_restored">Mentés visszaállÃtva</string>
- <string name="please_grant_permissions_for_external_storage">Kérjük adjon jogosultságot a külsŠtárhelyhez</string>
<string name="restore_backup">Mentés visszaállÃtása</string>
<string name="name_can_t_be_empty">A név nem lehet üres</string>
<string name="fields_can_t_be_empty">A mezÅk nem lehetnek üresek</string>
diff --git a/app-mini/src/main/res/values-is/strings.xml b/app-mini/src/main/res/values-is/strings.xml
index f96562a5..e130a256 100644
--- a/app-mini/src/main/res/values-is/strings.xml
+++ b/app-mini/src/main/res/values-is/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">Eyða þjónustu</string>
<string name="backup_saved_at_external_storage">Ãryggisafrit var vistað à ytri gagnageymslu</string>
<string name="backup_restored">Ãryggisafrit var endurheimt</string>
- <string name="please_grant_permissions_for_external_storage">Gefðu heimild til að nota ytri gagnageymslu</string>
<string name="restore_backup">Endurheimta úr öryggisafriti</string>
<string name="name_can_t_be_empty">Nafnið má ekki vera autt</string>
<string name="fields_can_t_be_empty">Gagnasvið mega ekki vera auð</string>
diff --git a/app-mini/src/main/res/values-it/strings.xml b/app-mini/src/main/res/values-it/strings.xml
index 34b6d8bb..8ba73822 100644
--- a/app-mini/src/main/res/values-it/strings.xml
+++ b/app-mini/src/main/res/values-it/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">Elimina il servizio</string>
<string name="backup_saved_at_external_storage">Backup salvato nell\'archiviazione esterna</string>
<string name="backup_restored">Backup ripristinato</string>
- <string name="please_grant_permissions_for_external_storage">Consenti l\'autorizzazione per l\'archiviazione esterna</string>
<string name="restore_backup">Ripristina backup</string>
<string name="name_can_t_be_empty">Il nome non può essere vuoto</string>
<string name="fields_can_t_be_empty">I campi non possono essere vuoti</string>
diff --git a/app-mini/src/main/res/values-ja/strings.xml b/app-mini/src/main/res/values-ja/strings.xml
index 2153c958..acfb1770 100644
--- a/app-mini/src/main/res/values-ja/strings.xml
+++ b/app-mini/src/main/res/values-ja/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">ãµã¼ãã¹ãåé¤</string>
<string name="backup_saved_at_external_storage">ããã¯ã¢ããã¯å¤é¨è¨æ¶è£
ç½®ã«ä¿åããã¾ãã</string>
<string name="backup_restored">ããã¯ã¢ãããã復å
</string>
- <string name="please_grant_permissions_for_external_storage">å¤é¨è¨æ¶ã¸ã®ã¢ã¯ã»ã¹è¨±å¯ãä¸ãã¦ä¸ããã</string>
<string name="restore_backup">ããã¯ã¢ããã®å¾©æ§</string>
<string name="name_can_t_be_empty">ååã¯ãã©ã³ã¯ã®ã¾ã¾ã«ã§ãã¾ãã</string>
<string name="fields_can_t_be_empty">ãã£ã¼ã«ãã空ã«ãã¦ãããã¨ã¯ã§ãã¾ãã</string>
diff --git a/app-mini/src/main/res/values-mk/strings.xml b/app-mini/src/main/res/values-mk/strings.xml
index 3e5f07cf..cbb7af41 100644
--- a/app-mini/src/main/res/values-mk/strings.xml
+++ b/app-mini/src/main/res/values-mk/strings.xml
@@ -148,8 +148,7 @@
<string name="delete_service">ÐзбÑиÑи ÑÑлÑга</string>
<string name="backup_saved_at_external_storage">РезеÑвнаÑа копиÑа е Ñнимена на надвоÑеÑна мемоÑиÑа</string>
<string name="backup_restored">ÐÑаÑено од ÑезеÑвна копиÑа</string>
- <string name="please_grant_permissions_for_external_storage">Ðе молиме дадеÑе дозволи за надвоÑеÑна мемоÑиÑа</string>
- <string name="restore_backup">ÐÑаÑи ÑезеÑвна копиÑа</string>
+ <string name="restore_backup">ÐÑаÑи ÑезеÑвна копиÑа</string>
<string name="name_can_t_be_empty">ÐмеÑо не може да биде пÑазно</string>
<string name="fields_can_t_be_empty">ÐолиÑаÑа не Ð¼Ð¾Ð¶Ð°Ñ Ð´Ð° Ð±Ð¸Ð´Ð°Ñ Ð¿Ñазни</string>
<string name="start_tor_again_for_finish_the_process">СÑаÑÑÑÐ²Ð°Ñ Ð³Ð¾ Tor повÑоÑно да го завÑÑи пÑоÑеÑоÑ</string>
diff --git a/app-mini/src/main/res/values-nl/strings.xml b/app-mini/src/main/res/values-nl/strings.xml
index 9bc94cf5..6eaf424b 100644
--- a/app-mini/src/main/res/values-nl/strings.xml
+++ b/app-mini/src/main/res/values-nl/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">Dienst verwijderen</string>
<string name="backup_saved_at_external_storage">Back-up opgeslagen op externe opslag</string>
<string name="backup_restored">Back-up hersteld</string>
- <string name="please_grant_permissions_for_external_storage">Verleen toestemmingen voor externe opslag</string>
<string name="restore_backup">Back-up herstellen</string>
<string name="name_can_t_be_empty">Naam kan niet leeg zijn</string>
<string name="fields_can_t_be_empty">Velden kunnen niet leeg zijn</string>
diff --git a/app-mini/src/main/res/values-pt-rBR/strings.xml b/app-mini/src/main/res/values-pt-rBR/strings.xml
index 245010a7..b84193b8 100644
--- a/app-mini/src/main/res/values-pt-rBR/strings.xml
+++ b/app-mini/src/main/res/values-pt-rBR/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">Remover Serviço</string>
<string name="backup_saved_at_external_storage">Backup salvo em mÃdia externa</string>
<string name="backup_restored">Backup Restaurado</string>
- <string name="please_grant_permissions_for_external_storage">Por favor dê permissões ao armazenamento externo</string>
<string name="restore_backup">Restaurar Backup</string>
<string name="name_can_t_be_empty">O campo Nome não pode ser vazio</string>
<string name="fields_can_t_be_empty">Campos não podem ser vazios</string>
diff --git a/app-mini/src/main/res/values-ru/strings.xml b/app-mini/src/main/res/values-ru/strings.xml
index e35abff7..10dc0103 100644
--- a/app-mini/src/main/res/values-ru/strings.xml
+++ b/app-mini/src/main/res/values-ru/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">УдалиÑÑ ÑлÑжбÑ</string>
<string name="backup_saved_at_external_storage">РезеÑÐ²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ ÑоÑ
Ñанена на внеÑнем Ñ
ÑанилиÑе</string>
<string name="backup_restored">ÐоÑÑÑановлено из ÑезеÑвной копии</string>
- <string name="please_grant_permissions_for_external_storage">ÐÑедоÑÑавÑÑе ÑазÑеÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к внеÑÐ½ÐµÐ¼Ñ Ñ
ÑанилиÑÑ</string>
<string name="restore_backup">ÐоÑÑÑановиÑÑ Ð¸Ð· копии</string>
<string name="name_can_t_be_empty">ÐÐ¼Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑÑм</string>
<string name="fields_can_t_be_empty">ÐÐ¾Ð»Ñ Ð½Ðµ могÑÑ Ð±ÑÑÑ Ð¿ÑÑÑÑми</string>
diff --git a/app-mini/src/main/res/values-sr/strings.xml b/app-mini/src/main/res/values-sr/strings.xml
index cf542265..fc31f59e 100644
--- a/app-mini/src/main/res/values-sr/strings.xml
+++ b/app-mini/src/main/res/values-sr/strings.xml
@@ -146,7 +146,6 @@
<string name="delete_service">ÐбÑиÑи УÑлÑгÑ</string>
<string name="backup_saved_at_external_storage">РезеÑбна копиÑа Ñе ÑаÑÑвана на ÑпоÑÐ½Ð¾Ñ Ð¼ÐµÐ¼Ð¾ÑиÑи</string>
<string name="backup_restored">РезеÑвна копиÑа Ñе обновÑена</string>
- <string name="please_grant_permissions_for_external_storage">Ðолимо да даÑе дозволе за екÑÑеÑно ÑкладиÑÑеÑе</string>
<string name="restore_backup">Ðбнови ÑезеÑÐ²Ð½Ñ ÐºÐ¾Ð¿Ð¸ÑÑ</string>
<string name="name_can_t_be_empty">Ðме не може биÑи пÑазно</string>
<string name="fields_can_t_be_empty">ÐоÑа не Ð¼Ð¾Ð³Ñ Ð±Ð¸Ñи пÑазна</string>
diff --git a/app-mini/src/main/res/values-sv/strings.xml b/app-mini/src/main/res/values-sv/strings.xml
index 0ff7349c..dec83ffe 100644
--- a/app-mini/src/main/res/values-sv/strings.xml
+++ b/app-mini/src/main/res/values-sv/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">Ta bort tjänst</string>
<string name="backup_saved_at_external_storage">Säkerhetskopiering sparad i externt lagringsutrymme</string>
<string name="backup_restored">Backup återställd</string>
- <string name="please_grant_permissions_for_external_storage">Bevilja tillstånd för extern lagring</string>
<string name="restore_backup">Ã
terställa säkerhetskopia</string>
<string name="name_can_t_be_empty">Namnet kan inte vara tomt</string>
<string name="fields_can_t_be_empty">Fält kan inte vara tomma</string>
diff --git a/app-mini/src/main/res/values-th/strings.xml b/app-mini/src/main/res/values-th/strings.xml
index 65d55211..451e3e52 100644
--- a/app-mini/src/main/res/values-th/strings.xml
+++ b/app-mini/src/main/res/values-th/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">à¸à¸£à¸´à¸à¸²à¸£à¸¥à¸</string>
<string name="backup_saved_at_external_storage">à¸à¹à¸à¸¡à¸¹à¸¥à¸ªà¸³à¸£à¸à¸à¸à¸±à¸à¸à¸¶à¸à¸à¸µà¹à¸à¸µà¹à¹à¸à¹à¸à¸à¹à¸à¸¡à¸¹à¸¥à¸ ายà¸à¸à¸</string>
<string name="backup_restored">à¸à¸·à¸à¸à¹à¸²à¸à¹à¸à¸¡à¸¹à¸¥à¸ªà¸³à¸£à¸à¸</string>
- <string name="please_grant_permissions_for_external_storage">à¸à¸£à¸¸à¸à¸²à¸à¸à¸¸à¸à¸²à¸à¹à¸«à¹à¹à¸à¹à¸²à¸à¸¶à¸à¸à¸µà¹à¹à¸à¹à¸à¸à¹à¸à¸¡à¸¹à¸¥à¸ ายà¸à¸à¸</string>
<string name="restore_backup">à¸à¸·à¸à¸à¹à¸²à¸à¹à¸à¸¡à¸¹à¸¥à¸ªà¸³à¸£à¸à¸</string>
<string name="name_can_t_be_empty">à¸à¸¥à¹à¸à¸¢à¸à¸·à¹à¸à¹à¸«à¹à¸§à¹à¸²à¸à¹à¸¡à¹à¹à¸à¹</string>
<string name="fields_can_t_be_empty">à¸à¸¥à¹à¸à¸¢à¹à¸à¸à¸à¹à¸à¸¡à¸¹à¸¥à¹à¸«à¹à¸§à¹à¸²à¸à¹à¸¡à¹à¹à¸à¹</string>
diff --git a/app-mini/src/main/res/values-tr/strings.xml b/app-mini/src/main/res/values-tr/strings.xml
index 00351b51..37830272 100644
--- a/app-mini/src/main/res/values-tr/strings.xml
+++ b/app-mini/src/main/res/values-tr/strings.xml
@@ -148,8 +148,7 @@
<string name="delete_service">Hizmeti Sil</string>
<string name="backup_saved_at_external_storage">Yedek dıŠdepolamaya kaydedildi</string>
<string name="backup_restored">Yedek geri yüklendi</string>
- <string name="please_grant_permissions_for_external_storage">Lütfen dıŠdepolama için izinleri verin</string>
- <string name="restore_backup">YedeÄi Geri Yükle</string>
+ <string name="restore_backup">YedeÄi Geri Yükle</string>
<string name="name_can_t_be_empty">Ad boŠbırakılamaz</string>
<string name="fields_can_t_be_empty">Alanlar boŠbırakılamaz</string>
<string name="start_tor_again_for_finish_the_process">Ä°Ålemi tamamlamak için Tor uygulamasını yeniden baÅlatın</string>
diff --git a/app-mini/src/main/res/values-uk/strings.xml b/app-mini/src/main/res/values-uk/strings.xml
index a18c7ffc..5eee9760 100644
--- a/app-mini/src/main/res/values-uk/strings.xml
+++ b/app-mini/src/main/res/values-uk/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">ÐилÑÑиÑи СеÑвÑÑ</string>
<string name="backup_saved_at_external_storage">РезеÑвна копÑÑ Ð·Ð±ÐµÑежена на зовнÑÑнÑй пам\'ÑÑÑ</string>
<string name="backup_restored">РезеÑвне копÑÑÐ²Ð°Ð½Ð½Ñ Ð²Ñдновлено</string>
- <string name="please_grant_permissions_for_external_storage">ÐадайÑе дозволи на зовнÑÑÐ½Ñ Ð¿Ð°Ð¼\'ÑÑÑ</string>
<string name="restore_backup">ÐÑдновиÑи ÑезеÑÐ²Ð½Ñ ÐºÐ¾Ð¿ÑÑ</string>
<string name="name_can_t_be_empty">Ðазва не може бÑÑи поÑожнÑоÑ</string>
<string name="fields_can_t_be_empty">ÐÐ¾Ð»Ñ Ð½Ðµ можÑÑÑ Ð±ÑÑи поÑожнÑми</string>
diff --git a/app-mini/src/main/res/values-zh-rTW/strings.xml b/app-mini/src/main/res/values-zh-rTW/strings.xml
index 063813c8..0f0dac44 100644
--- a/app-mini/src/main/res/values-zh-rTW/strings.xml
+++ b/app-mini/src/main/res/values-zh-rTW/strings.xml
@@ -148,7 +148,6 @@
<string name="delete_service">åªé¤æå</string>
<string name="backup_saved_at_external_storage">å份æªå²åå¨å¤é¨å²åå¨</string>
<string name="backup_restored">å份已éå</string>
- <string name="please_grant_permissions_for_external_storage">è«ææ¬å¤æ¥å²åå¨ä½¿ç¨</string>
<string name="restore_backup">éåå份</string>
<string name="name_can_t_be_empty">å稱ä¸å¯ç©ºç½</string>
<string name="fields_can_t_be_empty">æ¬ä½ä¸å¯ç©ºç½</string>
diff --git a/app-mini/src/main/res/values/strings.xml b/app-mini/src/main/res/values/strings.xml
index 994e4ee3..087af9ba 100644
--- a/app-mini/src/main/res/values/strings.xml
+++ b/app-mini/src/main/res/values/strings.xml
@@ -187,7 +187,6 @@
<string name="delete_service">Delete Service</string>
<string name="backup_saved_at_external_storage">Backup saved at external storage</string>
<string name="backup_restored">Backup restored</string>
- <string name="please_grant_permissions_for_external_storage">Please grant permissions for external storage</string>
<string name="restore_backup">Restore Backup</string>
<string name="name_can_t_be_empty">Name can\'t be empty</string>
<string name="fields_can_t_be_empty">Fields can\'t be empty</string>
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 971fd52b..af7f1d97 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -16,8 +16,9 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+ <uses-permission
+ android:name="android.permission.WRITE_EXTERNAL_STORAGE"
+ android:maxSdkVersion="18" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<application
@@ -75,7 +76,8 @@
<activity
android:name=".core.ui.SettingsPreferencesActivity"
- android:label="@string/app_name" />
+ android:label="@string/app_name"
+ android:theme="@style/Theme.AppCompat" />
<activity
android:name=".ui.AppManagerActivity"
diff --git a/app/src/main/java/org/torproject/android/ui/dialog/AboutDialogFragment.java b/app/src/main/java/org/torproject/android/ui/dialog/AboutDialogFragment.java
index d83b556e..dbb33c67 100644
--- a/app/src/main/java/org/torproject/android/ui/dialog/AboutDialogFragment.java
+++ b/app/src/main/java/org/torproject/android/ui/dialog/AboutDialogFragment.java
@@ -2,7 +2,6 @@ package org.torproject.android.ui.dialog;
import android.app.AlertDialog;
import android.app.Dialog;
-import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.text.Html;
@@ -12,11 +11,10 @@ import android.widget.TextView;
import androidx.fragment.app.DialogFragment;
import org.torproject.android.R;
+import org.torproject.android.core.DiskUtils;
import org.torproject.android.service.OrbotService;
-import java.io.BufferedReader;
import java.io.IOException;
-import java.io.InputStreamReader;
public class AboutDialogFragment extends DialogFragment {
@@ -24,21 +22,6 @@ public class AboutDialogFragment extends DialogFragment {
private static final String BUNDLE_KEY_TV_ABOUT_TEXT = "about_tv_txt";
private TextView tvAbout;
- @SuppressWarnings("SameParameterValue")
- private static String readFromAssets(Context context, String filename) throws IOException {
- BufferedReader reader = new BufferedReader(new InputStreamReader(context.getAssets().open(filename)));
-
- // do reading, usually loop until end of file reading
- StringBuilder sb = new StringBuilder();
- String mLine = reader.readLine();
- while (mLine != null) {
- sb.append(mLine).append('\n'); // process line
- mLine = reader.readLine();
- }
- reader.close();
- return sb.toString();
- }
-
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
View view = getActivity().getLayoutInflater().inflate(R.layout.layout_about, null);
@@ -69,7 +52,7 @@ public class AboutDialogFragment extends DialogFragment {
if (buildAboutText) {
try {
- String aboutText = readFromAssets(getContext(), "LICENSE");
+ String aboutText = DiskUtils.readFileFromAssets("LICENSE", getContext());
aboutText = aboutText.replace("\n", "<br/>");
tvAbout.setText(Html.fromHtml(aboutText));
} catch (IOException e) {
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/ClientCookiesActivity.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/ClientCookiesActivity.java
index e3fbaeab..86b7b5ac 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/ClientCookiesActivity.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/ClientCookiesActivity.java
@@ -1,10 +1,10 @@
package org.torproject.android.ui.hiddenservices;
+import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.PackageManager;
import android.database.ContentObserver;
import android.database.Cursor;
import android.os.Bundle;
@@ -29,12 +29,12 @@ import org.torproject.android.ui.hiddenservices.adapters.ClientCookiesAdapter;
import org.torproject.android.ui.hiddenservices.backup.BackupUtils;
import org.torproject.android.ui.hiddenservices.dialogs.AddCookieDialog;
import org.torproject.android.ui.hiddenservices.dialogs.CookieActionsDialog;
-import org.torproject.android.ui.hiddenservices.permissions.PermissionManager;
import org.torproject.android.ui.hiddenservices.providers.CookieContentProvider;
-public class ClientCookiesActivity extends AppCompatActivity {
- public final int WRITE_EXTERNAL_STORAGE_FROM_COOKIE_ACTIONBAR = 3;
+import java.io.File;
+public class ClientCookiesActivity extends AppCompatActivity {
+ private static final int REQUEST_CODE_READ_COOKIE = 54;
private ContentResolver mResolver;
private ClientCookiesAdapter mAdapter;
@@ -54,12 +54,9 @@ public class ClientCookiesActivity extends AppCompatActivity {
dialog.show(getSupportFragmentManager(), "AddCookieDialog");
});
- mAdapter = new ClientCookiesAdapter(this,
- mResolver.query(CookieContentProvider.CONTENT_URI, CookieContentProvider.PROJECTION, null, null, null), 0);
+ mAdapter = new ClientCookiesAdapter(this, mResolver.query(CookieContentProvider.CONTENT_URI, CookieContentProvider.PROJECTION, null, null, null), 0);
- mResolver.registerContentObserver(
- CookieContentProvider.CONTENT_URI, true, new HSObserver(new Handler())
- );
+ mResolver.registerContentObserver(CookieContentProvider.CONTENT_URI, true, new HSObserver(new Handler()));
ListView cookies = findViewById(R.id.clien_cookies_list);
cookies.setAdapter(mAdapter);
@@ -78,10 +75,8 @@ public class ClientCookiesActivity extends AppCompatActivity {
dialog.setArguments(arguments);
dialog.show(getSupportFragmentManager(), CookieActionsDialog.class.getSimpleName());
});
-
}
-
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(LocaleHelper.onAttach(base));
@@ -93,22 +88,18 @@ public class ClientCookiesActivity extends AppCompatActivity {
return true;
}
- private static final int REQUEST_CODE_READ_COOKIE = 54;
-
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.cookie_restore_backup) {
- if (PermissionManager.isLollipopOrHigher()
- && !PermissionManager.hasExternalWritePermission(this)) {
- PermissionManager.requestExternalWritePermissions(this, WRITE_EXTERNAL_STORAGE_FROM_COOKIE_ACTIONBAR);
- return true;
+ if (DiskUtils.supportsStorageAccessFramework()) {
+ Intent readCookieIntent = DiskUtils.createReadFileIntent("application/json");
+ startActivityForResult(readCookieIntent, REQUEST_CODE_READ_COOKIE);
+ } else { // api 16,17,18
+ restoreBackupLegacy();
}
- Intent readCookieIntent = DiskUtils.createReadFileIntent("application/json");
- startActivityForResult(readCookieIntent, REQUEST_CODE_READ_COOKIE);
-
} else if (id == R.id.cookie_from_qr) {
IntentIntegrator integrator = new IntentIntegrator(ClientCookiesActivity.this);
integrator.initiateScan();
@@ -117,22 +108,30 @@ public class ClientCookiesActivity extends AppCompatActivity {
return super.onOptionsItemSelected(item);
}
- @Override
- public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
- if (grantResults.length < 1
- || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
- return;
- }
+ private void restoreBackupLegacy() {
+ File backupDir = DiskUtils.getOrCreateLegacyBackupDir();
- switch (requestCode) {
- case CookieActionsDialog.WRITE_EXTERNAL_STORAGE_FROM_COOKIE_ACTION_DIALOG: {
- try {
- CookieActionsDialog activeDialog = (CookieActionsDialog) getSupportFragmentManager().findFragmentByTag(CookieActionsDialog.class.getSimpleName());
- activeDialog.doBackup();
- } catch (ClassCastException e) {
+ try {
+ File[] files = backupDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".json"));
+ if (files != null) {
+ if (files.length == 0) {
+ Toast.makeText(this, R.string.create_a_backup_first, Toast.LENGTH_LONG).show();
+ return;
}
- break;
+
+ CharSequence[] fileNames = new CharSequence[files.length];
+ for (int i = 0; i < files.length; i++) fileNames[i] = files[i].getName();
+
+ new AlertDialog.Builder(this)
+ .setItems(fileNames, (dialog, which) -> {
+ String text = DiskUtils.readFile(mResolver, files[which]);
+ new BackupUtils(this).restoreCookieBackup(text);
+ })
+ .setTitle(R.string.restore_backup)
+ .show();
}
+ } catch (Exception e) {
+ Toast.makeText(this, R.string.error, Toast.LENGTH_LONG).show();
}
}
@@ -142,9 +141,8 @@ public class ClientCookiesActivity extends AppCompatActivity {
if (request == REQUEST_CODE_READ_COOKIE) {
if (response != RESULT_OK) return;
- String cookieStr = DiskUtils.readFileFromInputStream(getContentResolver(), data.getData());
- BackupUtils backup = new BackupUtils(this);
- backup.restoreCookieBackup(cookieStr);
+ String cookieStr = DiskUtils.readFileFromInputStream(mResolver, data.getData());
+ new BackupUtils(this).restoreCookieBackup(cookieStr);
return;
}
@@ -162,13 +160,11 @@ public class ClientCookiesActivity extends AppCompatActivity {
fields.put(
CookieContentProvider.ClientCookie.DOMAIN,
- savedValues.getString(CookieContentProvider.ClientCookie.DOMAIN)
- );
+ savedValues.getString(CookieContentProvider.ClientCookie.DOMAIN));
fields.put(
CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE,
- savedValues.getString(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE)
- );
+ savedValues.getString(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE));
mResolver.insert(CookieContentProvider.CONTENT_URI, fields);
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/HiddenServicesActivity.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/HiddenServicesActivity.java
index 6430d48d..f3efa689 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/HiddenServicesActivity.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/HiddenServicesActivity.java
@@ -3,7 +3,6 @@ package org.torproject.android.ui.hiddenservices;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.PackageManager;
import android.database.ContentObserver;
import android.database.Cursor;
import android.os.Bundle;
@@ -13,7 +12,9 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.RadioButton;
+import android.widget.Toast;
+import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
@@ -29,15 +30,16 @@ import org.torproject.android.ui.hiddenservices.dialogs.HSDataDialog;
import org.torproject.android.ui.hiddenservices.permissions.PermissionManager;
import org.torproject.android.ui.hiddenservices.providers.HSContentProvider;
+import java.io.File;
+
public class HiddenServicesActivity extends AppCompatActivity {
private static final int REQUEST_CODE_READ_ZIP_BACKUP = 125;
- public final int WRITE_EXTERNAL_STORAGE_FROM_ACTIONBAR = 1;
+ private static final String BUNDLE_KEY_SHOW_USER_SERVICES = "show_user_services";
private ContentResolver mResolver;
private OnionListAdapter mAdapter;
private RadioButton radioShowUserServices, radioShowAppServices;
private FloatingActionButton fab;
private String mWhere = HSContentProvider.HiddenService.CREATED_BY_USER + "=1";
- private static final String BUNDLE_KEY_SHOW_USER_SERVICES = "show_user_services";
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -102,9 +104,24 @@ public class HiddenServicesActivity extends AppCompatActivity {
return true;
}
- private void doRestore() {
- Intent readFile = DiskUtils.createReadFileIntent("application/zip");
- startActivityForResult(readFile, REQUEST_CODE_READ_ZIP_BACKUP);
+ private void doRestoreLegacy() { // API 16, 17, 18
+ File backupDir = DiskUtils.getOrCreateLegacyBackupDir();
+ File[] files = backupDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".zip"));
+ if (files != null) {
+ if (files.length == 0) {
+ Toast.makeText(this, R.string.create_a_backup_first, Toast.LENGTH_LONG).show();
+ return;
+ }
+
+ CharSequence[] fileNames = new CharSequence[files.length];
+ for (int i = 0; i < files.length; i++) fileNames[i] = files[i].getName();
+
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.restore_backup)
+ .setItems(fileNames, (dialog, which) -> new BackupUtils(HiddenServicesActivity.this).restoreZipBackupLegacy(files[which]))
+ .show();
+
+ }
}
@Override
@@ -120,38 +137,17 @@ public class HiddenServicesActivity extends AppCompatActivity {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.menu_restore_backup) {
- if (PermissionManager.isLollipopOrHigher()
- && !PermissionManager.hasExternalWritePermission(this)) {
- PermissionManager.requestExternalWritePermissions(this, WRITE_EXTERNAL_STORAGE_FROM_ACTIONBAR);
- return true;
+ if (DiskUtils.supportsStorageAccessFramework()) {
+ Intent readFile = DiskUtils.createReadFileIntent("application/zip");
+ startActivityForResult(readFile, REQUEST_CODE_READ_ZIP_BACKUP);
+ } else { // API 16, 17, 18
+ doRestoreLegacy();
}
- doRestore();
}
return super.onOptionsItemSelected(item);
}
- @Override
- public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
- if (grantResults.length < 1 || grantResults[0] != PackageManager.PERMISSION_GRANTED)
- return;
-
- switch (requestCode) {
- case WRITE_EXTERNAL_STORAGE_FROM_ACTIONBAR: {
- doRestore();
- break;
- }
- case HSActionsDialog.WRITE_EXTERNAL_STORAGE_FROM_ACTION_DIALOG: {
- try {
- HSActionsDialog activeDialog = (HSActionsDialog) getSupportFragmentManager().findFragmentByTag(HSActionsDialog.class.getSimpleName());
- activeDialog.doBackup();
- } catch (ClassCastException e) {
- }
- break;
- }
- }
- }
-
private void filterServices(boolean showUserServices) {
if (showUserServices) {
mWhere = HSContentProvider.HiddenService.CREATED_BY_USER + "=1";
@@ -185,19 +181,17 @@ public class HiddenServicesActivity extends AppCompatActivity {
public void onChange(boolean selfChange) {
mAdapter.changeCursor(mResolver.query(HSContentProvider.CONTENT_URI, HSContentProvider.PROJECTION, mWhere, null, null));
- if (PermissionManager.isLollipopOrHigher()) {
- Cursor active = mResolver.query(
- HSContentProvider.CONTENT_URI, HSContentProvider.PROJECTION, HSContentProvider.HiddenService.ENABLED + "=1", null, null);
+ if (!PermissionManager.isLollipopOrHigher()) return;
+ Cursor active = mResolver.query(HSContentProvider.CONTENT_URI, HSContentProvider.PROJECTION, HSContentProvider.HiddenService.ENABLED + "=1", null, null);
- if (active == null) return;
+ if (active == null) return;
- if (active.getCount() > 0) // Call only if there running services
- PermissionManager.requestBatteryPermmssions(HiddenServicesActivity.this, getApplicationContext());
- else // Drop whe not needed
- PermissionManager.requestDropBatteryPermmssions(HiddenServicesActivity.this, getApplicationContext());
+ if (active.getCount() > 0) // Call only if there running services
+ PermissionManager.requestBatteryPermissions(HiddenServicesActivity.this, getApplicationContext());
+ else // Drop whe not needed
+ PermissionManager.requestDropBatteryPermissions(HiddenServicesActivity.this, getApplicationContext());
- active.close();
- }
+ active.close();
}
}
}
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/adapters/ClientCookiesAdapter.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/adapters/ClientCookiesAdapter.java
index e7123522..d40fa34d 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/adapters/ClientCookiesAdapter.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/adapters/ClientCookiesAdapter.java
@@ -20,9 +20,7 @@ public class ClientCookiesAdapter extends CursorAdapter {
public ClientCookiesAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
-
- cursorInflater = (LayoutInflater) context.getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
+ cursorInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
@@ -35,9 +33,7 @@ public class ClientCookiesAdapter extends CursorAdapter {
domain.setText(cursor.getString(cursor.getColumnIndex(CookieContentProvider.ClientCookie.DOMAIN)));
SwitchCompat enabled = view.findViewById(R.id.cookie_switch);
- enabled.setChecked(
- cursor.getInt(cursor.getColumnIndex(CookieContentProvider.ClientCookie.ENABLED)) == 1
- );
+ enabled.setChecked(cursor.getInt(cursor.getColumnIndex(CookieContentProvider.ClientCookie.ENABLED)) == 1);
enabled.setOnCheckedChangeListener((buttonView, isChecked) -> {
ContentResolver resolver = mContext.getContentResolver();
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/adapters/OnionListAdapter.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/adapters/OnionListAdapter.java
index 1431aa7f..d4e39ece 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/adapters/OnionListAdapter.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/adapters/OnionListAdapter.java
@@ -21,7 +21,6 @@ public class OnionListAdapter extends CursorAdapter {
public OnionListAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
-
cursorInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@@ -39,19 +38,14 @@ public class OnionListAdapter extends CursorAdapter {
domain.setText(cursor.getString(cursor.getColumnIndex(HSContentProvider.HiddenService.DOMAIN)));
SwitchCompat enabled = view.findViewById(R.id.hs_switch);
- enabled.setChecked(
- cursor.getInt(cursor.getColumnIndex(HSContentProvider.HiddenService.ENABLED)) == 1
- );
-
+ enabled.setChecked(cursor.getInt(cursor.getColumnIndex(HSContentProvider.HiddenService.ENABLED)) == 1);
enabled.setOnCheckedChangeListener((buttonView, isChecked) -> {
ContentResolver resolver = mContext.getContentResolver();
ContentValues fields = new ContentValues();
fields.put(HSContentProvider.HiddenService.ENABLED, isChecked);
resolver.update(HSContentProvider.CONTENT_URI, fields, where, null);
- Toast.makeText(
- mContext, R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG
- ).show();
+ Toast.makeText(mContext, R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG).show();
});
}
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/BackupUtils.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/BackupUtils.java
index 86fc80c6..efa73c9a 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/BackupUtils.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/BackupUtils.java
@@ -28,7 +28,7 @@ import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
public class BackupUtils {
- private final String configFileName = "config.json";
+ private static final String configFileName = "config.json";
private Context mContext;
private ContentResolver mResolver;
@@ -38,14 +38,21 @@ public class BackupUtils {
}
public String createZipBackup(int port, Uri zipFile) {
- File mHSBasePath = new File(
- mContext.getFilesDir().getAbsolutePath(),
- TorServiceConstants.HIDDEN_SERVICES_DIR
- );
+ String[] files = createFilesForZipping(port);
+ ZipIt zip = new ZipIt(files, zipFile, mResolver);
+
+ if (!zip.zip())
+ return null;
+
+ return zipFile.getPath();
+ }
+
- String configFilePath = mHSBasePath + "/hs" + port + "/" + configFileName;
- String hostnameFilePath = mHSBasePath + "/hs" + port + "/hostname";
- String keyFilePath = mHSBasePath + "/hs" + port + "/private_key";
+ private String[] createFilesForZipping(int port) {
+ File hsBasePath = getHSBasePath();
+ String configFilePath = hsBasePath + "/hs" + port + "/" + configFileName;
+ String hostnameFilePath = hsBasePath + "/hs" + port + "/hostname";
+ String keyFilePath = hsBasePath + "/hs" + port + "/private_key";
Cursor portData = mResolver.query(
HSContentProvider.CONTENT_URI,
@@ -62,45 +69,14 @@ public class BackupUtils {
portData.moveToNext();
- config.put(
- HSContentProvider.HiddenService.NAME,
- portData.getString(portData.getColumnIndex(HSContentProvider.HiddenService.NAME))
- );
-
- config.put(
- HSContentProvider.HiddenService.PORT,
- portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.PORT))
- );
-
- config.put(
- HSContentProvider.HiddenService.ONION_PORT,
- portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.ONION_PORT))
- );
-
- config.put(
- HSContentProvider.HiddenService.DOMAIN,
- portData.getString(portData.getColumnIndex(HSContentProvider.HiddenService.DOMAIN))
- );
-
- config.put(
- HSContentProvider.HiddenService.AUTH_COOKIE,
- portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.AUTH_COOKIE))
- );
-
- config.put(
- HSContentProvider.HiddenService.AUTH_COOKIE_VALUE,
- portData.getString(portData.getColumnIndex(HSContentProvider.HiddenService.AUTH_COOKIE_VALUE))
- );
-
- config.put(
- HSContentProvider.HiddenService.CREATED_BY_USER,
- portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.CREATED_BY_USER))
- );
-
- config.put(
- HSContentProvider.HiddenService.ENABLED,
- portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.ENABLED))
- );
+ config.put(HSContentProvider.HiddenService.NAME, portData.getString(portData.getColumnIndex(HSContentProvider.HiddenService.NAME)));
+ config.put(HSContentProvider.HiddenService.PORT, portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.PORT)));
+ config.put(HSContentProvider.HiddenService.ONION_PORT, portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.ONION_PORT)));
+ config.put(HSContentProvider.HiddenService.DOMAIN, portData.getString(portData.getColumnIndex(HSContentProvider.HiddenService.DOMAIN)));
+ config.put(HSContentProvider.HiddenService.AUTH_COOKIE, portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.AUTH_COOKIE)));
+ config.put(HSContentProvider.HiddenService.AUTH_COOKIE_VALUE, portData.getString(portData.getColumnIndex(HSContentProvider.HiddenService.AUTH_COOKIE_VALUE)));
+ config.put(HSContentProvider.HiddenService.CREATED_BY_USER, portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.CREATED_BY_USER)));
+ config.put(HSContentProvider.HiddenService.ENABLED, portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.ENABLED)));
} catch (JSONException e) {
e.printStackTrace();
return null;
@@ -119,42 +95,20 @@ public class BackupUtils {
e.printStackTrace();
return null;
}
-
- String[] files = {hostnameFilePath, keyFilePath, configFilePath};
- ZipIt zip = new ZipIt(files, zipFile, mResolver);
-
- if (!zip.zip())
- return null;
-
- return zipFile.getPath();
+ return new String[]{hostnameFilePath, keyFilePath, configFilePath};
}
- public void restoreZipBackup(Uri zipUri) {
- File mHSBasePath = new File(
- mContext.getFilesDir().getAbsolutePath(),
- TorServiceConstants.HIDDEN_SERVICES_DIR
- );
-
+ private void extractConfigFromUnzippedBackup(String backupName) {
+ File mHSBasePath = getHSBasePath();
int port;
- Cursor service;
-
- Cursor returnCursor = mResolver.query(zipUri, null, null, null, null);
- int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
- returnCursor.moveToFirst();
- String backupName = returnCursor.getString(nameIndex);
- returnCursor.close();
-
String hsDir = backupName.substring(0, backupName.lastIndexOf('.'));
String configFilePath = mHSBasePath + "/" + hsDir + "/" + configFileName;
- String jString = null;
+ String jString;
File hsPath = new File(mHSBasePath.getAbsolutePath(), hsDir);
if (!hsPath.isDirectory())
hsPath.mkdirs();
- ZipIt zip = new ZipIt(null, zipUri, mResolver);
- zip.unzip(hsPath.getAbsolutePath());
-
File config = new File(configFilePath);
FileInputStream stream;
@@ -164,51 +118,21 @@ public class BackupUtils {
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
jString = Charset.defaultCharset().decode(bb).toString();
stream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- if (jString == null)
- Toast.makeText(mContext, R.string.error, Toast.LENGTH_LONG).show();
- try {
JSONObject savedValues = new JSONObject(jString);
ContentValues fields = new ContentValues();
- fields.put(
- HSContentProvider.HiddenService.NAME,
- savedValues.getString(HSContentProvider.HiddenService.NAME)
- );
-
- fields.put(
- HSContentProvider.HiddenService.ONION_PORT,
- savedValues.getInt(HSContentProvider.HiddenService.ONION_PORT)
- );
-
- fields.put(
- HSContentProvider.HiddenService.DOMAIN,
- savedValues.getString(HSContentProvider.HiddenService.DOMAIN)
- );
-
- fields.put(
- HSContentProvider.HiddenService.AUTH_COOKIE,
- savedValues.getInt(HSContentProvider.HiddenService.AUTH_COOKIE)
- );
-
- fields.put(
- HSContentProvider.HiddenService.CREATED_BY_USER,
- savedValues.getInt(HSContentProvider.HiddenService.CREATED_BY_USER)
- );
-
- fields.put(
- HSContentProvider.HiddenService.ENABLED,
- savedValues.getInt(HSContentProvider.HiddenService.ENABLED)
- );
+ fields.put(HSContentProvider.HiddenService.NAME, savedValues.getString(HSContentProvider.HiddenService.NAME));
+ fields.put(HSContentProvider.HiddenService.ONION_PORT, savedValues.getInt(HSContentProvider.HiddenService.ONION_PORT));
+ fields.put(HSContentProvider.HiddenService.DOMAIN, savedValues.getString(HSContentProvider.HiddenService.DOMAIN));
+ fields.put(HSContentProvider.HiddenService.AUTH_COOKIE, savedValues.getInt(HSContentProvider.HiddenService.AUTH_COOKIE));
+ fields.put(HSContentProvider.HiddenService.CREATED_BY_USER, savedValues.getInt(HSContentProvider.HiddenService.CREATED_BY_USER));
+ fields.put(HSContentProvider.HiddenService.ENABLED, savedValues.getInt(HSContentProvider.HiddenService.ENABLED));
port = savedValues.getInt(HSContentProvider.HiddenService.PORT);
fields.put(HSContentProvider.HiddenService.PORT, port);
- service = mResolver.query(
+ Cursor service = mResolver.query(
HSContentProvider.CONTENT_URI,
HSContentProvider.PROJECTION,
HSContentProvider.HiddenService.PORT + "=" + port,
@@ -228,13 +152,42 @@ public class BackupUtils {
service.close();
}
-
- } catch (JSONException e) {
+ Toast.makeText(mContext, R.string.backup_restored, Toast.LENGTH_LONG).show();
+ } catch (IOException | JSONException e) {
e.printStackTrace();
Toast.makeText(mContext, R.string.error, Toast.LENGTH_LONG).show();
}
+ }
+
+ private File getHSBasePath() {
+ return new File(mContext.getFilesDir().getAbsolutePath(), TorServiceConstants.HIDDEN_SERVICES_DIR);
+ }
+
+ public void restoreZipBackupLegacy(File zipFile) {
+ String backupName = zipFile.getName();
+ ZipIt zip = new ZipIt(null, null, mResolver);
+ String hsDir = backupName.substring(0, backupName.lastIndexOf('.'));
+ File hsPath = new File(getHSBasePath().getAbsolutePath(), hsDir);
+ if (zip.unzipLegacy(hsPath.getAbsolutePath(), zipFile))
+ extractConfigFromUnzippedBackup(backupName);
+ else
+ Toast.makeText(mContext, R.string.error, Toast.LENGTH_LONG).show();
+ }
+
+ public void restoreZipBackup(Uri zipUri) {
+ Cursor returnCursor = mResolver.query(zipUri, null, null, null, null);
+ int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
+ returnCursor.moveToFirst();
+ String backupName = returnCursor.getString(nameIndex);
+ returnCursor.close();
+
+ String hsDir = backupName.substring(0, backupName.lastIndexOf('.'));
+ File hsPath = new File(getHSBasePath().getAbsolutePath(), hsDir);
+ if (new ZipIt(null, zipUri, mResolver).unzip(hsPath.getAbsolutePath()))
+ extractConfigFromUnzippedBackup(backupName);
+ else
+ Toast.makeText(mContext, R.string.error, Toast.LENGTH_LONG).show();
- Toast.makeText(mContext, R.string.backup_restored, Toast.LENGTH_LONG).show();
}
public void restoreKeyBackup(int hsPort, Uri hsKeyPath) {
@@ -270,29 +223,16 @@ public class BackupUtils {
JSONObject savedValues = new JSONObject(jString);
ContentValues fields = new ContentValues();
- fields.put(
- CookieContentProvider.ClientCookie.DOMAIN,
- savedValues.getString(CookieContentProvider.ClientCookie.DOMAIN)
- );
-
- fields.put(
- CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE,
- savedValues.getString(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE)
- );
-
- fields.put(
- CookieContentProvider.ClientCookie.ENABLED,
- savedValues.getInt(CookieContentProvider.ClientCookie.ENABLED)
- );
+ fields.put(CookieContentProvider.ClientCookie.DOMAIN, savedValues.getString(CookieContentProvider.ClientCookie.DOMAIN));
+ fields.put(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE, savedValues.getString(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE));
+ fields.put(CookieContentProvider.ClientCookie.ENABLED, savedValues.getInt(CookieContentProvider.ClientCookie.ENABLED));
mResolver.insert(CookieContentProvider.CONTENT_URI, fields);
+ Toast.makeText(mContext, R.string.backup_restored, Toast.LENGTH_LONG).show();
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(mContext, R.string.error, Toast.LENGTH_LONG).show();
}
-
- Toast.makeText(mContext, R.string.backup_restored, Toast.LENGTH_LONG).show();
}
-
}
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/ZipIt.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/ZipIt.java
index b73833c9..5c264b8e 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/ZipIt.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/ZipIt.java
@@ -59,20 +59,43 @@ public class ZipIt {
return true;
}
+ public boolean unzipLegacy(String outputPath, File zipFile) {
+ try {
+ FileInputStream fis = new FileInputStream((zipFile));
+ ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
+ boolean returnVal = extractFromZipInputStream(outputPath, zis);
+ fis.close();
+ return returnVal;
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+
public boolean unzip(String outputPath) {
InputStream is;
- ZipInputStream zis;
-
try {
- String filename;
is = contentResolver.openInputStream(zipFile);
- zis = new ZipInputStream(new BufferedInputStream(is));
+ ZipInputStream zis = new ZipInputStream(new BufferedInputStream(is));
+ boolean returnVal = extractFromZipInputStream(outputPath, zis);
+ is.close();
+ return returnVal;
+ } catch (IOException e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ private boolean extractFromZipInputStream(String outputPath, ZipInputStream zis) {
+ try {
ZipEntry ze;
byte[] buffer = new byte[1024];
int count;
+ new File(outputPath).mkdirs();
+
while ((ze = zis.getNextEntry()) != null) {
- filename = ze.getName();
+ String filename = ze.getName();
// Need to create directories if not exists, or it will generate an Exception...
if (ze.isDirectory()) {
@@ -92,12 +115,12 @@ public class ZipIt {
}
zis.close();
- is.close();
} catch (IOException e) {
e.printStackTrace();
return false;
}
-
return true;
}
+
+
}
\ No newline at end of file
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/AddCookieDialog.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/AddCookieDialog.java
index 6fa99d8d..badb04fc 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/AddCookieDialog.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/AddCookieDialog.java
@@ -4,12 +4,12 @@ package org.torproject.android.ui.hiddenservices.dialogs;
import android.app.Dialog;
import android.content.ContentResolver;
import android.content.ContentValues;
+import android.content.Context;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
import androidx.appcompat.app.AlertDialog;
import android.view.View;
-import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import org.torproject.android.R;
@@ -20,36 +20,26 @@ public class AddCookieDialog extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
-
final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.layout_add_client_cookie_dialog, null);
-
- final AlertDialog addCookieDialog = new AlertDialog.Builder(getActivity())
+ return new AlertDialog.Builder(getActivity())
.setView(dialog_view)
.setTitle(R.string.client_cookies)
+ .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
+ .setPositiveButton(R.string.save, (dialog, which) -> doSave(dialog_view, getContext()))
.create();
+ }
- Button save = dialog_view.findViewById(R.id.cookie_dialog_save);
- save.setOnClickListener(v -> {
- String onion = ((EditText) dialog_view.findViewById(R.id.cookie_onion)).getText().toString();
- String cookie = ((EditText) dialog_view.findViewById(R.id.cookie_value)).getText().toString();
-
- if (checkInput(onion, cookie)) {
- saveData(onion, cookie);
- Toast.makeText(
- v.getContext(), R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG
- ).show();
- addCookieDialog.dismiss();
- }
- });
-
- Button cancel = dialog_view.findViewById(R.id.cookie_dialog_cancel);
- cancel.setOnClickListener(v -> addCookieDialog.cancel());
+ private void doSave(View dialogView, Context context) {
+ String onion = ((EditText) dialogView.findViewById(R.id.cookie_onion)).getText().toString();
+ String cookie = ((EditText) dialogView.findViewById(R.id.cookie_value)).getText().toString();
- return addCookieDialog;
+ if (checkInput(onion, cookie)) {
+ saveData(onion, cookie);
+ Toast.makeText(context, R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG).show();
+ }
}
private boolean checkInput(String onion, String cookie) {
-
boolean is_set = ((onion != null && onion.length() > 0) && (cookie != null && cookie.length() > 0));
if (!is_set) {
Toast.makeText(getContext(), R.string.fields_can_t_be_empty, Toast.LENGTH_SHORT).show();
@@ -65,7 +55,6 @@ public class AddCookieDialog extends DialogFragment {
}
private void saveData(String domain, String cookie) {
-
ContentValues fields = new ContentValues();
fields.put(CookieContentProvider.ClientCookie.DOMAIN, domain);
fields.put(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE, cookie);
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/CookieActionsDialog.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/CookieActionsDialog.java
index 8e0ad321..fb1d1212 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/CookieActionsDialog.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/CookieActionsDialog.java
@@ -6,7 +6,6 @@ import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
-import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
@@ -19,13 +18,13 @@ import org.torproject.android.R;
import org.torproject.android.core.DiskUtils;
import org.torproject.android.ui.hiddenservices.providers.CookieContentProvider;
+import java.io.File;
import java.io.FileOutputStream;
+import java.io.FileWriter;
import java.io.IOException;
public class CookieActionsDialog extends DialogFragment {
- public static final int WRITE_EXTERNAL_STORAGE_FROM_COOKIE_ACTION_DIALOG = 4;
private static final int REQUEST_CODE_WRITE_FILE = 123;
- private AlertDialog actionDialog;
private String domain;
private String cookie;
private int enabled;
@@ -38,27 +37,50 @@ public class CookieActionsDialog extends DialogFragment {
cookie = arguments.getString("auth_cookie_value");
enabled = arguments.getInt("enabled");
- final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.layout_cookie_actions, null);
- actionDialog = new AlertDialog.Builder(getActivity())
- .setView(dialog_view)
+ return new AlertDialog.Builder(getActivity())
.setTitle(R.string.client_cookies)
+ .setItems(new CharSequence[]{
+ getString(R.string.backup_cookie),
+ getString(R.string.delete_cookie)
+ }, (dialog, which) -> {
+ if (which == 0) doBackup();
+ else doDelete(arguments);
+ })
+ .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
.create();
+ }
- dialog_view.findViewById(R.id.btn_cookie_cancel).setOnClickListener(v -> actionDialog.dismiss());
- dialog_view.findViewById(R.id.btn_cookie_backup).setOnClickListener(v -> doBackup());
- dialog_view.findViewById(R.id.btn_cookie_delete).setOnClickListener(v -> {
- CookieDeleteDialog dialog = new CookieDeleteDialog();
- dialog.setArguments(arguments);
- dialog.show(getFragmentManager(), "CookieDeleteDialog");
- actionDialog.dismiss();
- });
+ private void doDelete(Bundle arguments) {
+ CookieDeleteDialog dialog = new CookieDeleteDialog();
+ dialog.setArguments(arguments);
+ dialog.show(getFragmentManager(), "CookieDeleteDialog");
+ }
- return actionDialog;
+ private void doBackup() {
+ String filename = domain.replace(".onion", ".json");
+ if (DiskUtils.supportsStorageAccessFramework()) {
+ Intent createFile = DiskUtils.createWriteFileIntent(filename, "application/json");
+ startActivityForResult(createFile, REQUEST_CODE_WRITE_FILE);
+ } else { // API 16, 17, and 18
+ try {
+ File externalStorage = DiskUtils.getOrCreateLegacyBackupDir();
+ String backupFile = externalStorage.getAbsolutePath() + "/" + filename;
+ String data = createBackupData();
+ FileWriter writer = new FileWriter(backupFile);
+ writer.write(data);
+ writer.close();
+ } catch (JSONException | IOException e) {
+ Toast.makeText(getContext(), R.string.error, Toast.LENGTH_LONG).show();
+ }
+ }
}
- public void doBackup() {
- Intent createFile = DiskUtils.createWriteFileIntent(domain.replace(".onion", ".json"), "application/json");
- startActivityForResult(createFile, REQUEST_CODE_WRITE_FILE);
+ private String createBackupData() throws JSONException {
+ JSONObject backup = new JSONObject();
+ backup.put(CookieContentProvider.ClientCookie.DOMAIN, domain);
+ backup.put(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE, cookie);
+ backup.put(CookieContentProvider.ClientCookie.ENABLED, enabled);
+ return backup.toString();
}
@Override
@@ -69,11 +91,7 @@ public class CookieActionsDialog extends DialogFragment {
try {
ParcelFileDescriptor pfd = getActivity().getContentResolver().openFileDescriptor(file, "w");
FileOutputStream fileOutputStream = new FileOutputStream(pfd.getFileDescriptor());
- JSONObject backup = new JSONObject();
- backup.put(CookieContentProvider.ClientCookie.DOMAIN, domain);
- backup.put(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE, cookie);
- backup.put(CookieContentProvider.ClientCookie.ENABLED, enabled);
- fileOutputStream.write(backup.toString().getBytes());
+ fileOutputStream.write(createBackupData().getBytes());
// Let the document provider know you're done by closing the stream.
fileOutputStream.close();
pfd.close();
@@ -83,7 +101,6 @@ public class CookieActionsDialog extends DialogFragment {
return;
}
Toast.makeText(getContext(), R.string.backup_saved_at_external_storage, Toast.LENGTH_LONG).show();
- actionDialog.dismiss();
}
}
}
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/CookieDeleteDialog.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/CookieDeleteDialog.java
index c2fade86..d5f094c6 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/CookieDeleteDialog.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/CookieDeleteDialog.java
@@ -2,11 +2,12 @@ package org.torproject.android.ui.hiddenservices.dialogs;
import android.app.Dialog;
import android.content.Context;
-import android.content.DialogInterface;
import android.os.Bundle;
+
import androidx.annotation.NonNull;
-import androidx.fragment.app.DialogFragment;
import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.DialogFragment;
+
import org.torproject.android.R;
import org.torproject.android.ui.hiddenservices.providers.CookieContentProvider;
@@ -18,28 +19,18 @@ public class CookieDeleteDialog extends DialogFragment {
final Bundle arguments = getArguments();
final Context context = getContext();
- DialogInterface.OnClickListener dialogClickListener = (dialog, which) -> {
- switch (which) {
- case DialogInterface.BUTTON_POSITIVE:
- // Delete from db
- context.getContentResolver().delete(
- CookieContentProvider.CONTENT_URI,
- CookieContentProvider.ClientCookie._ID + "=" + arguments.getInt("_id"),
- null
- );
-
- break;
-
- case DialogInterface.BUTTON_NEGATIVE:
- // Do nothing
- break;
- }
- };
-
return new AlertDialog.Builder(context)
- .setMessage(R.string.confirm_cookie_deletion)
- .setPositiveButton(android.R.string.ok, dialogClickListener)
- .setNegativeButton(android.R.string.cancel, dialogClickListener)
+ .setTitle(R.string.confirm_cookie_deletion)
+ .setPositiveButton(android.R.string.ok, (dialog, which) -> doDelete(arguments, context))
+ .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.cancel())
.create();
}
+
+ private void doDelete(Bundle arguments, Context context) {
+ context.getContentResolver().delete( // delete from db
+ CookieContentProvider.CONTENT_URI,
+ CookieContentProvider.ClientCookie._ID + "=" + arguments.getInt("_id"),
+ null
+ );
+ }
}
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSActionsDialog.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSActionsDialog.java
index 5fbe0571..688b5efc 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSActionsDialog.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSActionsDialog.java
@@ -2,28 +2,25 @@ package org.torproject.android.ui.hiddenservices.dialogs;
import android.app.Activity;
import android.app.Dialog;
-import android.content.ClipData;
-import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
+import android.widget.Toast;
import androidx.annotation.NonNull;
-import androidx.fragment.app.DialogFragment;
import androidx.appcompat.app.AlertDialog;
-
-import android.view.View;
-import android.widget.Toast;
+import androidx.fragment.app.DialogFragment;
import org.torproject.android.R;
+import org.torproject.android.core.ClipboardUtils;
import org.torproject.android.core.DiskUtils;
import org.torproject.android.ui.hiddenservices.backup.BackupUtils;
-import org.torproject.android.ui.hiddenservices.permissions.PermissionManager;
+
+import java.io.File;
public class HSActionsDialog extends DialogFragment {
- public static final int WRITE_EXTERNAL_STORAGE_FROM_ACTION_DIALOG = 2;
- private AlertDialog actionDialog;
+ private static final int REQUEST_CODE_WRITE_FILE = 123;
private int port;
@NonNull
@@ -31,87 +28,85 @@ public class HSActionsDialog extends DialogFragment {
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Bundle arguments = getArguments();
port = Integer.parseInt(arguments.getString("port"));
- final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.layout_hs_actions, null);
- actionDialog = new AlertDialog.Builder(getActivity())
- .setView(dialog_view)
+ return new AlertDialog.Builder(getActivity())
+ .setItems(new CharSequence[]{
+ getString(R.string.copy_address_to_clipboard),
+ getString(R.string.show_auth_cookie),
+ getString(R.string.backup_service),
+ getString(R.string.delete_service)},
+ (dialog, which) -> {
+ if (which == 0) doCopy(arguments, getContext());
+ else if (which == 1) doShowAuthCookie(arguments, getContext());
+ else if (which == 2) doBackup(arguments, getContext());
+ else if (which == 3) doDelete(arguments);
+ })
+ .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
.setTitle(R.string.hidden_services)
.create();
+ }
- dialog_view.findViewById(R.id.btn_hs_backup).setOnClickListener(v -> doBackup());
-
- dialog_view.findViewById(R.id.btn_hs_clipboard).setOnClickListener(v -> {
- Context mContext = v.getContext();
- ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
- ClipData clip = ClipData.newPlainText("onion", arguments.getString("onion"));
- clipboard.setPrimaryClip(clip);
- Toast.makeText(mContext, R.string.done, Toast.LENGTH_LONG).show();
- actionDialog.dismiss();
- });
+ private void doDelete(Bundle arguments) {
+ HSDeleteDialog dialog = new HSDeleteDialog();
+ dialog.setArguments(arguments);
+ dialog.show(getFragmentManager(), "HSDeleteDialog");
+ }
- dialog_view.findViewById(R.id.bt_hs_show_auth).setOnClickListener(v -> {
- String auth_cookie_value = arguments.getString("auth_cookie_value");
+ private void doShowAuthCookie(Bundle arguments, Context context) {
+ String auth_cookie_value = arguments.getString("auth_cookie_value");
- if (arguments.getInt("auth_cookie") == 1) {
- if (auth_cookie_value == null || auth_cookie_value.length() < 1) {
- Toast.makeText(
- v.getContext(), R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG
- ).show();
- } else {
- HSCookieDialog dialog = new HSCookieDialog();
- dialog.setArguments(arguments);
- dialog.show(getFragmentManager(), "HSCookieDialog");
- }
+ if (arguments.getInt("auth_cookie") == 1) {
+ if (auth_cookie_value == null || auth_cookie_value.length() < 1) {
+ Toast.makeText(context, R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG).show();
} else {
- Toast.makeText(
- v.getContext(), R.string.auth_cookie_was_not_configured, Toast.LENGTH_LONG
- ).show();
+ HSCookieDialog dialog = new HSCookieDialog();
+ dialog.setArguments(arguments);
+ dialog.show(getFragmentManager(), "HSCookieDialog");
}
-
- actionDialog.dismiss();
- });
-
- dialog_view.findViewById(R.id.btn_hs_delete).setOnClickListener(v -> {
- HSDeleteDialog dialog = new HSDeleteDialog();
- dialog.setArguments(arguments);
- dialog.show(getFragmentManager(), "HSDeleteDialog");
- actionDialog.dismiss();
- });
-
- dialog_view.findViewById(R.id.btn_hs_cancel).setOnClickListener(v -> actionDialog.dismiss());
-
- return actionDialog;
+ } else {
+ Toast.makeText(context, R.string.auth_cookie_was_not_configured, Toast.LENGTH_LONG).show();
+ }
}
- public void doBackup() {
- Intent createFile = DiskUtils.createWriteFileIntent("hs" + port + ".zip", "application/zip");
- startActivityForResult(createFile, REQUEST_CODE_WRITE_FILE);
+ private void doCopy(Bundle arguments, Context context) {
+ String onion = arguments.getString("onion");
+ if (onion == null)
+ Toast.makeText(context, R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG).show();
+ else
+ ClipboardUtils.copyToClipboard("onion", arguments.getString("onion"), getString(R.string.done), context);
}
- public void doBackup1() {
- if (PermissionManager.isLollipopOrHigher()
- && !PermissionManager.hasExternalWritePermission(getActivity())) {
-
- PermissionManager.requestExternalWritePermissions(
- getActivity(), WRITE_EXTERNAL_STORAGE_FROM_ACTION_DIALOG);
+ private void doBackup(Bundle arguments, Context context) {
+ String filename = "hs" + port + ".zip";
+ String onion = arguments.getString("onion");
+ if (onion == null) {
+ Toast.makeText(context, R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG).show();
+ return;
+ }
+ if (DiskUtils.supportsStorageAccessFramework()) {
+ Intent createFile = DiskUtils.createWriteFileIntent(filename, "application/zip");
+ startActivityForResult(createFile, REQUEST_CODE_WRITE_FILE);
+ } else { // API 16, 17, 18
+ attemptToWriteBackup(Uri.fromFile(new File(DiskUtils.getOrCreateLegacyBackupDir(), filename)));
}
}
- private static final int REQUEST_CODE_WRITE_FILE = 123;
-
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_WRITE_FILE && resultCode == Activity.RESULT_OK) {
if (data != null) {
- Uri file = data.getData();
- BackupUtils backupUtils = new BackupUtils(getContext());
- String backup = backupUtils.createZipBackup(port, file);
- if (backup != null) {
- Toast.makeText(getContext(), R.string.backup_saved_at_external_storage, Toast.LENGTH_LONG).show();
- } else{
- Toast.makeText(getContext(), R.string.error, Toast.LENGTH_LONG).show();
- }
- actionDialog.dismiss();
+ attemptToWriteBackup(data.getData());
}
}
}
+
+ private void attemptToWriteBackup(Uri outputFile) {
+ BackupUtils backupUtils = new BackupUtils(getContext());
+ String backup = backupUtils.createZipBackup(port, outputFile);
+ if (backup != null) {
+ Toast.makeText(getContext(), R.string.backup_saved_at_external_storage, Toast.LENGTH_LONG).show();
+ } else {
+ Toast.makeText(getContext(), R.string.error, Toast.LENGTH_LONG).show();
+ }
+ }
+
}
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSCookieDialog.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSCookieDialog.java
index ce71a96f..2875fbc4 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSCookieDialog.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSCookieDialog.java
@@ -1,71 +1,58 @@
package org.torproject.android.ui.hiddenservices.dialogs;
import android.app.Dialog;
-import android.content.ClipData;
-import android.content.ClipboardManager;
-import android.content.Context;
import android.os.Bundle;
+
import androidx.annotation.NonNull;
-import androidx.fragment.app.DialogFragment;
import androidx.appcompat.app.AlertDialog;
-import android.view.View;
-import android.widget.Button;
-import android.widget.TextView;
-import android.widget.Toast;
+import androidx.fragment.app.DialogFragment;
+
import com.google.zxing.integration.android.IntentIntegrator;
+
import org.json.JSONException;
import org.json.JSONObject;
import org.torproject.android.R;
+import org.torproject.android.core.ClipboardUtils;
import org.torproject.android.ui.hiddenservices.providers.CookieContentProvider;
public class HSCookieDialog extends DialogFragment {
+ private String authCookieValue, onion;
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
- final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.layout_hs_cookie, null);
-
final Bundle arguments = getArguments();
- final String auth_cookie_value = arguments.getString("auth_cookie_value");
-
- final AlertDialog cookieDialog = new AlertDialog.Builder(getActivity())
- .setView(dialog_view)
+ authCookieValue = arguments.getString("auth_cookie_value");
+ onion = arguments.getString("onion");
+ return new AlertDialog.Builder(getActivity())
+ .setTitle(authCookieValue)
+ .setItems(new CharSequence[]{
+ getString(R.string.copy_cookie_to_clipboard),
+ getString(R.string.share_as_qr)
+ }, (dialog, which) -> {
+ if (which == 0) doCopy();
+ else if (which == 1) doShareQr();
+ })
+ .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
.create();
+ }
- TextView cookie = dialog_view.findViewById(R.id.hs_cookie);
- cookie.setText(auth_cookie_value);
-
- Button clipboard = dialog_view.findViewById(R.id.hs_cookie_to_clipboard);
- clipboard.setOnClickListener(v -> {
- Context mContext = v.getContext();
- ClipboardManager clipboard1 = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
- ClipData clip = ClipData.newPlainText("cookie", auth_cookie_value);
- clipboard1.setPrimaryClip(clip);
- Toast.makeText(mContext, R.string.done, Toast.LENGTH_LONG).show();
- cookieDialog.dismiss();
- });
-
- Button shareQR = dialog_view.findViewById(R.id.hs_cookie_to_qr);
- shareQR.setOnClickListener(v -> {
- try {
- JSONObject backup = new JSONObject();
- backup.put(CookieContentProvider.ClientCookie.DOMAIN, arguments.getString("onion"));
- backup.put(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE, arguments.getString("auth_cookie_value"));
-
- IntentIntegrator integrator = new IntentIntegrator(getActivity());
- integrator.shareText(backup.toString());
-
- } catch (JSONException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
+ private void doShareQr() {
+ try {
+ JSONObject backup = new JSONObject();
+ backup.put(CookieContentProvider.ClientCookie.DOMAIN, onion);
+ backup.put(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE, authCookieValue);
- cookieDialog.dismiss();
- });
+ new IntentIntegrator(getActivity()).shareText(backup.toString());
- Button cancel = dialog_view.findViewById(R.id.hs_cookie_cancel);
- cancel.setOnClickListener(v -> cookieDialog.dismiss());
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
- return cookieDialog;
+ private void doCopy() {
+ if (authCookieValue != null)
+ ClipboardUtils.copyToClipboard("cookie", authCookieValue, getString(R.string.done), getContext());
}
+
}
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSDataDialog.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSDataDialog.java
index 28c1d716..7d381921 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSDataDialog.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSDataDialog.java
@@ -1,21 +1,19 @@
package org.torproject.android.ui.hiddenservices.dialogs;
-
import android.app.Dialog;
import android.content.ContentResolver;
import android.content.ContentValues;
+import android.content.Context;
import android.os.Bundle;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.DialogFragment;
-import androidx.appcompat.app.AlertDialog;
-
import android.view.View;
-import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.DialogFragment;
+
import org.torproject.android.R;
import org.torproject.android.ui.hiddenservices.providers.HSContentProvider;
@@ -24,42 +22,31 @@ public class HSDataDialog extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
- // Get the layout
final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.layout_hs_data_dialog, null);
-
- // Use the Builder class for convenient dialog construction
- final AlertDialog serviceDataDialog = new AlertDialog.Builder(getActivity())
- .setView(dialog_view)
+ return new AlertDialog.Builder(getActivity())
.setTitle(R.string.hidden_services)
+ .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.cancel())
+ .setPositiveButton(R.string.save, (dialog, which) -> doSave(dialog_view, getContext()))
+ .setView(dialog_view)
.create();
+ }
- // Buttons action
- Button save = dialog_view.findViewById(R.id.HSDialogSave);
- save.setOnClickListener(v -> {
- String serverName = ((EditText) dialog_view.findViewById(R.id.hsName)).getText().toString();
- int localPort, onionPort;
- try {
- localPort = Integer.parseInt(((EditText) dialog_view.findViewById(R.id.hsLocalPort)).getText().toString());
- onionPort = Integer.parseInt(((EditText) dialog_view.findViewById(R.id.hsOnionPort)).getText().toString());
- } catch (NumberFormatException nfe) {
- Toast.makeText(v.getContext(), R.string.fields_can_t_be_empty, Toast.LENGTH_LONG).show();
- return;
- }
- boolean authCookie = ((CheckBox) dialog_view.findViewById(R.id.hsAuth)).isChecked();
-
- if (checkInput(serverName, localPort, onionPort)) {
- saveData(serverName, localPort, onionPort, authCookie);
- Toast.makeText(
- v.getContext(), R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG
- ).show();
- serviceDataDialog.dismiss();
- }
- });
-
- Button cancel = dialog_view.findViewById(R.id.HSDialogCancel);
- cancel.setOnClickListener(v -> serviceDataDialog.cancel());
+ private void doSave(View dialogView, Context context) {
+ String serverName = ((EditText) dialogView.findViewById(R.id.hsName)).getText().toString();
+ int localPort, onionPort;
+ try {
+ localPort = Integer.parseInt(((EditText) dialogView.findViewById(R.id.hsLocalPort)).getText().toString());
+ onionPort = Integer.parseInt(((EditText) dialogView.findViewById(R.id.hsOnionPort)).getText().toString());
+ } catch (NumberFormatException nfe) {
+ Toast.makeText(context, R.string.fields_can_t_be_empty, Toast.LENGTH_LONG).show();
+ return;
+ }
+ boolean authCookie = ((CheckBox) dialogView.findViewById(R.id.hsAuth)).isChecked();
- return serviceDataDialog;
+ if (checkInput(serverName, localPort, onionPort)) {
+ saveData(serverName, localPort, onionPort, authCookie);
+ Toast.makeText(context, R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG).show();
+ }
}
private boolean checkInput(String serverName, int local, int remote) {
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSDeleteDialog.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSDeleteDialog.java
index 2d817783..eb921d38 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSDeleteDialog.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSDeleteDialog.java
@@ -1,13 +1,13 @@
package org.torproject.android.ui.hiddenservices.dialogs;
-
import android.app.Dialog;
import android.content.Context;
-import android.content.DialogInterface;
import android.os.Bundle;
+
import androidx.annotation.NonNull;
-import androidx.fragment.app.DialogFragment;
import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.DialogFragment;
+
import org.torproject.android.R;
import org.torproject.android.service.TorServiceConstants;
import org.torproject.android.ui.hiddenservices.providers.HSContentProvider;
@@ -21,40 +21,30 @@ public class HSDeleteDialog extends DialogFragment {
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Bundle arguments = getArguments();
final Context context = getContext();
-
- DialogInterface.OnClickListener dialogClickListener = (dialog, which) -> {
- switch (which) {
- case DialogInterface.BUTTON_POSITIVE:
- // Delete from db
- context.getContentResolver().delete(
- HSContentProvider.CONTENT_URI,
- HSContentProvider.HiddenService._ID + "=" + arguments.getInt("_id"),
- null);
-
- // Delete from internal storage
- String base = context.getFilesDir().getAbsolutePath() + "/" + TorServiceConstants.HIDDEN_SERVICES_DIR;
- File dir = new File(base, "hs" + arguments.getString("port"));
-
- if (dir.isDirectory()) {
- String[] children = dir.list();
- for (String aChildren : children) {
- new File(dir, aChildren).delete();
- }
- dir.delete();
- }
-
- break;
-
- case DialogInterface.BUTTON_NEGATIVE:
- // Do nothing
- break;
- }
- };
-
return new AlertDialog.Builder(context)
- .setMessage(R.string.confirm_service_deletion)
- .setPositiveButton(android.R.string.ok, dialogClickListener)
- .setNegativeButton(android.R.string.cancel, dialogClickListener)
+ .setTitle(R.string.confirm_service_deletion)
+ .setPositiveButton(android.R.string.ok, (dialog, which) -> doDelete(arguments, context))
+ .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.cancel())
.create();
}
+
+ private void doDelete(Bundle arguments, Context context) {
+ context.getContentResolver().delete( // Delete from db
+ HSContentProvider.CONTENT_URI,
+ HSContentProvider.HiddenService._ID + "=" + arguments.getInt("_id"),
+ null);
+
+ // Delete from internal storage
+ String base = context.getFilesDir().getAbsolutePath() + "/" + TorServiceConstants.HIDDEN_SERVICES_DIR;
+ File dir = new File(base, "hs" + arguments.getString("port"));
+
+ if (dir.isDirectory()) {
+ String[] children = dir.list();
+ for (String aChildren : children) {
+ new File(dir, aChildren).delete();
+ }
+ dir.delete();
+ }
+ }
+
}
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/permissions/PermissionManager.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/permissions/PermissionManager.java
index af23919f..6d181967 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/permissions/PermissionManager.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/permissions/PermissionManager.java
@@ -1,20 +1,17 @@
package org.torproject.android.ui.hiddenservices.permissions;
-
-import android.Manifest;
-import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.PowerManager;
import android.provider.Settings;
-import com.google.android.material.snackbar.Snackbar;
-import androidx.core.app.ActivityCompat;
+
import androidx.fragment.app.FragmentActivity;
+import com.google.android.material.snackbar.Snackbar;
+
import org.torproject.android.R;
public class PermissionManager {
@@ -24,32 +21,8 @@ public class PermissionManager {
return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP);
}
- @SuppressLint("NewApi")
- public static boolean hasExternalWritePermission(Context context) {
- return (context.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
- }
-
- public static void requestExternalWritePermissions(FragmentActivity activity, int action) {
- final int mAction = action;
- final FragmentActivity mActivity = activity;
-
- if (ActivityCompat.shouldShowRequestPermissionRationale
- (mActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
- Snackbar.make(mActivity.findViewById(android.R.id.content),
- R.string.please_grant_permissions_for_external_storage,
- Snackbar.LENGTH_INDEFINITE).setAction(R.string.activate,
- v -> ActivityCompat.requestPermissions(mActivity,
- new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
- mAction)).show();
- } else {
- ActivityCompat.requestPermissions(mActivity,
- new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
- mAction);
- }
- }
-
@TargetApi(Build.VERSION_CODES.M)
- public static void requestBatteryPermmssions(FragmentActivity activity, Context context) {
+ public static void requestBatteryPermissions(FragmentActivity activity, Context context) {
final Context mContext = context;
final String packageName = mContext.getPackageName();
PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
@@ -69,7 +42,7 @@ public class PermissionManager {
}
@TargetApi(Build.VERSION_CODES.M)
- public static void requestDropBatteryPermmssions(FragmentActivity activity, Context context) {
+ public static void requestDropBatteryPermissions(FragmentActivity activity, Context context) {
final Context mContext = context;
final String packageName = context.getPackageName();
diff --git a/app/src/main/java/org/torproject/android/ui/onboarding/CustomBridgesActivity.java b/app/src/main/java/org/torproject/android/ui/onboarding/CustomBridgesActivity.java
index 6d8ec842..f34a49cc 100644
--- a/app/src/main/java/org/torproject/android/ui/onboarding/CustomBridgesActivity.java
+++ b/app/src/main/java/org/torproject/android/ui/onboarding/CustomBridgesActivity.java
@@ -3,8 +3,6 @@
package org.torproject.android.ui.onboarding;
import android.annotation.SuppressLint;
-import android.content.ClipData;
-import android.content.ClipboardManager;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
@@ -18,7 +16,6 @@ import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
-import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -31,6 +28,7 @@ import com.google.zxing.integration.android.IntentResult;
import org.json.JSONArray;
import org.torproject.android.R;
+import org.torproject.android.core.ClipboardUtils;
import org.torproject.android.service.OrbotService;
import org.torproject.android.service.TorServiceConstants;
import org.torproject.android.service.util.Prefs;
@@ -115,19 +113,11 @@ public class CustomBridgesActivity extends AppCompatActivity implements View.OnC
switch (view.getId()) {
case R.id.btCopyUrl:
- ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
-
- if (clipboard != null) {
- clipboard.setPrimaryClip(ClipData.newPlainText(URL_TOR_BRIDGES, URL_TOR_BRIDGES));
-
- Toast.makeText(this, R.string.done, Toast.LENGTH_LONG).show();
- }
-
+ ClipboardUtils.copyToClipboard("bridge_url", URL_TOR_BRIDGES, getString(R.string.done), this);
break;
case R.id.btScanQr:
integrator.initiateScan();
-
break;
case R.id.btShareQr:
diff --git a/app/src/main/res/layout/layout_activity_client_cookies.xml b/app/src/main/res/layout/layout_activity_client_cookies.xml
index 9314255d..a0e66741 100644
--- a/app/src/main/res/layout/layout_activity_client_cookies.xml
+++ b/app/src/main/res/layout/layout_activity_client_cookies.xml
@@ -29,7 +29,8 @@
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
- app:srcCompat="@android:drawable/stat_notify_more"
- app:backgroundTint="@android:color/darker_gray" />
+ android:tint="@android:color/black"
+ app:backgroundTint="@android:color/darker_gray"
+ app:srcCompat="@android:drawable/ic_input_add" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/app/src/main/res/layout/layout_add_client_cookie_dialog.xml b/app/src/main/res/layout/layout_add_client_cookie_dialog.xml
index 9dc4950b..ec310a0c 100644
--- a/app/src/main/res/layout/layout_add_client_cookie_dialog.xml
+++ b/app/src/main/res/layout/layout_add_client_cookie_dialog.xml
@@ -3,15 +3,11 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:paddingLeft="5dp"
- android:paddingTop="5dp"
- android:paddingRight="5dp"
- android:paddingBottom="5dp">
+ android:padding="?dialogPreferredPadding">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingLeft="5dp"
android:text="@string/onion"
android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small" />
@@ -25,7 +21,6 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingLeft="5dp"
android:text="@string/auth_cookie"
android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small" />
@@ -35,28 +30,4 @@
android:layout_height="wrap_content"
android:ems="10"
android:inputType="text" />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal">
-
- <Button
- android:id="@+id/cookie_dialog_cancel"
- style="@style/Widget.AppCompat.Button.Borderless.Colored"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="@android:string/cancel" />
-
- <Button
- android:id="@+id/cookie_dialog_save"
- style="@style/Widget.AppCompat.Button.Borderless.Colored"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="@string/save" />
-
- </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
diff --git a/app/src/main/res/layout/layout_client_cookie_list_item.xml b/app/src/main/res/layout/layout_client_cookie_list_item.xml
index 213ba6cb..90b86464 100644
--- a/app/src/main/res/layout/layout_client_cookie_list_item.xml
+++ b/app/src/main/res/layout/layout_client_cookie_list_item.xml
@@ -7,7 +7,7 @@
<TextView
android:id="@+id/cookie_onion"
- android:layout_width="match_parent"
+ android:layout_width="0dp"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_weight="1" />
diff --git a/app/src/main/res/layout/layout_cookie_actions.xml b/app/src/main/res/layout/layout_cookie_actions.xml
deleted file mode 100644
index 86928029..00000000
--- a/app/src/main/res/layout/layout_cookie_actions.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:paddingLeft="20dp"
- android:paddingRight="20dp">
-
- <Button
- android:id="@+id/btn_cookie_backup"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/backup_cookie" />
-
- <Button
- android:id="@+id/btn_cookie_delete"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/delete_cookie" />
-
- <Button
- android:id="@+id/btn_cookie_cancel"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@android:string/cancel" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_hs_actions.xml b/app/src/main/res/layout/layout_hs_actions.xml
deleted file mode 100644
index e3cecbec..00000000
--- a/app/src/main/res/layout/layout_hs_actions.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <Button
- android:text="@string/copy_address_to_clipboard"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/btn_hs_clipboard" />
-
- <Button
- android:text="@string/show_auth_cookie"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/bt_hs_show_auth" />
-
- <Button
- android:text="@string/backup_service"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/btn_hs_backup" />
-
- <Button
- android:text="@string/delete_service"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/btn_hs_delete" />
-
- <Button
- android:text="@android:string/cancel"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/btn_hs_cancel" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_hs_cookie.xml b/app/src/main/res/layout/layout_hs_cookie.xml
deleted file mode 100644
index abb7d33f..00000000
--- a/app/src/main/res/layout/layout_hs_cookie.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/hs_cookie"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="5dp"
- android:paddingTop="5dp"
- android:paddingBottom="5dp" />
-
- <Button
- android:id="@+id/hs_cookie_to_clipboard"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/copy_cookie_to_clipboard" />
-
- <Button
- android:id="@+id/hs_cookie_to_qr"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/share_as_qr" />
-
- <Button
- android:id="@+id/hs_cookie_cancel"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@android:string/cancel" />
-</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_hs_data_dialog.xml b/app/src/main/res/layout/layout_hs_data_dialog.xml
index df18718f..0d86fbb7 100644
--- a/app/src/main/res/layout/layout_hs_data_dialog.xml
+++ b/app/src/main/res/layout/layout_hs_data_dialog.xml
@@ -3,15 +3,11 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:paddingLeft="5dp"
- android:paddingTop="5dp"
- android:paddingRight="5dp"
- android:paddingBottom="5dp">
+ android:padding="?dialogPreferredPadding">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingLeft="5dp"
android:text="@string/name"
android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small" />
@@ -25,7 +21,6 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingLeft="5dp"
android:text="@string/local_port"
android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small" />
@@ -39,7 +34,6 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingLeft="5dp"
android:text="@string/onion_port"
android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small" />
@@ -54,31 +48,7 @@
android:id="@+id/hsAuth"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingTop="5dp"
- android:paddingBottom="10dp"
- android:text="@string/auth_cookie" />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal">
-
- <Button
- android:id="@+id/HSDialogCancel"
- style="@style/Widget.AppCompat.Button.Borderless.Colored"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="@android:string/cancel" />
-
- <Button
- android:id="@+id/HSDialogSave"
- style="@style/Widget.AppCompat.Button.Borderless.Colored"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="@string/save" />
-
- </LinearLayout>
+ android:text="@string/auth_cookie"
+ android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small" />
</LinearLayout>
diff --git a/app/src/main/res/layout/layout_hs_list_item.xml b/app/src/main/res/layout/layout_hs_list_item.xml
index 8f603bd9..54a95912 100644
--- a/app/src/main/res/layout/layout_hs_list_item.xml
+++ b/app/src/main/res/layout/layout_hs_list_item.xml
@@ -1,59 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingLeft="15dp"
+ android:paddingRight="15dp">
+
+ <TextView
+ android:id="@+id/hs_port"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:paddingTop="10dp"
+ android:paddingRight="10dp"
+ android:textSize="35sp" />
<LinearLayout
- android:layout_width="match_parent"
+ android:layout_width="0dp"
android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:paddingLeft="15dp"
- android:paddingRight="15dp"
- tools:paddingLeft="15dp"
- tools:paddingRight="15dp">
+ android:layout_weight="1"
+ android:orientation="vertical">
<TextView
- android:id="@+id/hs_port"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:paddingTop="10dp"
- android:paddingRight="10dp"
- android:textSize="35sp" />
-
- <LinearLayout
+ android:id="@+id/hs_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_weight="1"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/hs_name"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="10dp"
- android:paddingBottom="10dp"
- android:textSize="24sp" />
-
- <TextView
- android:id="@+id/hs_onion"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="10dp"
- android:paddingBottom="10dp"
- android:textSize="18sp" />
-
- </LinearLayout>
+ android:paddingLeft="10dp"
+ android:paddingBottom="10dp"
+ android:textSize="24sp" />
- <androidx.appcompat.widget.SwitchCompat
- android:id="@+id/hs_switch"
- android:layout_width="wrap_content"
+ <TextView
+ android:id="@+id/hs_onion"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:focusable="false"
- android:focusableInTouchMode="false"
- android:switchPadding="30dp" />
+ android:paddingLeft="10dp"
+ android:paddingBottom="10dp"
+ android:textSize="18sp" />
</LinearLayout>
-</LinearLayout>
\ No newline at end of file
+ <androidx.appcompat.widget.SwitchCompat
+ android:id="@+id/hs_switch"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:focusable="false"
+ android:focusableInTouchMode="false"
+ android:switchPadding="30dp" />
+
+</LinearLayout>
diff --git a/app/src/main/res/layout/layout_hs_list_view.xml b/app/src/main/res/layout/layout_hs_list_view.xml
index e4171949..5e39ba2a 100644
--- a/app/src/main/res/layout/layout_hs_list_view.xml
+++ b/app/src/main/res/layout/layout_hs_list_view.xml
@@ -27,7 +27,8 @@
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
- app:srcCompat="@android:drawable/stat_notify_more"
- app:backgroundTint="@android:color/darker_gray" />
+ android:tint="@android:color/black"
+ app:backgroundTint="@android:color/darker_gray"
+ app:srcCompat="@android:drawable/ic_input_add" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 1564d1f4..ab6cb4ff 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -123,7 +123,6 @@
<string name="restart_orbot_to_use_this_bridge_">اÙرجاء إعادة تشغÙ٠أÙربÙت ÙتÙعÙ٠اÙتعدÙÙات</string>
<string name="menu_qr">رÙ
ز ÙÙ٠آر</string>
<string name="get_bridges_email">اÙبرÙد اÙØ¥ÙÙترÙÙÙ</string>
- <string name="activate">تÙعÙÙ</string>
<string name="apps_mode">Ùضع اÙÙ VPN</string>
<string name="send_email">أرس٠برÙد اÙÙترÙÙÙ</string>
<string name="vpn_default_world">شاÙ
Ù (تÙÙائÙ)</string>
@@ -143,7 +142,8 @@
<string name="backup_saved_at_external_storage">تÙ
ت عÙ
ÙÙØ© ØÙظ اÙÙسخة اÙØ¥ØتÙاطÙØ© Ù٠ذاÙرة اÙتخزÙ٠اÙخارجÙØ©</string>
<string name="backup_restored">تÙ
ت استعادة اÙÙسخة اÙØ¥ØتÙاطÙØ©</string>
<string name="restore_backup">إسترجاع Ùسخة اØتÙاطÙØ©</string>
- <string name="name_can_t_be_empty">Ùا ÙÙ
Ù٠تر٠اÙإسÙ
Ùارغا</string>
+ <string name="create_a_backup_first">ÙÙ
Ø£ÙÙا٠بإÙشاء Ùسخة Ø¥ØتÙاطÙØ©</string>
+ <string name="name_can_t_be_empty">Ùا ÙÙ
Ù٠تر٠اÙإسÙ
Ùارغا</string>
<string name="fields_can_t_be_empty">Ùا ÙÙ
Ù٠تر٠اÙØÙÙÙ Ùارغة</string>
<string name="start_tor_again_for_finish_the_process">ÙÙ
بتشغÙ٠تÙر ثاÙÙØ©Ù ÙØ¥ÙÙاء اÙعÙ
ÙÙØ©</string>
<string name="confirm_service_deletion">تأÙÙد Øذ٠اÙخدÙ
Ø©</string>
diff --git a/app/src/main/res/values-ay/strings.xml b/app/src/main/res/values-ay/strings.xml
index 7c1c60f1..8a0582c9 100644
--- a/app/src/main/res/values-ay/strings.xml
+++ b/app/src/main/res/values-ay/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">QR chimpunaka</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Jawsañ apnaqirinakax Tor jark\'antañ yatipk ukjax \'Jalakipañ yanapiri\' mantañatak apnaqarakismawa. Yant\'añataki, mayjt\'ayañatakix AJLLT\'AM...</string>
<string name="get_bridges_email">Imaylu (Email)</string>
- <string name="activate">Qhantayaña</string>
<string name="apps_mode">VPN</string>
<string name="send_email">Qillqat apayaña</string>
<string name="vpn_default_world">Uraqpacha (justupaki)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">Lurañanak pichsuña</string>
<string name="backup_saved_at_external_storage">Imat luratanakamax yaqha yänakar imataxiwa</string>
<string name="backup_restored">Imat luratanakamax mayamp apnaqatäxiwa</string>
- <string name="please_grant_permissions_for_external_storage">Yaqha yänakar imañatak iyaw sam, amp suma</string>
- <string name="restore_backup">Imat luratanak mayamp aqtayam</string>
- <string name="name_can_t_be_empty">Sutix qillqantatäñapapuniwa</string>
+ <string name="restore_backup">Imat luratanak mayamp aqtayam</string>
+ <string name="create_a_backup_first"> Imat luratanak nayraqat uñstayam</string>
+ <string name="name_can_t_be_empty">Sutix qillqantatäñapapuniwa</string>
<string name="fields_can_t_be_empty">Janiw kunas ch\'usäñapakiti</string>
<string name="start_tor_again_for_finish_the_process">Tukuyañatakix Tor mayamp naktayam</string>
<string name="confirm_service_deletion">Lurañanakax pichsutäniwa</string>
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
index d1bab868..266a754a 100644
--- a/app/src/main/res/values-az/strings.xml
+++ b/app/src/main/res/values-az/strings.xml
@@ -123,7 +123,6 @@ LibEvent v2.0.21: http://www.monkey.org/~provos/libevent/</string>
<string name="restart_orbot_to_use_this_bridge_">LütfÉn, Orbotu söndürün vÉ yenidÉn yandırın ki, dÉyiÅikliklÉr tÉtbiq edilsin.</string>
<string name="menu_qr">QR kodlar</string>
<string name="get_bridges_email">Emeyl</string>
- <string name="activate">AktivlÉÅdir</string>
<string name="send_email">Emeyl göndÉrin</string>
<string name="save">Saxla</string>
<string name="name">Ad</string>
diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml
index 5aecd806..1f189531 100644
--- a/app/src/main/res/values-be/strings.xml
+++ b/app/src/main/res/values-be/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">QR-кодÑ</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">ÐÐ°Ð»Ñ Ð²Ð°Ñа мабÑлÑÐ½Ð°Ñ ÑеÑка акÑÑÑна блакÑе Tor, Ð²Ñ Ð¼Ð¾Ð¶Ð°Ñе вÑкаÑÑÑÑоÑваÑÑ Ð¼Ð°ÑÑÑ Tor Ð´Ð»Ñ Ð´Ð¾ÑÑÑÐ¿Ñ Ð´Ð° ÑеÑкÑ. ÐбÑÑÑÑе адзÑн з ваÑÑÑнÑÐ°Ñ Ð´Ð»Ñ Ð½Ð°Ð»Ð°Ð´Ñ Ñ ÑÑÑÑаваннÑ:</string>
<string name="get_bridges_email">Ðл. поÑÑа</string>
- <string name="activate">ÐкÑÑваÑÑÑ</string>
<string name="apps_mode">VPN-ÑÑжÑм</string>
<string name="send_email">ÐдпÑавÑÑÑ Ð»ÑÑÑ</string>
<string name="vpn_default_world">Ð¡Ð²ÐµÑ (аÑÑа)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">ÐÑдалÑÑÑ ÑлÑжбÑ</string>
<string name="backup_saved_at_external_storage">Ð ÑзеÑÐ²Ð¾Ð²Ð°Ñ ÐºÐ¾Ð¿ÑÑ Ð·Ð°Ñ
авана на вонкавÑм ÑÑ
овÑÑÑÑ</string>
<string name="backup_restored">ÐдноÑлена з ÑÑзеÑвовай копÑÑ</string>
- <string name="please_grant_permissions_for_external_storage">ÐайÑе дазвол Ð´Ð»Ñ Ð´Ð¾ÑÑÑÐ¿Ñ Ð´Ð° вонкавага ÑÑ
овÑÑÑа</string>
- <string name="restore_backup">ÐднавÑÑÑ Ð· копÑÑ</string>
- <string name="name_can_t_be_empty">ÐÐ¼Ñ Ð½Ðµ можа бÑÑÑ Ð¿ÑÑÑÑм</string>
+ <string name="restore_backup">ÐднавÑÑÑ Ð· копÑÑ</string>
+ <string name="create_a_backup_first">СпаÑаÑÐºÑ ÑÑваÑÑÑе ÑÑзеÑвовÑÑ ÐºÐ¾Ð¿ÑÑ</string>
+ <string name="name_can_t_be_empty">ÐÐ¼Ñ Ð½Ðµ можа бÑÑÑ Ð¿ÑÑÑÑм</string>
<string name="fields_can_t_be_empty">ÐÐ°Ð»Ñ Ð½Ðµ могÑÑÑ Ð±ÑÑÑ Ð¿ÑÑÑÑмÑ</string>
<string name="start_tor_again_for_finish_the_process">ÐапÑÑÑÑÑе Tor ÑÐ·Ð½Ð¾Ñ Ð´Ð»Ñ Ð·Ð°Ð²ÑÑÑÑÐ½Ð½Ñ Ð¿ÑаÑÑÑÑ</string>
<string name="confirm_service_deletion">ÐаÑвеÑджанне вÑÐ´Ð°Ð»ÐµÐ½Ð½Ñ ÑлÑжбÑ</string>
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index 332f7479..2d4c6f86 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -121,7 +121,6 @@
<string name="restart_orbot_to_use_this_bridge_">ÐолÑ, ÑеÑÑаÑÑиÑай Orbot, за да влÑÐ·Ð°Ñ Ð² дейÑÑвие пÑомениÑе</string>
<string name="menu_qr">QR Ðодове</string>
<string name="get_bridges_email">Ðмейл</string>
- <string name="activate">ÐкÑивиÑай</string>
<string name="send_email">ÐзпÑаÑи имейл</string>
<string name="hidden_services">СкÑиÑи ÑÑлÑги</string>
<string name="title_activity_hidden_services">СкÑиÑи ÑÑлÑги</string>
diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml
index 6d7a8dbc..cc14837c 100644
--- a/app/src/main/res/values-bn/strings.xml
+++ b/app/src/main/res/values-bn/strings.xml
@@ -8,7 +8,7 @@
<string name="main_layout_download">ডাà¦à¦¨à¦²à§à¦¡</string>
<string name="button_about">সমà§à¦¬à¦¨à§à¦§à§</string>
<string name="menu_exit">বনà§à¦§</string>
- <!--Welcome Wizard strings (DJH)-->
+ <!--Welcome Wizard strings (DJH)-->
<!--END Welcome Wizard strings (DJH)-->
<string name="pref_general_group">সাধারণ</string>
<!--New Wizard Strings-->
diff --git a/app/src/main/res/values-brx/strings.xml b/app/src/main/res/values-brx/strings.xml
index ca3772cd..a8ca57e7 100644
--- a/app/src/main/res/values-brx/strings.xml
+++ b/app/src/main/res/values-brx/strings.xml
@@ -2,7 +2,7 @@
<resources>
<string name="menu_settings">सà¥à¤à¤¿à¤à¤à¥à¤¸</string>
<string name="menu_exit">à¤
à¥à¤à¤à¤¾à¤°à¤²à¤¾à¤</string>
- <!--Welcome Wizard strings (DJH)-->
+ <!--Welcome Wizard strings (DJH)-->
<!--END Welcome Wizard strings (DJH)-->
<!--New Wizard Strings-->
<!--Title Screen-->
diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml
index f1e5db8f..17595009 100644
--- a/app/src/main/res/values-bs/strings.xml
+++ b/app/src/main/res/values-bs/strings.xml
@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="menu_settings">Postavke</string>
- <!--Welcome Wizard strings (DJH)-->
+ <!--Welcome Wizard strings (DJH)-->
<!--END Welcome Wizard strings (DJH)-->
<string name="pref_general_group">Osnovno</string>
<!--New Wizard Strings-->
@@ -11,7 +11,6 @@
<!--TipsAndTricks screen-->
<!--Transparent Proxy screen-->
<string name="set_locale_title">Jezik</string>
- <string name="activate">Aktiviraj</string>
<string name="save">SaÄuvaj</string>
<string name="name">Ime</string>
</resources>
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 2699bcbe..a090964d 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">Codis QR</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Si la teva xarxa mòbil boqueja activament Tor, pots utilitzar un \'Servidor pont\' com a via alternativa. SELECCIONA una de les opcions per configurar i provar.</string>
<string name="get_bridges_email">Correu-e</string>
- <string name="activate">Activa</string>
<string name="apps_mode">Mode VPN</string>
<string name="send_email">Envia correu-e</string>
<string name="vpn_default_world">Global (auto)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">Esborrar servei</string>
<string name="backup_saved_at_external_storage">Còpia de seguretat desada a emmagatzematge extern</string>
<string name="backup_restored">Còpia de seguretat restaurada</string>
- <string name="please_grant_permissions_for_external_storage">Si us plau concedeix permisos per emmagatzematge extern</string>
<string name="restore_backup">Restaurar còpia de seguretat</string>
- <string name="name_can_t_be_empty">El nom no pot estar buit</string>
+ <string name="create_a_backup_first">Crea una còpia de seguretat primer</string>
+ <string name="name_can_t_be_empty">El nom no pot estar buit</string>
<string name="fields_can_t_be_empty">Els camps no poden estar buits</string>
<string name="start_tor_again_for_finish_the_process">Torna a iniciar Tor per acabar el procés</string>
<string name="confirm_service_deletion">Confirma la supressió del servei</string>
diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml
index d182355a..b262d02d 100644
--- a/app/src/main/res/values-cs-rCZ/strings.xml
+++ b/app/src/main/res/values-cs-rCZ/strings.xml
@@ -120,7 +120,6 @@
<string name="restart_orbot_to_use_this_bridge_">Pro projevenà zmÄn restartujte Orbot</string>
<string name="menu_qr">QR kódy</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">Aktivovat</string>
<string name="send_email">Pošli email</string>
<string name="save">Uložit</string>
<string name="name">Jméno</string>
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 8961fb78..092ff884 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -17,7 +17,7 @@
<string name="menu_exit">Konec</string>
<string name="menu_scan">Skenovat QR kód bridge</string>
<string name="menu_share_bridge">SdÃlet QR kód bridge</string>
- <!--Welcome Wizard strings (DJH)-->
+ <!--Welcome Wizard strings (DJH)-->
<string name="wizard_details">Detaily o Orbotu</string>
<!--END Welcome Wizard strings (DJH)-->
<string name="pref_general_group">HlavnÃ</string>
@@ -33,7 +33,6 @@
<string name="bridges">PÅemostÄnÃ</string>
<string name="set_locale_title">Jazyk</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">Aktivovat</string>
<string name="hidden_services">Skryté Služby</string>
<string name="title_activity_hidden_services">Skryté Služby</string>
<string name="menu_hidden_services">Skryté Služby</string>
diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml
index 5a963b08..511ad59c 100644
--- a/app/src/main/res/values-cy/strings.xml
+++ b/app/src/main/res/values-cy/strings.xml
@@ -33,7 +33,6 @@
<string name="enter_exclude_nodes">I mewn i Nodau Eithrio</string>
<string name="third_party_software">Meddalwedd 3ydd-parti</string>
<string name="set_locale_title">Iaith</string>
- <string name="activate">Ysgogi</string>
<string name="hidden_services">Gwasanaethau Cudd</string>
<string name="title_activity_hidden_services">Gwasanaethau Cudd</string>
<string name="menu_hidden_services">Gwasanaethau Cudd</string>
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 32f0d624..5263007f 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -95,7 +95,6 @@
<string name="kb">KB</string>
<string name="mb">MB</string>
<string name="get_bridges_email">Mail</string>
- <string name="activate">Aktiver</string>
<string name="hidden_services">Skjulte tjenester</string>
<string name="title_activity_hidden_services">Skjulte tjenester</string>
<string name="menu_hidden_services">Skjulte tjenester</string>
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index caff5d8a..8bbadf91 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">QR Codes</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Wenn Ihr mobiles Netzwerk Tor blockiert, können Sie einen \"Brücken-Server\" als alternativen Weg verwenden. Wählen Sie eine der Optionen zum Konfigurieren und Testen ..,.</string>
<string name="get_bridges_email">E-Mail</string>
- <string name="activate">Aktivieren</string>
<string name="apps_mode">VPN Modus</string>
<string name="send_email">E-Mail senden</string>
<string name="vpn_default_world">Global (Automatisch)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">Dienst löschen</string>
<string name="backup_saved_at_external_storage">Sicherung auf externem Speicher gespeichert </string>
<string name="backup_restored">Sicherung wiederhergestellt</string>
- <string name="please_grant_permissions_for_external_storage">Bitte Zugriffsrechte auf externen Speicher gewähren</string>
<string name="restore_backup">Sicherung wiederherstellen</string>
- <string name="name_can_t_be_empty">Name darf nicht leer sein</string>
+ <string name="create_a_backup_first">Erstellen Sie zuerst eine Sicherung</string>
+ <string name="name_can_t_be_empty">Name darf nicht leer sein</string>
<string name="fields_can_t_be_empty">Felder dürfen nicht leer sein</string>
<string name="start_tor_again_for_finish_the_process">Tor neu starten, um den Vorgang abzuschlieÃen</string>
<string name="confirm_service_deletion">Löschen des Dienst bestätigen</string>
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 87a67ce3..d9ce51a4 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">ÎÏÎ´Î¹ÎºÎµÏ QR</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Îν Ïο δίκÏÏ
ο κινηÏÎ®Ï ÏηλεÏÏÎ½Î¯Î±Ï ÏÎ±Ï Î¼ÏλοκάÏει ενεÏγά Ïο Tor, μÏοÏείÏε να ÏÏηÏιμοÏοιήÏεÏε μια γÎÏÏ
Ïα για να ÎÏεÏε ÏÏÏÏβαÏη ÏÏο δίκÏÏ
ο. ÎÎ ÎÎÎÎΤΠÎναν αÏÏ ÏοÏ
Ï ÏαÏαÏÎ¬Î½Ï ÏÏÏοÏ
Ï Î³ÎÏÏ
ÏÎ±Ï Î³Î¹Î± να ενεÏγοÏοιήÏεÏε ÏÎ¹Ï Î³ÎÏÏ
ÏεÏ.</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">ÎνεÏγοÏοίηÏη</string>
<string name="apps_mode">ÎειÏοÏ
Ïγία VPN</string>
<string name="send_email">ΣÏείλÏε Email</string>
<string name="vpn_default_world">ΠαγκÏÏμια (Auto)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">ÎιαγÏαÏή Ï
ÏηÏεÏίαÏ</string>
<string name="backup_saved_at_external_storage">Το ανÏίγÏάÏο αÏÏÎ±Î»ÎµÎ¯Î±Ï Î±ÏοθηκεÏθηκε Ïε εξÏÏεÏÎ¹ÎºÏ Î¼ÎÏο αÏοθήκεÏ
ÏηÏ</string>
<string name="backup_restored">Το ανÏίγÏαÏο αÏÏÎ±Î»ÎµÎ¯Î±Ï ÎµÏαναÏÎÏθηκε</string>
- <string name="please_grant_permissions_for_external_storage">ΠαÏακαλοÏμε να ÏαÏαÏÏÏήÏεÏε δικαιÏμαÏα για εξÏÏεÏική αÏοθήκεÏ
Ïη</string>
<string name="restore_backup">ÎÏαναÏοÏά ανÏιγÏάÏοÏ
αÏÏαλείαÏ</string>
- <string name="name_can_t_be_empty">Το Ïνομα δεν γίνεÏαι να είναι κενÏ</string>
+ <string name="create_a_backup_first">ÎημιοÏ
ÏγήÏÏε ÏÏÏÏα Îνα ανÏίγÏαÏο αÏÏÎ±Î»ÎµÎ¯Î±Ï </string>
+ <string name="name_can_t_be_empty">Το Ïνομα δεν γίνεÏαι να είναι κενÏ</string>
<string name="fields_can_t_be_empty">Τα Ïεδία δεν μÏοÏεί να είναι κενά</string>
<string name="start_tor_again_for_finish_the_process">ÎναÏξη ξανά ÏÎ¿Ï Tor για Ïον ÏεÏμαÏιÏÎ¼Ï ÏÎ·Ï ÎµÎ½ÎÏγειαÏ</string>
<string name="confirm_service_deletion">ÎÏιβεβαίÏÏη διαγÏαÏÎ®Ï Ï
ÏηÏεÏίαÏ</string>
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index 81eb0b90..e6be6eab 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -13,7 +13,7 @@
<string name="main_layout_upload">AlÅutado</string>
<string name="button_about">Pri</string>
<string name="menu_exit">Eliri</string>
- <!--Welcome Wizard strings (DJH)-->
+ <!--Welcome Wizard strings (DJH)-->
<string name="wizard_details">Kelkaj Detaloj pri Orbot</string>
<!--END Welcome Wizard strings (DJH)-->
<string name="pref_general_group">Äenerala</string>
@@ -70,7 +70,6 @@
<string name="unable_to_read_hidden_service_name">ne eblas legi nomon de la kaÅita servo</string>
<string name="unable_to_start_tor">Ne eblas startigi Tor:</string>
<string name="set_locale_title">Lingvo</string>
- <string name="activate">Aktivi</string>
<string name="save">Konservi</string>
<string name="name">Nomo</string>
<string name="done"> Farita! </string>
diff --git a/app/src/main/res/values-es-rAR/strings.xml b/app/src/main/res/values-es-rAR/strings.xml
index 4698804e..daeb0304 100644
--- a/app/src/main/res/values-es-rAR/strings.xml
+++ b/app/src/main/res/values-es-rAR/strings.xml
@@ -105,8 +105,7 @@
<string name="kb">KB</string>
<string name="mb">MB</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">Activar</string>
- <string name="save">Guardar</string>
+ <string name="save">Guardar</string>
<string name="name">Nombre</string>
<string name="disable">Deshabilitar</string>
</resources>
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index e101d8d4..47cb05e8 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -128,7 +128,6 @@ direcciones (o rangos). No prevalecen sobre las configuraciones de exclusión de
<string name="menu_qr">Códigos QR</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Si su red móvil bloquea Tor activamente, puede usar un \'Servidor Puente\' como alternativa para acceder. SELECCIONE una de las opciones a configurar y probar...</string>
<string name="get_bridges_email">Correo electrónico</string>
- <string name="activate">Activar</string>
<string name="apps_mode">Modo VPN</string>
<string name="send_email">Enviar correo</string>
<string name="vpn_default_world">Global (Automático)</string>
@@ -147,9 +146,9 @@ direcciones (o rangos). No prevalecen sobre las configuraciones de exclusión de
<string name="delete_service">Borrar servicio</string>
<string name="backup_saved_at_external_storage">Copia de seguridad guardada en un almacenamiento externo</string>
<string name="backup_restored">Copia de seguridad restaurada</string>
- <string name="please_grant_permissions_for_external_storage">Por favor, conceda permisos para almacenamiento externo</string>
<string name="restore_backup">Restaurar copia de seguridad</string>
- <string name="name_can_t_be_empty">El nombre no puede estar vacÃo</string>
+ <string name="create_a_backup_first">Primero cree una copia de seguridad</string>
+ <string name="name_can_t_be_empty">El nombre no puede estar vacÃo</string>
<string name="fields_can_t_be_empty">Los campos no pueden estar vacÃos</string>
<string name="start_tor_again_for_finish_the_process">Inicie Tor de nuevo para finalizar el proceso</string>
<string name="confirm_service_deletion">Confirme el borrado del servicio</string>
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index ad6337be..c1a7436f 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">QR Kodeak</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Zure sare mugikorrak Tor nahita blokeatzen badu, \'Zubi zerbitzaria\' erabili dezakezu ordezko sarbide gisa. HAUTATU konfiguratzeko aukera bat eta probatu...</string>
<string name="get_bridges_email">E-mail</string>
- <string name="activate">Aktibatu</string>
<string name="apps_mode">VPN modua</string>
<string name="send_email">Bidali E-maila</string>
<string name="vpn_default_world">Orokorra (Automatikoa)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">Ezabatu zerbitzua</string>
<string name="backup_saved_at_external_storage">Babeskopia kanpo biltegiratzean gorde da</string>
<string name="backup_restored">Babeskopia berrezarri da</string>
- <string name="please_grant_permissions_for_external_storage">Eman kanpo biltegiratzerako baimena</string>
<string name="restore_backup">Berrezarri babeskopia</string>
- <string name="name_can_t_be_empty">Izena ezin da hutsik egon</string>
+ <string name="create_a_backup_first">Sortu babeskopia aurretik</string>
+ <string name="name_can_t_be_empty">Izena ezin da hutsik egon</string>
<string name="fields_can_t_be_empty">Eremuak ezin dira hutsik egon</string>
<string name="start_tor_again_for_finish_the_process">Hasi Tor berriro prozesua amaitzeko</string>
<string name="confirm_service_deletion">Berretsi zerbitzua ezabatzea</string>
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index a4b0196d..b3c910fc 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">کدÙØ§Û QR</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">اگر شبک٠ÙÙ
راÙتا٠ب٠صÙرت Ù
رتب تÙر را Ù
سدÙد Ù
ÛâÚ©ÙØ¯Ø Ù
ÛâتÙاÙÛد از ÛÚ© «کارساز پٻ ب٠عÙÙا٠راÙÛ Ø¬Ø§ÛگزÛÙ Ø¨Ø±Ø§Û ÙرÙد استÙاد٠کÙÛد. Ø¨Ø±Ø§Û Ù¾ÛکربÙØ¯Û Ù ØªØ³ØªØ ÛÚ©Û Ø§Ø² گزÛÙÙâÙا را اÙتخاب Ú©ÙÛدâ¦</string>
<string name="get_bridges_email">اÛÙ
ÛÙ</string>
- <string name="activate">ÙعاÙ</string>
<string name="apps_mode">ØاÙت VPN</string>
<string name="send_email">اÛÙ
Û٠بÙرست</string>
<string name="vpn_default_world">جÙاÙÛ (Ø®Ùدکار)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">Øذ٠سرÙÛس</string>
<string name="backup_saved_at_external_storage">بکâآپ در اÙØ¨Ø§Ø±Ù Ø®Ø§Ø±Ø¬Û Ø°Ø®Ûر٠شد</string>
<string name="backup_restored">بکâآپ بازگرداÙد٠شد</string>
- <string name="please_grant_permissions_for_external_storage">ÙØ·Ùا ب٠اÙØ¨Ø§Ø±Ù Ø®Ø§Ø±Ø¬Û Ø§Ø¬Ø§Ø²Ù Ø¯Ø³ØªØ±Ø³Û Ø¨Ø¯ÙÛد</string>
- <string name="restore_backup">برگرداÙد٠بکâآپ</string>
- <string name="name_can_t_be_empty">ÙاÙ
ÙباÛد خاÙÛ Ø¨Ø§Ø´Ø¯</string>
+ <string name="restore_backup">برگرداÙد٠بکâآپ</string>
+ <string name="create_a_backup_first">اÙÙ ÛÚ© Ùسخ٠بکâآپ درست Ú©ÙÛد</string>
+ <string name="name_can_t_be_empty">ÙاÙ
ÙباÛد خاÙÛ Ø¨Ø§Ø´Ø¯</string>
<string name="fields_can_t_be_empty">زÙ
ÛÙÙâÙا ÙباÛد خاÙÛ Ø¨Ø§Ø´Ùد</string>
<string name="start_tor_again_for_finish_the_process">Ø¨Ø±Ø§Û Ù¾Ø§Ûا٠رÙÙد کار Ø Ø¯Ùبار٠تÙر را آغاز Ú©ÙÛد</string>
<string name="confirm_service_deletion">Øذ٠سرÙÛس را تاÛÛد Ú©ÙÛد</string>
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index ea816426..9f4228cb 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -121,7 +121,6 @@
<string name="restart_orbot_to_use_this_bridge_">Käynnistä Orbot uudelleen ottaaksesi muutokset käyttöön</string>
<string name="menu_qr">QR-koodit</string>
<string name="get_bridges_email">Sähköposti</string>
- <string name="activate">Ota käyttöön</string>
<string name="send_email">Lähetä sähköpostia</string>
<string name="hidden_services">Piilopalvelut</string>
<string name="title_activity_hidden_services">Piilopalvelut</string>
diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml
index 2bd5f988..67b8e006 100644
--- a/app/src/main/res/values-fr-rFR/strings.xml
+++ b/app/src/main/res/values-fr-rFR/strings.xml
@@ -121,7 +121,6 @@
<string name="restart_orbot_to_use_this_bridge_">Veuillez redémarrer Orbot pour activer les changements</string>
<string name="menu_qr">Codes QR</string>
<string name="get_bridges_email">Courriel</string>
- <string name="activate">Activer</string>
<string name="send_email">Envoyer un courriel</string>
<string name="save">Enregistrer</string>
<string name="name">Name</string>
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 43ae1a8e..42e35d4a 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">Codes QR</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Si votre réseau mobile bloque Tor activement, vous pouvez utiliser un serveur-pont comme moyen de remplacement. CHOISIR une des options pour configurer et testerâ¦</string>
<string name="get_bridges_email">Courriel</string>
- <string name="activate">Activer</string>
<string name="apps_mode">Mode RPV</string>
<string name="send_email">Envoyer un courriel</string>
<string name="vpn_default_world">Mondial (Auto)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">Supprimer le service</string>
<string name="backup_saved_at_external_storage">La sauvegarde a été enregistrée sur une mémoire externe</string>
<string name="backup_restored">La sauvegarde a été restaurée</string>
- <string name="please_grant_permissions_for_external_storage">Veuillez accorder les droits vers la mémoire externe</string>
<string name="restore_backup">Restaurer la sauvegarde</string>
- <string name="name_can_t_be_empty">Le nom ne peut pas être vide</string>
+ <string name="create_a_backup_first">Créer dâabord une sauvegarde</string>
+ <string name="name_can_t_be_empty">Le nom ne peut pas être vide</string>
<string name="fields_can_t_be_empty">Les champs ne peuvent pas être vides</string>
<string name="start_tor_again_for_finish_the_process">Redémarrer Tor pour terminer le processus</string>
<string name="confirm_service_deletion">Confirmer la suppression du service</string>
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 4dc30171..c0c8808f 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">Códigod QR</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Si a súa rede móbil bloquea Tor de xeito activo, pode utilizar un \'Servidor Ponte\' como modo alternativo. ESCOLL unha das opcións para configurar e probar...</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">Activar</string>
<string name="apps_mode">Modo VPN</string>
<string name="send_email">Enviar correo</string>
<string name="vpn_default_world">Global (Auto)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">Eliminar servizo</string>
<string name="backup_saved_at_external_storage">Respaldo gardado en almacenamento externo</string>
<string name="backup_restored">Respaldo restaurado</string>
- <string name="please_grant_permissions_for_external_storage">Por favor, conceda permiso para o almacenamento externo</string>
<string name="restore_backup">Restaurar respaldo</string>
- <string name="name_can_t_be_empty">O nome non pode quedar baldeiro</string>
+ <string name="create_a_backup_first">Cree un respaldo primeiro</string>
+ <string name="name_can_t_be_empty">O nome non pode quedar baldeiro</string>
<string name="fields_can_t_be_empty">Os campos non poden estar baldeiros</string>
<string name="start_tor_again_for_finish_the_process">Inicie Tor de novo para rematar o proceso</string>
<string name="confirm_service_deletion">Confirme a eliminación do servizo</string>
diff --git a/app/src/main/res/values-gu/strings.xml b/app/src/main/res/values-gu/strings.xml
index 4fae11f7..c3c1285d 100644
--- a/app/src/main/res/values-gu/strings.xml
+++ b/app/src/main/res/values-gu/strings.xml
@@ -10,7 +10,6 @@
<!--Permissions screen-->
<!--TipsAndTricks screen-->
<!--Transparent Proxy screen-->
- <string name="activate">સàªà«àª°àª¿àª¯</string>
<string name="save">સàªàªà«àª°àª¹à«</string>
<string name="name">નામ</string>
<string name="disable">નિષà«àªà«àª°àª¿àª¯ àªàª°à«</string>
diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml
index 9eaff697..5e3a99b8 100644
--- a/app/src/main/res/values-he/strings.xml
+++ b/app/src/main/res/values-he/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">ק××× QR</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">×× ×¤×¢×××ת ×רשת ×× ×××ת ש×× ××ס×ת ×ת Tor, ××ª× ×××× ××שת×ש ×\'שרת ×שר\' ×××¨× ×××פ×ת ××××× ×¡. ××ר ××ת ××פשר×××ת ××× ×××××ר ××××××...</string>
<string name="get_bridges_email">×××\"×</string>
- <string name="activate">×פע×</string>
<string name="apps_mode">××¦× VPN</string>
<string name="send_email">ש×× ×××\"×</string>
<string name="vpn_default_world">×¢×××× (×××××××)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">××ק ש×ר×ת</string>
<string name="backup_saved_at_external_storage">××××× × ×©×ר ×××ס×× ××צ×× ×</string>
<string name="backup_restored">××××× ×©×××ר</string>
- <string name="please_grant_permissions_for_external_storage">×× × ××¢× ×§ ×רש××ת ×¢××ר ××ס×× ××צ×× ×</string>
- <string name="restore_backup">ש××ר ×××××</string>
- <string name="name_can_t_be_empty">×©× ××× × ×××× ××××ת ר×ק</string>
+ <string name="restore_backup">ש××ר ×××××</string>
+ <string name="create_a_backup_first">צ×ר ××××× ×ª××××</string>
+ <string name="name_can_t_be_empty">×©× ××× × ×××× ××××ת ר×ק</string>
<string name="fields_can_t_be_empty">ש××ת ××× × ×××××× ××××ת ר×ק××</string>
<string name="start_tor_again_for_finish_the_process">××¤×¢× ×ת Tor ש×× ××× ×ס××× ×ת ×ת××××</string>
<string name="confirm_service_deletion">×שר ×××קת ש×ר×ת</string>
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index 718d02eb..32fe7b49 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -128,7 +128,6 @@
<string name="menu_qr">QR à¤à¥à¤¡</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">यदि à¤à¤ªà¤à¤¾ मà¥à¤¬à¤¾à¤à¤² नà¥à¤à¤µà¤°à¥à¤ सà¤à¥à¤°à¤¿à¤¯ रà¥à¤ª सॠà¤à¥ à¤à¥ बà¥à¤²à¥à¤ à¤à¤°à¤¤à¤¾ हà¥, तॠà¤à¤ª \'पà¥à¤² सरà¥à¤µà¤°\' à¤à¥ à¤à¤ वà¥à¤à¤²à¥à¤ªà¤¿à¤ तरà¥à¤à¥ सॠà¤à¤ªà¤¯à¥à¤ à¤à¤° सà¤à¤¤à¥ हà¥à¤à¥¤ à¤à¥à¤¨à¥à¤«à¤¼à¤¿à¤à¤° à¤à¤° परà¥à¤à¥à¤·à¤£ à¤à¤°à¤¨à¥ à¤à¥ लिठविà¤à¤²à¥à¤ªà¥à¤ मà¥à¤ सॠà¤à¤ à¤à¤¾ à¤à¤¯à¤¨ à¤à¤°à¥à¤ ..,।</string>
<string name="get_bridges_email">à¤à¤®à¥à¤²</string>
- <string name="activate">सà¤à¥à¤°à¤¿à¤¯</string>
<string name="apps_mode">वà¥à¤ªà¥à¤à¤¨ मà¥à¤¡</string>
<string name="send_email">à¤à¤®à¥à¤² à¤à¥à¤à¥à¤</string>
<string name="vpn_default_world">à¤à¥à¤²à¥à¤¬à¤² (à¤à¤à¥)</string>
@@ -147,9 +146,9 @@
<string name="delete_service">सà¥à¤µà¤¾ हà¤à¤¾à¤à¤</string>
<string name="backup_saved_at_external_storage">बाहà¥à¤¯ सà¤à¤à¥à¤°à¤¹à¤£ मà¥à¤ बà¥à¤à¤
प सहà¥à¤à¤¾ à¤à¤¯à¤¾</string>
<string name="backup_restored">बà¥à¤à¤
प à¤à¥ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ à¤à¤¿à¤¯à¤¾ à¤à¤¯à¤¾</string>
- <string name="please_grant_permissions_for_external_storage">à¤à¥à¤ªà¤¯à¤¾ बाहरॠसà¤à¤à¥à¤°à¤¹à¤£ à¤à¥ लिठà¤
नà¥à¤®à¤¤à¤¿ दà¥à¤</string>
<string name="restore_backup">बà¥à¤à¤
प बहाल</string>
- <string name="name_can_t_be_empty">नाम रिà¤à¥à¤¤ नहà¥à¤ हॠसà¤à¤¤à¤¾</string>
+ <string name="create_a_backup_first">पहलॠबà¥à¤à¤
प बनाà¤à¤</string>
+ <string name="name_can_t_be_empty">नाम रिà¤à¥à¤¤ नहà¥à¤ हॠसà¤à¤¤à¤¾</string>
<string name="fields_can_t_be_empty">फ़à¥à¤²à¥à¤¡ रिà¤à¥à¤¤ नहà¥à¤ हॠसà¤à¤¤à¥</string>
<string name="start_tor_again_for_finish_the_process">पà¥à¤°à¤à¥à¤°à¤¿à¤¯à¤¾ à¤à¥ à¤à¤¤à¥à¤® à¤à¤°à¤¨à¥ à¤à¥ लिठTor पà¥à¤¨: पà¥à¤°à¤¾à¤°à¤à¤ à¤à¤°à¥à¤</string>
<string name="confirm_service_deletion">सà¥à¤µà¤¾ हà¤à¤¾à¤¨à¥ à¤à¥ पà¥à¤·à¥à¤à¤¿ à¤à¤°à¥à¤</string>
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 18d85e5f..a6cfecca 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -121,7 +121,6 @@
<string name="restart_orbot_to_use_this_bridge_">Ponovno pokrenite Orbot da bi omoguÄili promjene</string>
<string name="menu_qr">QR kodovi</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">Aktiviraj</string>
<string name="send_email">Pošalji email</string>
<string name="save">Spremi</string>
<string name="name">Ime</string>
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index b25e987b..77a0687f 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">QR kódok</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Ha a mobil hálózata aktÃvan blokkolja a Tor-t, akkor választhatja a \'HÃd szerver\'-t, mint alternatÃv utat. VÃLASSZON egyet a lehetÅségek közül és tesztelje....</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">Aktiválás</string>
<string name="apps_mode">VPN Mód</string>
<string name="send_email">Email küldése</string>
<string name="vpn_default_world">Globális (Auto)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">Szolgáltatás Törlése</string>
<string name="backup_saved_at_external_storage">KülsŠtárhelyre mentve</string>
<string name="backup_restored">Mentés visszaállÃtva</string>
- <string name="please_grant_permissions_for_external_storage">Kérjük adjon jogosultságot a külsŠtárhelyhez</string>
<string name="restore_backup">Mentés visszaállÃtása</string>
- <string name="name_can_t_be_empty">A név nem lehet üres</string>
+ <string name="create_a_backup_first">KészÃtsen elÅbb egy mentést</string>
+ <string name="name_can_t_be_empty">A név nem lehet üres</string>
<string name="fields_can_t_be_empty">A mezÅk nem lehetnek üresek</string>
<string name="start_tor_again_for_finish_the_process">IndÃtsa el a Tor-t még egyszer a befejezéshez</string>
<string name="confirm_service_deletion">Szolgáltatás törlés jóváhagyása</string>
diff --git a/app/src/main/res/values-hy-rAM/strings.xml b/app/src/main/res/values-hy-rAM/strings.xml
index a59aa749..cd3998d4 100644
--- a/app/src/main/res/values-hy-rAM/strings.xml
+++ b/app/src/main/res/values-hy-rAM/strings.xml
@@ -4,7 +4,7 @@
<string name="menu_about">ÕÕ¡Õ½Õ«Õ¶</string>
<string name="button_about">ÕÕ¡Õ½Õ«Õ¶</string>
<string name="menu_exit">ÔµÕ¬Ö</string>
- <!--Welcome Wizard strings (DJH)-->
+ <!--Welcome Wizard strings (DJH)-->
<!--END Welcome Wizard strings (DJH)-->
<!--New Wizard Strings-->
<!--Title Screen-->
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index 808657d2..b00d1ac9 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -121,7 +121,6 @@
<string name="restart_orbot_to_use_this_bridge_">Silakan start ulang Orbot untuk mengaktifkan perubahan</string>
<string name="menu_qr">Kode QR</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">Aktivasi</string>
<string name="send_email">Kirim Email</string>
<string name="save">Simpan</string>
<string name="name">Nama</string>
diff --git a/app/src/main/res/values-in-rID/strings.xml b/app/src/main/res/values-in-rID/strings.xml
index 4fa75a8b..b5bc11c3 100644
--- a/app/src/main/res/values-in-rID/strings.xml
+++ b/app/src/main/res/values-in-rID/strings.xml
@@ -121,7 +121,6 @@
<string name="restart_orbot_to_use_this_bridge_">Silakan start ulang Orbot untuk mengaktifkan perubahan</string>
<string name="menu_qr">Kode QR</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">Aktivasi</string>
<string name="send_email">Kirim Email</string>
<string name="please_restart_Orbot_to_enable_the_changes">Silakan start ulang Orbot untuk mengaktifkan perubahan</string>
</resources>
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index c758955c..0c86a753 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -10,7 +10,7 @@
<string name="menu_about">Mengenai</string>
<string name="button_about">Mengenai</string>
<string name="menu_exit">Keluar</string>
- <!--Welcome Wizard strings (DJH)-->
+ <!--Welcome Wizard strings (DJH)-->
<!--END Welcome Wizard strings (DJH)-->
<string name="pref_general_group">Umum</string>
<!--New Wizard Strings-->
diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml
index 2d5138ef..aa03098e 100644
--- a/app/src/main/res/values-is/strings.xml
+++ b/app/src/main/res/values-is/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">QR-kóðar</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Ef farsÃmanetið þitt er virkt à að loka á Tor, geturðu notað \'Brúarþjón\' sem varaleið inn. VELDU einn af valkostunum til að setja upp og prófa...</string>
<string name="get_bridges_email">Tölvupóstur</string>
- <string name="activate">Virkja</string>
<string name="apps_mode">VPN-hamur</string>
<string name="send_email">Senda tölvupóst</string>
<string name="vpn_default_world">VÃðvært (sjálfvirkt)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">Eyða þjónustu</string>
<string name="backup_saved_at_external_storage">Ãryggisafrit var vistað à ytri gagnageymslu</string>
<string name="backup_restored">Ãryggisafrit var endurheimt</string>
- <string name="please_grant_permissions_for_external_storage">Gefðu heimild til að nota ytri gagnageymslu</string>
<string name="restore_backup">Endurheimta úr öryggisafriti</string>
- <string name="name_can_t_be_empty">Nafnið má ekki vera autt</string>
+ <string name="create_a_backup_first">Gerðu fyrst öryggisafrit</string>
+ <string name="name_can_t_be_empty">Nafnið má ekki vera autt</string>
<string name="fields_can_t_be_empty">Gagnasvið mega ekki vera auð</string>
<string name="start_tor_again_for_finish_the_process">Ræstu Tor aftur til að ljúka ferlinu</string>
<string name="confirm_service_deletion">Staðfestu eyðingu á þjónustu</string>
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 762127e3..9bc6e48d 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">Codici QR</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Se la tua rete mobile blocca attivamente Tor, puoi usare un \'Server Bridge\' come via alternativa. SELEZIONA una delle opzioni per configurare e testare...</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">Attiva</string>
<string name="apps_mode">Modalità VPN</string>
<string name="send_email">Invia email</string>
<string name="vpn_default_world">Globale (Auto)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">Elimina il servizio</string>
<string name="backup_saved_at_external_storage">Backup salvato nell\'archiviazione esterna</string>
<string name="backup_restored">Backup ripristinato</string>
- <string name="please_grant_permissions_for_external_storage">Consenti l\'autorizzazione per l\'archiviazione esterna</string>
<string name="restore_backup">Ripristina backup</string>
- <string name="name_can_t_be_empty">Il nome non può essere vuoto</string>
+ <string name="create_a_backup_first">Prima crea un backup</string>
+ <string name="name_can_t_be_empty">Il nome non può essere vuoto</string>
<string name="fields_can_t_be_empty">I campi non possono essere vuoti</string>
<string name="start_tor_again_for_finish_the_process">Riavvia Tor per finire il processo</string>
<string name="confirm_service_deletion">Conferma l\'eliminazione del servizio</string>
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index 24e005d0..df55cd70 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -98,6 +98,5 @@
<string name="mb">MB</string>
<string name="menu_qr">ק×× QR</string>
<string name="get_bridges_email">×××\"×</string>
- <string name="activate">×פע×</string>
<string name="send_email">ש×× ×××\"×</string>
</resources>
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 940c0331..728c775d 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">QRã³ã¼ã</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">ã¢ãã¤ã«ãããã¯ã¼ã¯ãé »ç¹ã«Torããããã¯ããå ´åãå¥ã®æ¹æ³ã¨ã㦠\'ããªãã¸ãµã¼ãã¼\'ã使ç¨ãããã¨ãã§ãã¾ãããªãã·ã§ã³ãï¼ã¤é¸æãã¦ãè¨å®ã¨ãã¹ããè¡ã£ã¦ãã ããã</string>
<string name="get_bridges_email">ã¡ã¼ã«</string>
- <string name="activate">ã¢ã¯ãã£ãå</string>
<string name="apps_mode">VPN ã¢ã¼ã</string>
<string name="send_email">ã¡ã¼ã«éä¿¡</string>
<string name="vpn_default_world">ä¸çä¸ (èªå)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">ãµã¼ãã¹ãåé¤</string>
<string name="backup_saved_at_external_storage">ããã¯ã¢ããã¯å¤é¨è¨æ¶è£
ç½®ã«ä¿åããã¾ãã</string>
<string name="backup_restored">ããã¯ã¢ãããã復å
</string>
- <string name="please_grant_permissions_for_external_storage">å¤é¨è¨æ¶ã¸ã®ã¢ã¯ã»ã¹è¨±å¯ãä¸ãã¦ä¸ããã</string>
<string name="restore_backup">ããã¯ã¢ããã®å¾©æ§</string>
- <string name="name_can_t_be_empty">ååã¯ãã©ã³ã¯ã®ã¾ã¾ã«ã§ãã¾ãã</string>
+ <string name="create_a_backup_first">æåã«ãããã¯ã¢ãããä½æãã¦ä¸ãã</string>
+ <string name="name_can_t_be_empty">ååã¯ãã©ã³ã¯ã®ã¾ã¾ã«ã§ãã¾ãã</string>
<string name="fields_can_t_be_empty">ãã£ã¼ã«ãã空ã«ãã¦ãããã¨ã¯ã§ãã¾ãã</string>
<string name="start_tor_again_for_finish_the_process">ããã»ã¹ãå®äºããã«ã¯ãTorãåèµ·åãã¦ä¸ããã</string>
<string name="confirm_service_deletion">ãµã¼ãã¹åé¤ã確èª</string>
diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml
index 9e5403b7..98f27eb6 100644
--- a/app/src/main/res/values-kn/strings.xml
+++ b/app/src/main/res/values-kn/strings.xml
@@ -3,7 +3,7 @@
<string name="app_name">à²à²°à³à²¬à³à²à³</string>
<string name="menu_about">ಬà²à³à²à³</string>
<string name="button_about">ಬà²à³à²à³</string>
- <!--Welcome Wizard strings (DJH)-->
+ <!--Welcome Wizard strings (DJH)-->
<!--END Welcome Wizard strings (DJH)-->
<!--New Wizard Strings-->
<!--Title Screen-->
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index d80f9108..1c51ec2d 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -121,7 +121,6 @@
<string name="restart_orbot_to_use_this_bridge_">ë³ê²½ì ìë£íë ¤ë©´ Orbotì ì¬ììíì¸ì</string>
<string name="menu_qr">QR ì½ë</string>
<string name="get_bridges_email">ì´ë©ì¼</string>
- <string name="activate">íì±í</string>
<string name="send_email">ì´ë©ì¼ ë³´ë´ê¸°</string>
<string name="save">ì ì¥</string>
<string name="name">Name</string>
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 2ff6f375..4bbabf6f 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -32,7 +32,6 @@
<string name="bridges">Tinklų tiltai</string>
<string name="set_locale_title">Kalba</string>
<string name="get_bridges_email">El. paštas</string>
- <string name="activate">Aktyvuoti</string>
<string name="save">Įrašyti</string>
<string name="name">Vardas</string>
<string name="backup_restored">AtsarginÄ kopija atkurta</string>
diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml
index 4266a96d..67df6a13 100644
--- a/app/src/main/res/values-lv/strings.xml
+++ b/app/src/main/res/values-lv/strings.xml
@@ -121,7 +121,6 @@
<string name="restart_orbot_to_use_this_bridge_">LÅ«dzu pÄrstartÄjiet Orbot, lai iespÄjotu izmaiÅas</string>
<string name="menu_qr">QR kodi</string>
<string name="get_bridges_email">E-pasts</string>
- <string name="activate">AktivizÄt</string>
<string name="send_email">Nosūtīt e-pastu</string>
<string name="hidden_services">SlÄptie pakalpojumi</string>
<string name="title_activity_hidden_services">SlÄptie pakalpojumi</string>
diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml
index 8a3a2731..2cda7ec3 100644
--- a/app/src/main/res/values-mk/strings.xml
+++ b/app/src/main/res/values-mk/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">QR-кодови</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Ðко ваÑаÑа мобилна мÑежа акÑивно го блокиÑа Tor, можеÑе да коÑиÑÑиÑе âÐоÑÑ ÑеÑвеÑâ како алÑеÑнаÑивен пÑиÑÑап. ÐÐÐÐÐ ÐТРедна од опÑииÑе за поÑÑавÑваÑе и ÑеÑÑиÑаÑе...</string>
<string name="get_bridges_email">Ð-поÑÑа</string>
- <string name="activate">ÐкÑивиÑаÑ</string>
<string name="apps_mode">VPN мод</string>
<string name="send_email">ÐÑпÑаÑеÑе е-поÑÑа</string>
<string name="vpn_default_world">Ðлобално (ÐвÑомаÑÑки)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">ÐзбÑиÑи ÑÑлÑга</string>
<string name="backup_saved_at_external_storage">РезеÑвнаÑа копиÑа е Ñнимена на надвоÑеÑна мемоÑиÑа</string>
<string name="backup_restored">ÐÑаÑено од ÑезеÑвна копиÑа</string>
- <string name="please_grant_permissions_for_external_storage">Ðе молиме дадеÑе дозволи за надвоÑеÑна мемоÑиÑа</string>
- <string name="restore_backup">ÐÑаÑи ÑезеÑвна копиÑа</string>
- <string name="name_can_t_be_empty">ÐмеÑо не може да биде пÑазно</string>
+ <string name="restore_backup">ÐÑаÑи ÑезеÑвна копиÑа</string>
+ <string name="create_a_backup_first">Создади ÑезеÑвна копиÑа</string>
+ <string name="name_can_t_be_empty">ÐмеÑо не може да биде пÑазно</string>
<string name="fields_can_t_be_empty">ÐолиÑаÑа не Ð¼Ð¾Ð¶Ð°Ñ Ð´Ð° Ð±Ð¸Ð´Ð°Ñ Ð¿Ñазни</string>
<string name="start_tor_again_for_finish_the_process">СÑаÑÑÑÐ²Ð°Ñ Ð³Ð¾ Tor повÑоÑно да го завÑÑи пÑоÑеÑоÑ</string>
<string name="confirm_service_deletion">ÐоÑвÑди бÑиÑеÑе на ÑÑлÑгаÑа</string>
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
index d6e713bc..155a8a8c 100644
--- a/app/src/main/res/values-ml/strings.xml
+++ b/app/src/main/res/values-ml/strings.xml
@@ -4,7 +4,7 @@
<string name="menu_stop">നിരàµâà´¤àµà´¤àµà´</string>
<string name="menu_about">വിവരà´</string>
<string name="button_about">വിവരà´</string>
- <!--Welcome Wizard strings (DJH)-->
+ <!--Welcome Wizard strings (DJH)-->
<!--END Welcome Wizard strings (DJH)-->
<string name="pref_general_group">à´ªàµà´¤àµà´µà´¾à´¯à´¤àµ</string>
<!--New Wizard Strings-->
diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml
index c8181628..d9456370 100644
--- a/app/src/main/res/values-my/strings.xml
+++ b/app/src/main/res/values-my/strings.xml
@@ -7,7 +7,7 @@
<string name="main_layout_download">áá±á«ááºá¸áá¯ááº</string>
<string name="button_about">á¡áá¼á±á¬ááºá¸</string>
<string name="menu_exit">áá½ááºáááº</string>
- <!--Welcome Wizard strings (DJH)-->
+ <!--Welcome Wizard strings (DJH)-->
<!--END Welcome Wizard strings (DJH)-->
<string name="pref_general_group">áá±áá¯áá»</string>
<!--New Wizard Strings-->
@@ -21,7 +21,6 @@
<string name="kb">áá®ááá¯ááá¯ááº</string>
<string name="mb">ááá¹áá«ááá¯ááº</string>
<string name="get_bridges_email">á¡á®á¸á±áá¸áá¹</string>
- <string name="activate">Activate</string>
<string name="hidden_services">Hidden Services</string>
<string name="title_activity_hidden_services">Hidden Services</string>
<string name="menu_hidden_services">Hidden Services</string>
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index 0b3385a4..910a4079 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -123,7 +123,6 @@
<string name="restart_orbot_to_use_this_bridge_">Gjør omstart av Orbot før endringer trer i kraft</string>
<string name="menu_qr">QR-koder</string>
<string name="get_bridges_email">E-post</string>
- <string name="activate">Aktiver</string>
<string name="apps_mode">VPN-modus</string>
<string name="send_email">Send e-post</string>
<string name="hidden_services">Hidden Services</string>
@@ -140,7 +139,8 @@
<string name="delete_service">Slett tjeneste</string>
<string name="backup_restored">Sikkerhetskopi gjenopprettet</string>
<string name="restore_backup">Gjenopprett sikkerhetskopi</string>
- <string name="name_can_t_be_empty">Navnet kan ikke være tomt</string>
+ <string name="create_a_backup_first">Opprett en sikkerhetskopi først</string>
+ <string name="name_can_t_be_empty">Navnet kan ikke være tomt</string>
<string name="fields_can_t_be_empty">Felter kan ikke stå tomme</string>
<string name="start_tor_again_for_finish_the_process">Start Tor igjen for å fullføre prosessen</string>
<string name="confirm_service_deletion">Bekreft sletting av tjeneste</string>
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 4ee74353..57838dcc 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">QR-codes</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Als je mobiele netwerk Tor actief blokkeert, kan je een \'bridge-server\' gebruiken als alternatieve toegang. SELECTEER een van de opties om te configureren en te testen..,.</string>
<string name="get_bridges_email">E-mail</string>
- <string name="activate">Activeren</string>
<string name="apps_mode">VPN-modus</string>
<string name="send_email">E-mail versturen</string>
<string name="vpn_default_world">Algemeen (automatisch)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">Dienst verwijderen</string>
<string name="backup_saved_at_external_storage">Back-up opgeslagen op externe opslag</string>
<string name="backup_restored">Back-up hersteld</string>
- <string name="please_grant_permissions_for_external_storage">Verleen toestemmingen voor externe opslag</string>
<string name="restore_backup">Back-up herstellen</string>
- <string name="name_can_t_be_empty">Naam kan niet leeg zijn</string>
+ <string name="create_a_backup_first">Maak eerst een back-up aan</string>
+ <string name="name_can_t_be_empty">Naam kan niet leeg zijn</string>
<string name="fields_can_t_be_empty">Velden kunnen niet leeg zijn</string>
<string name="start_tor_again_for_finish_the_process">Start Tor opnieuw om het proces te voltooien</string>
<string name="confirm_service_deletion">Bevestig verwijderen van dienst</string>
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 2f8f36a4..60443b1b 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -121,7 +121,6 @@
<string name="restart_orbot_to_use_this_bridge_">ProszÄ zrestartowaÄ Orbot, aby zmiany mogÅy wejÅÄ w życie</string>
<string name="menu_qr">Kody QR</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">Aktywuj</string>
<string name="apps_mode">Tryb VPN</string>
<string name="send_email">WyÅlij Email</string>
<string name="hidden_services">Ukryte UsÅugi</string>
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index b290a20a..5987d5c9 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">QR Codes</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Se sua rede de dados bloqueia o Tor, você pode utilizar um \'Servidor Bridge\' como alternativa contra o bloqueio. SELECIONE umas das opções para configurar e testar..,.</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">Atvar</string>
<string name="apps_mode">Modo VPN</string>
<string name="send_email">Enviar Email</string>
<string name="vpn_default_world">Global (Automático)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">Remover Serviço</string>
<string name="backup_saved_at_external_storage">Backup salvo em mÃdia externa</string>
<string name="backup_restored">Backup Restaurado</string>
- <string name="please_grant_permissions_for_external_storage">Por favor dê permissões ao armazenamento externo</string>
<string name="restore_backup">Restaurar Backup</string>
- <string name="name_can_t_be_empty">O campo Nome não pode ser vazio</string>
+ <string name="create_a_backup_first">Criar primeiro backup</string>
+ <string name="name_can_t_be_empty">O campo Nome não pode ser vazio</string>
<string name="fields_can_t_be_empty">Campos não podem ser vazios</string>
<string name="confirm_service_deletion">Confirmar a remoção do serviço</string>
<string name="service_type">Tipo do Serviço</string>
diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml
index 3007685b..f2b53796 100644
--- a/app/src/main/res/values-pt-rPT/strings.xml
+++ b/app/src/main/res/values-pt-rPT/strings.xml
@@ -51,7 +51,6 @@
<string name="mb">MB</string>
<string name="menu_qr">Códigos QR</string>
<string name="get_bridges_email">E-mail</string>
- <string name="activate">Ativar</string>
<string name="send_email">Enviar Mensagem</string>
<string name="save">Guardar</string>
<string name="name">Nome</string>
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 9f465f0a..60224208 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -75,7 +75,6 @@
<string name="bridges_updated">Pontes Atualizadas</string>
<string name="menu_qr">Códigos QR</string>
<string name="get_bridges_email">Correio Eletrónico</string>
- <string name="activate">Ativar</string>
<string name="send_email">Enviar Mensagem</string>
<string name="hidden_services">Serviços ocultos</string>
<string name="title_activity_hidden_services">Serviços ocultos</string>
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 47c329ea..a66a817b 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -121,7 +121,6 @@
<string name="restart_orbot_to_use_this_bridge_">VÄ rugÄm reporniÅ£i Orbot pentru a aplica modificÄrile</string>
<string name="menu_qr">Coduri QR</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">ActiveazÄ</string>
<string name="send_email">Trimite email</string>
<string name="hidden_services">Servicii ascunse</string>
<string name="title_activity_hidden_services">Servicii ascunse</string>
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 7c1ecf28..320d69bc 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">QR-кодÑ</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">ÐÑли ваÑа мобилÑÐ½Ð°Ñ ÑеÑÑ Ð°ÐºÑивно блокиÑÑÐµÑ Tor, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð¼Ð¾ÑÑÑ Tor Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к ÑеÑи. ÐÑбеÑиÑе один из ваÑианÑов Ð´Ð»Ñ Ð½Ð°ÑÑÑойки и ÑеÑÑиÑованиÑ:</string>
<string name="get_bridges_email">Ðл. поÑÑа</string>
- <string name="activate">ÐкÑиваÑиÑ</string>
<string name="apps_mode">VPN-Ñежим</string>
<string name="send_email">ÐÑпÑавиÑÑ Ð¿Ð¸ÑÑмо</string>
<string name="vpn_default_world">ÐÐ¸Ñ (авÑо)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">УдалиÑÑ ÑлÑжбÑ</string>
<string name="backup_saved_at_external_storage">РезеÑÐ²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ ÑоÑ
Ñанена на внеÑнем Ñ
ÑанилиÑе</string>
<string name="backup_restored">ÐоÑÑÑановлено из ÑезеÑвной копии</string>
- <string name="please_grant_permissions_for_external_storage">ÐÑедоÑÑавÑÑе ÑазÑеÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к внеÑÐ½ÐµÐ¼Ñ Ñ
ÑанилиÑÑ</string>
<string name="restore_backup">ÐоÑÑÑановиÑÑ Ð¸Ð· копии</string>
- <string name="name_can_t_be_empty">ÐÐ¼Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑÑм</string>
+ <string name="create_a_backup_first">СнаÑала ÑоздайÑе ÑезеÑвнÑÑ ÐºÐ¾Ð¿Ð¸Ñ</string>
+ <string name="name_can_t_be_empty">ÐÐ¼Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑÑм</string>
<string name="fields_can_t_be_empty">ÐÐ¾Ð»Ñ Ð½Ðµ могÑÑ Ð±ÑÑÑ Ð¿ÑÑÑÑми</string>
<string name="start_tor_again_for_finish_the_process">ÐапÑÑÑиÑе Tor Ñнова Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð¿ÑоÑеÑÑа</string>
<string name="confirm_service_deletion">ÐодÑвеÑждение ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑлÑжбÑ</string>
diff --git a/app/src/main/res/values-si-rLK/strings.xml b/app/src/main/res/values-si-rLK/strings.xml
index d25c1f8a..2604766b 100644
--- a/app/src/main/res/values-si-rLK/strings.xml
+++ b/app/src/main/res/values-si-rLK/strings.xml
@@ -83,7 +83,6 @@
<string name="set_locale_title">භà·à·à·à·</string>
<string name="kb">KB</string>
<string name="mb">MB</string>
- <string name="activate">à¶à·âරà·à¶ºà·à¶à¶»à·à¶±à·à¶±</string>
<string name="hidden_services">à·à·à¶à·à·à¶«à· à·à·à·à· </string>
<string name="title_activity_hidden_services">à·à·à¶à·à·à¶«à· à·à·à·à· </string>
<string name="menu_hidden_services">à·à·à¶à·à·à¶«à· à·à·à·à· </string>
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 7306f4ec..d72eb96b 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -121,7 +121,6 @@
<string name="restart_orbot_to_use_this_bridge_">ProsÃm reÅ¡tartujte Orbot, aby sa aktivovali zmeny</string>
<string name="menu_qr">QR kódy</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">Aktivovať</string>
<string name="send_email">Poslať email</string>
<string name="save">Uložiť</string>
<string name="name">Meno</string>
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index b819d581..026e2710 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -25,7 +25,6 @@
<!--Transparent Proxy screen-->
<string name="error">Napaka</string>
<string name="set_locale_title">Jezik</string>
- <string name="activate">Aktiviraj</string>
<string name="save">Shrani</string>
<string name="name">ime</string>
</resources>
diff --git a/app/src/main/res/values-sn/strings.xml b/app/src/main/res/values-sn/strings.xml
index fc47b092..150742c9 100644
--- a/app/src/main/res/values-sn/strings.xml
+++ b/app/src/main/res/values-sn/strings.xml
@@ -6,7 +6,7 @@
<string name="menu_about">Maererano</string>
<string name="button_about">Maererano</string>
<string name="menu_exit">Buda</string>
- <!--Welcome Wizard strings (DJH)-->
+ <!--Welcome Wizard strings (DJH)-->
<!--END Welcome Wizard strings (DJH)-->
<!--New Wizard Strings-->
<!--Title Screen-->
diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml
index b871275a..9850d2f1 100644
--- a/app/src/main/res/values-sq/strings.xml
+++ b/app/src/main/res/values-sq/strings.xml
@@ -23,7 +23,6 @@
<string name="bridges">Urat</string>
<string name="set_locale_title">Gjuhë</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">Aktivizo</string>
<string name="save">Ruaje</string>
<string name="name">Emër</string>
<string name="backup_restored">Kopjeruajtja u rikthye</string>
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index 8a4dc91a..124076e3 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -125,7 +125,6 @@
<string name="menu_qr">QR Ðодови</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Ðко ваÑа мобилна мÑежа акÑивно блокиÑа ТоÑ, можеÑе пÑемоÑÑиваÑи ÑеÑвеÑом као алÑеÑнаÑивни наÑин ÑлаÑка.ÐÐÐÐÐÐ Ð ÑÐµÐ´Ð½Ñ Ð¾Ð´ опÑиÑа за конÑигÑÑаÑиÑÑ Ð¸ ÑеÑÑиÑаÑе....</string>
<string name="get_bridges_email">Ð-поÑÑа</string>
- <string name="activate">ÐкÑивиÑаÑи</string>
<string name="apps_mode">VPN Ðод</string>
<string name="send_email">ÐоÑаÑи Ð-поÑÑÑ</string>
<string name="vpn_default_world">Ðлобално (ÐÑÑомаÑÑки)</string>
@@ -144,9 +143,9 @@
<string name="delete_service">ÐбÑиÑи УÑлÑгÑ</string>
<string name="backup_saved_at_external_storage">РезеÑбна копиÑа Ñе ÑаÑÑвана на ÑпоÑÐ½Ð¾Ñ Ð¼ÐµÐ¼Ð¾ÑиÑи</string>
<string name="backup_restored">РезеÑвна копиÑа Ñе обновÑена</string>
- <string name="please_grant_permissions_for_external_storage">Ðолимо да даÑе дозволе за екÑÑеÑно ÑкладиÑÑеÑе</string>
<string name="restore_backup">Ðбнови ÑезеÑÐ²Ð½Ñ ÐºÐ¾Ð¿Ð¸ÑÑ</string>
- <string name="name_can_t_be_empty">Ðме не може биÑи пÑазно</string>
+ <string name="create_a_backup_first">ÐапÑави ÑезеÑÐ²Ð½Ñ ÐºÐ¾Ð¿Ð¸ÑÑ Ð¿Ñво</string>
+ <string name="name_can_t_be_empty">Ðме не може биÑи пÑазно</string>
<string name="fields_can_t_be_empty">ÐоÑа не Ð¼Ð¾Ð³Ñ Ð±Ð¸Ñи пÑазна</string>
<string name="start_tor_again_for_finish_the_process">Ðоново покÑениÑе Ð¢Ð¾Ñ Ð´Ð° биÑÑе довÑÑили пÑоÑеÑ</string>
<string name="confirm_service_deletion">ÐоÑÑвÑди бÑиÑанÑе ÑÑлÑге</string>
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index d9b78350..d64eb5fb 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">QR-koder</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Om ditt mobilnät aktivt blockerar Tor kan du använda en \"Bridge Server\" som ett alternativt sätt. VÃLJ ett av alternativen att konfigurera och testa.,.</string>
<string name="get_bridges_email">E-post</string>
- <string name="activate">Aktivera</string>
<string name="apps_mode">VPN-läge</string>
<string name="send_email">Skicka e-post</string>
<string name="vpn_default_world">Global (automatisk)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">Ta bort tjänst</string>
<string name="backup_saved_at_external_storage">Säkerhetskopiering sparad i externt lagringsutrymme</string>
<string name="backup_restored">Backup återställd</string>
- <string name="please_grant_permissions_for_external_storage">Bevilja tillstånd för extern lagring</string>
<string name="restore_backup">Ã
terställa säkerhetskopia</string>
- <string name="name_can_t_be_empty">Namnet kan inte vara tomt</string>
+ <string name="create_a_backup_first">Skapa en säkerhetskopia först</string>
+ <string name="name_can_t_be_empty">Namnet kan inte vara tomt</string>
<string name="fields_can_t_be_empty">Fält kan inte vara tomma</string>
<string name="start_tor_again_for_finish_the_process">Starta Tor igen för att avsluta processen</string>
<string name="confirm_service_deletion">Bekräfta tjänst borttagning</string>
diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml
index 77ff4796..1a04526f 100644
--- a/app/src/main/res/values-ta/strings.xml
+++ b/app/src/main/res/values-ta/strings.xml
@@ -32,7 +32,6 @@
<string name="bridges">Bridgeà®à®³à¯</string>
<string name="set_locale_title">à®®à¯à®´à®¿</string>
<string name="get_bridges_email">மினà¯à®©à®à¯à®à®²à¯</string>
- <string name="activate">à®à¯à®¯à®²à¯à®ªà®à¯à®¤à¯à®¤à®µà¯à®®à¯</string>
<string name="save">à®à¯à®®à®¿</string>
<string name="name">பà¯à®¯à®°à¯</string>
<string name="service_type">à®à¯à®µà¯ வà®à¯</string>
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index f227ce70..d27760e4 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">รหัสà¸à¸´à¸§à¸à¸²à¸£à¹</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">หาà¸à¹à¸à¸£à¸·à¸à¸à¹à¸²à¸¢à¹à¸à¸£à¸¨à¸±à¸à¸à¹à¸à¸à¸à¸à¸¸à¸à¸à¸´à¸à¸à¸±à¹à¸ Tor à¸à¸¸à¸à¸ªà¸²à¸¡à¸²à¸£à¸à¹à¸à¹ \'à¹à¸à¸´à¸£à¹à¸à¹à¸§à¸à¸£à¹ Bridge\' à¹à¸à¹à¸à¸à¸±à¸§à¹à¸¥à¸·à¸à¸à¹à¸à¸à¸²à¸£à¹à¸à¹à¸²à¸à¸¶à¸à¹à¸à¹ à¹à¸¥à¸·à¸à¸à¸à¸±à¸§à¹à¸¥à¸·à¸à¸à¸«à¸à¸¶à¹à¸à¹à¸à¸·à¹à¸à¸à¸³à¸«à¸à¸à¸à¹à¸²à¹à¸¥à¸°à¸à¸à¸ªà¸à¸...</string>
<string name="get_bridges_email">à¸à¸µà¹à¸¡à¸¥</string>
- <string name="activate">à¹à¸à¸´à¸à¹à¸à¹à¸à¸²à¸</string>
<string name="apps_mode">à¹à¸«à¸¡à¸ VPN</string>
<string name="send_email">สà¹à¸à¸à¸µà¹à¸¡à¸¥</string>
<string name="vpn_default_world">สà¹à¸§à¸à¸£à¸§à¸¡ (à¸à¸±à¸à¹à¸à¸¡à¸±à¸à¸´)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">à¸à¸£à¸´à¸à¸²à¸£à¸¥à¸</string>
<string name="backup_saved_at_external_storage">à¸à¹à¸à¸¡à¸¹à¸¥à¸ªà¸³à¸£à¸à¸à¸à¸±à¸à¸à¸¶à¸à¸à¸µà¹à¸à¸µà¹à¹à¸à¹à¸à¸à¹à¸à¸¡à¸¹à¸¥à¸ ายà¸à¸à¸</string>
<string name="backup_restored">à¸à¸·à¸à¸à¹à¸²à¸à¹à¸à¸¡à¸¹à¸¥à¸ªà¸³à¸£à¸à¸</string>
- <string name="please_grant_permissions_for_external_storage">à¸à¸£à¸¸à¸à¸²à¸à¸à¸¸à¸à¸²à¸à¹à¸«à¹à¹à¸à¹à¸²à¸à¸¶à¸à¸à¸µà¹à¹à¸à¹à¸à¸à¹à¸à¸¡à¸¹à¸¥à¸ ายà¸à¸à¸</string>
<string name="restore_backup">à¸à¸·à¸à¸à¹à¸²à¸à¹à¸à¸¡à¸¹à¸¥à¸ªà¸³à¸£à¸à¸</string>
- <string name="name_can_t_be_empty">à¸à¸¥à¹à¸à¸¢à¸à¸·à¹à¸à¹à¸«à¹à¸§à¹à¸²à¸à¹à¸¡à¹à¹à¸à¹</string>
+ <string name="create_a_backup_first">สรà¹à¸²à¸à¸à¹à¸à¸¡à¸¹à¸¥à¸ªà¸³à¸£à¸à¸à¸à¹à¸à¸</string>
+ <string name="name_can_t_be_empty">à¸à¸¥à¹à¸à¸¢à¸à¸·à¹à¸à¹à¸«à¹à¸§à¹à¸²à¸à¹à¸¡à¹à¹à¸à¹</string>
<string name="fields_can_t_be_empty">à¸à¸¥à¹à¸à¸¢à¹à¸à¸à¸à¹à¸à¸¡à¸¹à¸¥à¹à¸«à¹à¸§à¹à¸²à¸à¹à¸¡à¹à¹à¸à¹</string>
<string name="start_tor_again_for_finish_the_process">à¹à¸£à¸´à¹à¸¡à¸à¸³à¸à¸²à¸ Tor à¸à¸µà¸à¸à¸£à¸±à¹à¸à¹à¸à¸·à¹à¸à¸à¸à¸à¸£à¸°à¸à¸§à¸à¸à¸²à¸£</string>
<string name="confirm_service_deletion">ยืà¸à¸¢à¸±à¸à¸à¸²à¸£à¸¥à¸à¸à¸£à¸´à¸à¸²à¸£</string>
diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml
index 9514f37e..4d0672eb 100644
--- a/app/src/main/res/values-tl/strings.xml
+++ b/app/src/main/res/values-tl/strings.xml
@@ -103,7 +103,6 @@
<string name="kb">KB</string>
<string name="mb">MB</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">Activate</string>
<string name="send_email">Send Email</string>
<string name="save">I-save</string>
<string name="name">Name</string>
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 13bafec3..0d284492 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">QR Kodları</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Tor kullanımı mobil aÄınızda etkin olarak engelleniyorsa, Tor aÄına eriÅmek için bir \'Köprü Sunucusu\' kullanabilirsiniz. Yapılandırmak ve denemek için aÅaÄıdaki seçeneklerden birini seçin...</string>
<string name="get_bridges_email">E-posta</string>
- <string name="activate">EtkinleÅtir</string>
<string name="apps_mode">VPN Kipi</string>
<string name="send_email">E-posta Gönder</string>
<string name="vpn_default_world">Genel (Otomatik)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">Hizmeti Sil</string>
<string name="backup_saved_at_external_storage">Yedek dıŠdepolamaya kaydedildi</string>
<string name="backup_restored">Yedek geri yüklendi</string>
- <string name="please_grant_permissions_for_external_storage">Lütfen dıŠdepolama için izinleri verin</string>
- <string name="restore_backup">YedeÄi Geri Yükle</string>
- <string name="name_can_t_be_empty">Ad boŠbırakılamaz</string>
+ <string name="restore_backup">YedeÄi Geri Yükle</string>
+ <string name="create_a_backup_first">Ãnce bir yedek oluÅturun</string>
+ <string name="name_can_t_be_empty">Ad boŠbırakılamaz</string>
<string name="fields_can_t_be_empty">Alanlar boŠbırakılamaz</string>
<string name="start_tor_again_for_finish_the_process">Ä°Ålemi tamamlamak için Tor uygulamasını yeniden baÅlatın</string>
<string name="confirm_service_deletion">Hizmeti Silmeyi Onayla</string>
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 7655621b..bd527861 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">QR-коди</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">ЯкÑо ваÑа мобÑлÑна меÑежа акÑивно блокÑÑ Tor, ви можеÑе викоÑиÑÑовÑваÑи \'Bridge Server\' Ñк алÑÑеÑнаÑивний ÑпоÑÑб вÑ
одÑ. ÐÐÐÐРРодин Ñз паÑамеÑÑÑв Ð´Ð»Ñ Ð½Ð°Ð»Ð°ÑÑÑÐ²Ð°Ð½Ð½Ñ Ñа ÑеÑÑÑваннÑ...</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">ÐкÑивÑваÑи</string>
<string name="apps_mode">VPN СпоÑÑб</string>
<string name="send_email">ÐадÑÑлаÑи лиÑÑа</string>
<string name="vpn_default_world">ÐлобалÑний (авÑомаÑиÑний)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">ÐилÑÑиÑи СеÑвÑÑ</string>
<string name="backup_saved_at_external_storage">РезеÑвна копÑÑ Ð·Ð±ÐµÑежена на зовнÑÑнÑй пам\'ÑÑÑ</string>
<string name="backup_restored">РезеÑвне копÑÑÐ²Ð°Ð½Ð½Ñ Ð²Ñдновлено</string>
- <string name="please_grant_permissions_for_external_storage">ÐадайÑе дозволи на зовнÑÑÐ½Ñ Ð¿Ð°Ð¼\'ÑÑÑ</string>
<string name="restore_backup">ÐÑдновиÑи ÑезеÑÐ²Ð½Ñ ÐºÐ¾Ð¿ÑÑ</string>
- <string name="name_can_t_be_empty">Ðазва не може бÑÑи поÑожнÑоÑ</string>
+ <string name="create_a_backup_first">СпеÑÑÑ ÑÑвоÑиÑи ÑезеÑÐ²Ð½Ñ ÐºÐ¾Ð¿ÑÑ</string>
+ <string name="name_can_t_be_empty">Ðазва не може бÑÑи поÑожнÑоÑ</string>
<string name="fields_can_t_be_empty">ÐÐ¾Ð»Ñ Ð½Ðµ можÑÑÑ Ð±ÑÑи поÑожнÑми</string>
<string name="start_tor_again_for_finish_the_process">ÐапÑÑÑÑÑÑ Tor Ð·Ð½Ð¾Ð²Ñ Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð½Ñ Ð¿ÑоÑеÑÑ</string>
<string name="confirm_service_deletion">ÐÑдÑвеÑдÑÑе Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÑеÑвÑÑÑ</string>
diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml
index 0a9144d1..a1e3111e 100644
--- a/app/src/main/res/values-ur/strings.xml
+++ b/app/src/main/res/values-ur/strings.xml
@@ -5,7 +5,7 @@
<string name="menu_start">شرÙع کرئÛÚº</string>
<string name="menu_about">Ú©Û Ø¨Ø§Ø±Û Ù
ÛÚº</string>
<string name="button_about">Ú©Û Ø¨Ø§Ø±Û Ù
ÛÚº</string>
- <!--Welcome Wizard strings (DJH)-->
+ <!--Welcome Wizard strings (DJH)-->
<!--END Welcome Wizard strings (DJH)-->
<string name="pref_general_group">عاÙ
</string>
<!--New Wizard Strings-->
diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml
index 88a8df79..6bab2922 100644
--- a/app/src/main/res/values-uz/strings.xml
+++ b/app/src/main/res/values-uz/strings.xml
@@ -10,7 +10,7 @@
<string name="main_layout_upload">Yuklash</string>
<string name="button_about">Dasur haqida</string>
<string name="menu_exit">Chiqish</string>
- <!--Welcome Wizard strings (DJH)-->
+ <!--Welcome Wizard strings (DJH)-->
<!--END Welcome Wizard strings (DJH)-->
<string name="pref_general_group">Umumiy</string>
<!--New Wizard Strings-->
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index 1f1ffff1..cfeaa442 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -121,7 +121,6 @@
<string name="restart_orbot_to_use_this_bridge_">Vui lòng khá»i Äá»ng lại Orbot ÄỠáp dụng thay Äá»i</string>
<string name="menu_qr">Mã QR</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">KÃch hoạt</string>
<string name="send_email">Gá»i email</string>
<string name="save">LÆ°u</string>
<string name="name">Tên</string>
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 1ca54872..054fedcf 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -121,7 +121,6 @@
<string name="restart_orbot_to_use_this_bridge_">请éå¯ Orbot 以使åæ´çæ</string>
<string name="menu_qr">QRç </string>
<string name="get_bridges_email">çµåé®ä»¶</string>
- <string name="activate">æ¿æ´»</string>
<string name="apps_mode">VPN 模å¼</string>
<string name="send_email">åéçµåé®ä»¶</string>
<string name="save">ä¿å</string>
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index e19327a9..83b1c846 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -127,7 +127,6 @@
<string name="menu_qr">QR 碼</string>
<string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">å¦æè¡å網路主åå°å°é Tor å¯ä»¥ä½¿ç¨\"æ©æ¥ä¼ºæå¨\"ä½çºæ¿ä»£æ¹å¼.é¸æä¸åé¸é
ä½è¨å®å測試</string>
<string name="get_bridges_email">Email</string>
- <string name="activate">åç¨</string>
<string name="apps_mode">VPN 模å¼</string>
<string name="send_email">å¯éé»å信件</string>
<string name="vpn_default_world">å
¨å(èªå)</string>
@@ -146,9 +145,9 @@
<string name="delete_service">åªé¤æå</string>
<string name="backup_saved_at_external_storage">å份æªå²åå¨å¤é¨å²åå¨</string>
<string name="backup_restored">å份已éå</string>
- <string name="please_grant_permissions_for_external_storage">è«ææ¬å¤æ¥å²åå¨ä½¿ç¨</string>
<string name="restore_backup">éåå份</string>
- <string name="name_can_t_be_empty">å稱ä¸å¯ç©ºç½</string>
+ <string name="create_a_backup_first">å
åµç«å份</string>
+ <string name="name_can_t_be_empty">å稱ä¸å¯ç©ºç½</string>
<string name="fields_can_t_be_empty">æ¬ä½ä¸å¯ç©ºç½</string>
<string name="start_tor_again_for_finish_the_process">å次éå Tor 以å®ææ¤éç¨</string>
<string name="confirm_service_deletion">確èªæååªé¤</string>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 85b356c9..c0868b5c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -164,8 +164,6 @@
<string name="get_bridges_email">Email</string>
<string name="get_bridges_email_request">Request Bridges via Email</string>
- <string name="activate">Activate</string>
-
<string name="apps_mode">VPN Mode</string>
<string name="send_email">Send Email</string>
@@ -186,8 +184,8 @@
<string name="delete_service">Delete Service</string>
<string name="backup_saved_at_external_storage">Backup saved at external storage</string>
<string name="backup_restored">Backup restored</string>
- <string name="please_grant_permissions_for_external_storage">Please grant permissions for external storage</string>
<string name="restore_backup">Restore Backup</string>
+ <string name="create_a_backup_first">Create a backup first</string>
<string name="name_can_t_be_empty">Name can\'t be empty</string>
<string name="fields_can_t_be_empty">Fields can\'t be empty</string>
<string name="start_tor_again_for_finish_the_process">Start Tor again for finish the process</string>
diff --git a/appcore/src/main/java/org/torproject/android/core/ClipboardUtils.kt b/appcore/src/main/java/org/torproject/android/core/ClipboardUtils.kt
new file mode 100644
index 00000000..0225c0ed
--- /dev/null
+++ b/appcore/src/main/java/org/torproject/android/core/ClipboardUtils.kt
@@ -0,0 +1,17 @@
+package org.torproject.android.core
+
+import android.content.ClipData
+import android.content.ClipboardManager
+import android.content.Context
+import android.widget.Toast
+
+object ClipboardUtils {
+ @JvmStatic
+ fun copyToClipboard(label: String, value: String, successMsg: String, context: Context): Boolean {
+ val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?
+ ?: return false
+ clipboard.setPrimaryClip(ClipData.newPlainText(label, value))
+ Toast.makeText(context, successMsg, Toast.LENGTH_LONG).show()
+ return true
+ }
+}
\ No newline at end of file
diff --git a/appcore/src/main/java/org/torproject/android/core/DiskUtils.kt b/appcore/src/main/java/org/torproject/android/core/DiskUtils.kt
index f9ce78ec..7e741695 100644
--- a/appcore/src/main/java/org/torproject/android/core/DiskUtils.kt
+++ b/appcore/src/main/java/org/torproject/android/core/DiskUtils.kt
@@ -1,14 +1,39 @@
package org.torproject.android.core
+import android.annotation.TargetApi
import android.content.ContentResolver
+import android.content.Context
import android.content.Intent
import android.net.Uri
+import android.os.Build
+import android.os.Environment
import java.io.BufferedReader
+import java.io.File
import java.io.IOException
-import java.lang.StringBuilder
+import java.io.InputStreamReader
object DiskUtils {
+
+ @JvmStatic
+ fun supportsStorageAccessFramework() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
+
+ @JvmStatic
+ @Throws(IOException::class)
+ fun readFileFromAssets(assetFilename: String, context: Context): String {
+ val reader = BufferedReader(InputStreamReader(context.assets.open(assetFilename)))
+ // do reading, usually loop until end of file reading
+ val sb = StringBuilder()
+ var mLine = reader.readLine()
+ while (mLine != null) {
+ sb.append(mLine).append('\n') // process line
+ mLine = reader.readLine()
+ }
+ reader.close()
+ return sb.toString()
+ }
+
@JvmStatic
+ @TargetApi(Build.VERSION_CODES.KITKAT)
fun createWriteFileIntent(filename: String, mimeType: String): Intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = mimeType
@@ -16,6 +41,7 @@ object DiskUtils {
}
@JvmStatic
+ @TargetApi(Build.VERSION_CODES.KITKAT)
fun createReadFileIntent(mimeType: String): Intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = mimeType
@@ -36,4 +62,15 @@ object DiskUtils {
return text.toString()
}
+ @JvmStatic
+ fun readFile(contentResolver: ContentResolver, file: File): String = readFileFromInputStream(contentResolver, Uri.fromFile(file))
+
+ @JvmStatic
+ fun getOrCreateLegacyBackupDir(): File? {
+ if (Environment.MEDIA_MOUNTED != Environment.getExternalStorageState()) return null
+ val dir = File(Environment.getExternalStorageDirectory(), "Orbot")
+ return if (!dir.isDirectory && !dir.mkdirs()) null else dir
+ }
+
+
}
\ No newline at end of file
diff --git a/appcore/src/main/java/org/torproject/android/core/ui/SettingsPreferencesActivity.kt b/appcore/src/main/java/org/torproject/android/core/ui/SettingsPreferencesActivity.kt
index a8eaf644..8aa3af17 100644
--- a/appcore/src/main/java/org/torproject/android/core/ui/SettingsPreferencesActivity.kt
+++ b/appcore/src/main/java/org/torproject/android/core/ui/SettingsPreferencesActivity.kt
@@ -55,11 +55,11 @@ class SettingsPreferencesActivity : PreferenceActivity() {
companion object {
private const val BUNDLE_KEY_PREFERENCES_XML = "prefxml"
+
@JvmStatic
- fun createIntent(context: Context?, @XmlRes xmlPrefId: Int): Intent {
- val intent = Intent(context, SettingsPreferencesActivity::class.java)
- intent.putExtra(BUNDLE_KEY_PREFERENCES_XML, xmlPrefId)
- return intent
- }
+ fun createIntent(context: Context?, @XmlRes xmlPrefId: Int): Intent =
+ Intent(context, SettingsPreferencesActivity::class.java).apply {
+ putExtra(BUNDLE_KEY_PREFERENCES_XML, xmlPrefId)
+ }
}
}
\ No newline at end of file
More information about the tor-commits
mailing list