[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [orbot/master] Legacy Onion Service Backup/Restore and
commit cdb8581ca78d9ec4be707cf88117c29390d9242b
Author: bim <dsnake@xxxxxxxxxxxxxx>
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
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits