[tor-commits] [orbot/master] Legacy Onion Service Backup/Restore and

n8fr8 at torproject.org n8fr8 at torproject.org
Wed Oct 7 12:37:35 UTC 2020


commit cdb8581ca78d9ec4be707cf88117c29390d9242b
Author: bim <dsnake at protonmail.com>
Date:   Wed Sep 23 11:49:10 2020 -0400

    Legacy Onion Service Backup/Restore and
    Cookie backup/restore works.
    
    Cleaned up many more old resources, styled dialogs
    to match Android conventions.
---
 app-mini/src/main/res/values-ay/strings.xml        |   3 +-
 app-mini/src/main/res/values-be/strings.xml        |   3 +-
 app-mini/src/main/res/values-ca/strings.xml        |   1 -
 app-mini/src/main/res/values-de/strings.xml        |   1 -
 app-mini/src/main/res/values-el/strings.xml        |   1 -
 app-mini/src/main/res/values-es/strings.xml        |   1 -
 app-mini/src/main/res/values-eu/strings.xml        |   1 -
 app-mini/src/main/res/values-fa/strings.xml        |   1 -
 app-mini/src/main/res/values-fr/strings.xml        |   1 -
 app-mini/src/main/res/values-gl/strings.xml        |   1 -
 app-mini/src/main/res/values-he/strings.xml        |   1 -
 app-mini/src/main/res/values-hi/strings.xml        |   1 -
 app-mini/src/main/res/values-hu/strings.xml        |   1 -
 app-mini/src/main/res/values-is/strings.xml        |   1 -
 app-mini/src/main/res/values-it/strings.xml        |   1 -
 app-mini/src/main/res/values-ja/strings.xml        |   1 -
 app-mini/src/main/res/values-mk/strings.xml        |   3 +-
 app-mini/src/main/res/values-nl/strings.xml        |   1 -
 app-mini/src/main/res/values-pt-rBR/strings.xml    |   1 -
 app-mini/src/main/res/values-ru/strings.xml        |   1 -
 app-mini/src/main/res/values-sr/strings.xml        |   1 -
 app-mini/src/main/res/values-sv/strings.xml        |   1 -
 app-mini/src/main/res/values-th/strings.xml        |   1 -
 app-mini/src/main/res/values-tr/strings.xml        |   3 +-
 app-mini/src/main/res/values-uk/strings.xml        |   1 -
 app-mini/src/main/res/values-zh-rTW/strings.xml    |   1 -
 app-mini/src/main/res/values/strings.xml           |   1 -
 app/src/main/AndroidManifest.xml                   |   8 +-
 .../android/ui/dialog/AboutDialogFragment.java     |  21 +--
 .../ui/hiddenservices/ClientCookiesActivity.java   |  76 ++++----
 .../ui/hiddenservices/HiddenServicesActivity.java  |  78 ++++----
 .../adapters/ClientCookiesAdapter.java             |   8 +-
 .../hiddenservices/adapters/OnionListAdapter.java  |  10 +-
 .../ui/hiddenservices/backup/BackupUtils.java      | 200 ++++++++-------------
 .../android/ui/hiddenservices/backup/ZipIt.java    |  37 +++-
 .../ui/hiddenservices/dialogs/AddCookieDialog.java |  35 ++--
 .../dialogs/CookieActionsDialog.java               |  65 ++++---
 .../hiddenservices/dialogs/CookieDeleteDialog.java |  37 ++--
 .../ui/hiddenservices/dialogs/HSActionsDialog.java | 137 +++++++-------
 .../ui/hiddenservices/dialogs/HSCookieDialog.java  |  79 ++++----
 .../ui/hiddenservices/dialogs/HSDataDialog.java    |  63 +++----
 .../ui/hiddenservices/dialogs/HSDeleteDialog.java  |  62 +++----
 .../permissions/PermissionManager.java             |  37 +---
 .../ui/onboarding/CustomBridgesActivity.java       |  14 +-
 .../res/layout/layout_activity_client_cookies.xml  |   5 +-
 .../res/layout/layout_add_client_cookie_dialog.xml |  33 +---
 .../res/layout/layout_client_cookie_list_item.xml  |   2 +-
 app/src/main/res/layout/layout_cookie_actions.xml  |  27 ---
 app/src/main/res/layout/layout_hs_actions.xml      |  36 ----
 app/src/main/res/layout/layout_hs_cookie.xml       |  32 ----
 app/src/main/res/layout/layout_hs_data_dialog.xml  |  36 +---
 app/src/main/res/layout/layout_hs_list_item.xml    |  78 ++++----
 app/src/main/res/layout/layout_hs_list_view.xml    |   5 +-
 app/src/main/res/values-ar/strings.xml             |   4 +-
 app/src/main/res/values-ay/strings.xml             |   7 +-
 app/src/main/res/values-az/strings.xml             |   1 -
 app/src/main/res/values-be/strings.xml             |   7 +-
 app/src/main/res/values-bg/strings.xml             |   1 -
 app/src/main/res/values-bn/strings.xml             |   2 +-
 app/src/main/res/values-brx/strings.xml            |   2 +-
 app/src/main/res/values-bs/strings.xml             |   3 +-
 app/src/main/res/values-ca/strings.xml             |   5 +-
 app/src/main/res/values-cs-rCZ/strings.xml         |   1 -
 app/src/main/res/values-cs/strings.xml             |   3 +-
 app/src/main/res/values-cy/strings.xml             |   1 -
 app/src/main/res/values-da/strings.xml             |   1 -
 app/src/main/res/values-de/strings.xml             |   5 +-
 app/src/main/res/values-el/strings.xml             |   5 +-
 app/src/main/res/values-eo/strings.xml             |   3 +-
 app/src/main/res/values-es-rAR/strings.xml         |   3 +-
 app/src/main/res/values-es/strings.xml             |   5 +-
 app/src/main/res/values-eu/strings.xml             |   5 +-
 app/src/main/res/values-fa/strings.xml             |   7 +-
 app/src/main/res/values-fi/strings.xml             |   1 -
 app/src/main/res/values-fr-rFR/strings.xml         |   1 -
 app/src/main/res/values-fr/strings.xml             |   5 +-
 app/src/main/res/values-gl/strings.xml             |   5 +-
 app/src/main/res/values-gu/strings.xml             |   1 -
 app/src/main/res/values-he/strings.xml             |   7 +-
 app/src/main/res/values-hi/strings.xml             |   5 +-
 app/src/main/res/values-hr/strings.xml             |   1 -
 app/src/main/res/values-hu/strings.xml             |   5 +-
 app/src/main/res/values-hy-rAM/strings.xml         |   2 +-
 app/src/main/res/values-id/strings.xml             |   1 -
 app/src/main/res/values-in-rID/strings.xml         |   1 -
 app/src/main/res/values-in/strings.xml             |   2 +-
 app/src/main/res/values-is/strings.xml             |   5 +-
 app/src/main/res/values-it/strings.xml             |   5 +-
 app/src/main/res/values-iw/strings.xml             |   1 -
 app/src/main/res/values-ja/strings.xml             |   5 +-
 app/src/main/res/values-kn/strings.xml             |   2 +-
 app/src/main/res/values-ko/strings.xml             |   1 -
 app/src/main/res/values-lt/strings.xml             |   1 -
 app/src/main/res/values-lv/strings.xml             |   1 -
 app/src/main/res/values-mk/strings.xml             |   7 +-
 app/src/main/res/values-ml/strings.xml             |   2 +-
 app/src/main/res/values-my/strings.xml             |   3 +-
 app/src/main/res/values-nb/strings.xml             |   4 +-
 app/src/main/res/values-nl/strings.xml             |   5 +-
 app/src/main/res/values-pl/strings.xml             |   1 -
 app/src/main/res/values-pt-rBR/strings.xml         |   5 +-
 app/src/main/res/values-pt-rPT/strings.xml         |   1 -
 app/src/main/res/values-pt/strings.xml             |   1 -
 app/src/main/res/values-ro/strings.xml             |   1 -
 app/src/main/res/values-ru/strings.xml             |   5 +-
 app/src/main/res/values-si-rLK/strings.xml         |   1 -
 app/src/main/res/values-sk/strings.xml             |   1 -
 app/src/main/res/values-sl/strings.xml             |   1 -
 app/src/main/res/values-sn/strings.xml             |   2 +-
 app/src/main/res/values-sq/strings.xml             |   1 -
 app/src/main/res/values-sr/strings.xml             |   5 +-
 app/src/main/res/values-sv/strings.xml             |   5 +-
 app/src/main/res/values-ta/strings.xml             |   1 -
 app/src/main/res/values-th/strings.xml             |   5 +-
 app/src/main/res/values-tl/strings.xml             |   1 -
 app/src/main/res/values-tr/strings.xml             |   7 +-
 app/src/main/res/values-uk/strings.xml             |   5 +-
 app/src/main/res/values-ur/strings.xml             |   2 +-
 app/src/main/res/values-uz/strings.xml             |   2 +-
 app/src/main/res/values-vi/strings.xml             |   1 -
 app/src/main/res/values-zh-rCN/strings.xml         |   1 -
 app/src/main/res/values-zh-rTW/strings.xml         |   5 +-
 app/src/main/res/values/strings.xml                |   4 +-
 .../org/torproject/android/core/ClipboardUtils.kt  |  17 ++
 .../java/org/torproject/android/core/DiskUtils.kt  |  39 +++-
 .../android/core/ui/SettingsPreferencesActivity.kt |  10 +-
 126 files changed, 594 insertions(+), 942 deletions(-)

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





More information about the tor-commits mailing list