From 1758c2c9f16c9d535157b526a53b42a2ecee7ef7 Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner <hans@eds.org>
Date: Tue, 6 Apr 2021 17:49:53 +0200
Subject: [PATCH 1/7] when no internet and local repos, only update local repos

closes #2146
---
 .../main/java/org/fdroid/fdroid/UpdateService.java  | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/app/src/main/java/org/fdroid/fdroid/UpdateService.java b/app/src/main/java/org/fdroid/fdroid/UpdateService.java
index fa866259f..5443982fb 100644
--- a/app/src/main/java/org/fdroid/fdroid/UpdateService.java
+++ b/app/src/main/java/org/fdroid/fdroid/UpdateService.java
@@ -404,22 +404,23 @@ public class UpdateService extends JobIntentService {
             if (isLocalRepoAddress(address)) {
                 Utils.debugLog(TAG, "skipping internet check, this is local: " + address);
             } else if (netState == ConnectivityMonitorService.FLAG_NET_UNAVAILABLE) {
-                boolean foundLocalRepo = false;
+                // keep track of repos that have a local copy in case internet is not available
+                ArrayList<Repo> localRepos = new ArrayList<>();
                 for (Repo repo : repos) {
                     if (isLocalRepoAddress(repo.address)) {
-                        foundLocalRepo = true;
+                        localRepos.add(repo);
                     } else {
                         for (String mirrorAddress : repo.getMirrorList()) {
                             if (isLocalRepoAddress(mirrorAddress)) {
-                                foundLocalRepo = true;
-                                //localRepos.add(repo);
-                                //FDroidApp.setLastWorkingMirror(repo.getId(), mirrorAddress);
+                                localRepos.add(repo);
                                 break;
                             }
                         }
                     }
                 }
-                if (!foundLocalRepo) {
+                if (localRepos.size() > 0) {
+                    repos = localRepos;
+                } else {
                     Utils.debugLog(TAG, "No internet, cannot update");
                     if (manualUpdate) {
                         Utils.showToastFromService(this, getString(R.string.warning_no_internet), Toast.LENGTH_SHORT);

From f39fc1386a69d66f6cea7dc3d21c26a137481d4e Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner <hans@eds.org>
Date: Tue, 6 Apr 2021 20:53:53 +0200
Subject: [PATCH 2/7] synchronized getNewMirrorOnError() for safe writing of
 numTries

`volatile` allows for safe multi-threaded reading, `synchronized` allows
for safe multi-threaded writing.
---
 app/src/main/java/org/fdroid/fdroid/FDroidApp.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/src/main/java/org/fdroid/fdroid/FDroidApp.java b/app/src/main/java/org/fdroid/fdroid/FDroidApp.java
index 4c6ab97bd..c35142c1b 100644
--- a/app/src/main/java/org/fdroid/fdroid/FDroidApp.java
+++ b/app/src/main/java/org/fdroid/fdroid/FDroidApp.java
@@ -267,7 +267,7 @@ public class FDroidApp extends Application implements androidx.work.Configuratio
      * @see #getTimeout()
      * @see Repo#getRandomMirror(String)
      */
-    public static String getNewMirrorOnError(@Nullable String urlString, Repo repo2) throws IOException {
+    public static synchronized String getNewMirrorOnError(@Nullable String urlString, Repo repo2) throws IOException {
         if (repo2.hasMirrors()) {
             if (numTries <= 0) {
                 if (timeout == Downloader.DEFAULT_TIMEOUT) {

From d9a86d4c16478ddb54953ad521c5b7b7a0cd9fd5 Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner <hans@eds.org>
Date: Tue, 13 Apr 2021 13:58:14 +0200
Subject: [PATCH 3/7] rename: update_notification_title -->
 banner_updating_repositories

---
 app/src/main/java/org/fdroid/fdroid/UpdateService.java          | 2 +-
 .../main/java/org/fdroid/fdroid/views/BannerUpdatingRepos.java  | 2 +-
 app/src/main/res/values-af/strings.xml                          | 2 +-
 app/src/main/res/values-ar/strings.xml                          | 2 +-
 app/src/main/res/values-ast/strings.xml                         | 2 +-
 app/src/main/res/values-be/strings.xml                          | 2 +-
 app/src/main/res/values-bg/strings.xml                          | 2 +-
 app/src/main/res/values-bo/strings.xml                          | 2 +-
 app/src/main/res/values-ca/strings.xml                          | 2 +-
 app/src/main/res/values-cs/strings.xml                          | 2 +-
 app/src/main/res/values-cy/strings.xml                          | 2 +-
 app/src/main/res/values-da/strings.xml                          | 2 +-
 app/src/main/res/values-de/strings.xml                          | 2 +-
 app/src/main/res/values-el/strings.xml                          | 2 +-
 app/src/main/res/values-en-rGB/strings.xml                      | 2 +-
 app/src/main/res/values-eo/strings.xml                          | 2 +-
 app/src/main/res/values-es-rAR/strings.xml                      | 2 +-
 app/src/main/res/values-es/strings.xml                          | 2 +-
 app/src/main/res/values-et/strings.xml                          | 2 +-
 app/src/main/res/values-eu/strings.xml                          | 2 +-
 app/src/main/res/values-fa/strings.xml                          | 2 +-
 app/src/main/res/values-fi/strings.xml                          | 2 +-
 app/src/main/res/values-fr/strings.xml                          | 2 +-
 app/src/main/res/values-gl/strings.xml                          | 2 +-
 app/src/main/res/values-he/strings.xml                          | 2 +-
 app/src/main/res/values-hi/strings.xml                          | 2 +-
 app/src/main/res/values-hr/strings.xml                          | 2 +-
 app/src/main/res/values-hu/strings.xml                          | 2 +-
 app/src/main/res/values-hy/strings.xml                          | 2 +-
 app/src/main/res/values-id/strings.xml                          | 2 +-
 app/src/main/res/values-is/strings.xml                          | 2 +-
 app/src/main/res/values-it/strings.xml                          | 2 +-
 app/src/main/res/values-ja/strings.xml                          | 2 +-
 app/src/main/res/values-kab/strings.xml                         | 2 +-
 app/src/main/res/values-kn/strings.xml                          | 2 +-
 app/src/main/res/values-ko/strings.xml                          | 2 +-
 app/src/main/res/values-lt/strings.xml                          | 2 +-
 app/src/main/res/values-mk/strings.xml                          | 2 +-
 app/src/main/res/values-ml/strings.xml                          | 2 +-
 app/src/main/res/values-mn/strings.xml                          | 2 +-
 app/src/main/res/values-mr/strings.xml                          | 2 +-
 app/src/main/res/values-my/strings.xml                          | 2 +-
 app/src/main/res/values-nb/strings.xml                          | 2 +-
 app/src/main/res/values-nl-rBE/strings.xml                      | 2 +-
 app/src/main/res/values-nl/strings.xml                          | 2 +-
 app/src/main/res/values-nn/strings.xml                          | 2 +-
 app/src/main/res/values-pl/strings.xml                          | 2 +-
 app/src/main/res/values-pt-rBR/strings.xml                      | 2 +-
 app/src/main/res/values-pt-rPT/strings.xml                      | 2 +-
 app/src/main/res/values-pt/strings.xml                          | 2 +-
 app/src/main/res/values-ro/strings.xml                          | 2 +-
 app/src/main/res/values-ru/strings.xml                          | 2 +-
 app/src/main/res/values-sc/strings.xml                          | 2 +-
 app/src/main/res/values-sk/strings.xml                          | 2 +-
 app/src/main/res/values-sl/strings.xml                          | 2 +-
 app/src/main/res/values-sn/strings.xml                          | 2 +-
 app/src/main/res/values-sq/strings.xml                          | 2 +-
 app/src/main/res/values-sr/strings.xml                          | 2 +-
 app/src/main/res/values-sv/strings.xml                          | 2 +-
 app/src/main/res/values-te/strings.xml                          | 2 +-
 app/src/main/res/values-th/strings.xml                          | 2 +-
 app/src/main/res/values-tr/strings.xml                          | 2 +-
 app/src/main/res/values-uk/strings.xml                          | 2 +-
 app/src/main/res/values-vi/strings.xml                          | 2 +-
 app/src/main/res/values-zh-rCN/strings.xml                      | 2 +-
 app/src/main/res/values-zh-rHK/strings.xml                      | 2 +-
 app/src/main/res/values-zh-rTW/strings.xml                      | 2 +-
 app/src/main/res/values/strings.xml                             | 2 +-
 68 files changed, 68 insertions(+), 68 deletions(-)

diff --git a/app/src/main/java/org/fdroid/fdroid/UpdateService.java b/app/src/main/java/org/fdroid/fdroid/UpdateService.java
index 5443982fb..0d06c3e0d 100644
--- a/app/src/main/java/org/fdroid/fdroid/UpdateService.java
+++ b/app/src/main/java/org/fdroid/fdroid/UpdateService.java
@@ -264,7 +264,7 @@ public class UpdateService extends JobIntentService {
                 .setSmallIcon(R.drawable.ic_refresh)
                 .setOngoing(true)
                 .setCategory(NotificationCompat.CATEGORY_SERVICE)
-                .setContentTitle(getString(R.string.update_notification_title));
+                .setContentTitle(getString(R.string.banner_updating_repositories));
         appUpdateStatusManager = AppUpdateStatusManager.getInstance(this);
     }
 
diff --git a/app/src/main/java/org/fdroid/fdroid/views/BannerUpdatingRepos.java b/app/src/main/java/org/fdroid/fdroid/views/BannerUpdatingRepos.java
index eacf581b7..a93d89a79 100644
--- a/app/src/main/java/org/fdroid/fdroid/views/BannerUpdatingRepos.java
+++ b/app/src/main/java/org/fdroid/fdroid/views/BannerUpdatingRepos.java
@@ -33,7 +33,7 @@ public class BannerUpdatingRepos extends androidx.appcompat.widget.AppCompatText
         setPadding(padding, padding, padding, padding);
         setBackgroundColor(0xFF4A4A4A);
         setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);
-        setText(R.string.update_notification_title);
+        setText(R.string.banner_updating_repositories);
         setTextColor(0xFFFFFFFF);
     }
 
diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml
index fccf35bb4..e36618409 100644
--- a/app/src/main/res/values-af/strings.xml
+++ b/app/src/main/res/values-af/strings.xml
@@ -115,7 +115,7 @@
     <string name="proxy_host_summary">Jou proxy se hostnaam (bv. 127.0.0.1)</string>
     <string name="proxy_port">Proxypoort</string>
     <string name="proxy_port_summary">Jou proxy se poortnommer (bv. 8118)</string>
-    <string name="update_notification_title">Opdatering van argiewe</string>
+    <string name="banner_updating_repositories">Opdatering van argiewe</string>
     <string name="status_processing_xml_percent">Besig met %2$s / %3$s (%4$d%%) van %1$s</string>
     <string name="status_connecting_to_repo">Koppel tans aan
 \n%1$s</string>
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 6f39f884a..3793a3235 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -135,7 +135,7 @@
     <string name="proxy_port_summary">رقم منفذ البروكسي الخاص بك (مثلا 8118)</string>
     <string name="status_download">تحميل\n%2$s / %3$s (%4$d%%) من\n%1$s</string>
     <string name="status_download_unknown_size">تحميل\n%2$s من\n%1$s</string>
-    <string name="update_notification_title">تحديث المستودعات</string>
+    <string name="banner_updating_repositories">تحديث المستودعات</string>
     <string name="status_processing_xml_percent">تجهيز %2$s / %3$s (%4$d%%) مِن %1$s</string>
     <string name="status_connecting_to_repo">جارٍ الاتصال ب
 \n %1$s</string>
diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml
index f036899f9..8e880240e 100644
--- a/app/src/main/res/values-ast/strings.xml
+++ b/app/src/main/res/values-ast/strings.xml
@@ -170,7 +170,7 @@
     <string name="bad_fingerprint">Buelga incorreuta</string>
     <string name="invalid_url">Esto nun ye una URL válida.</string>
     <string name="menu_changelog">Rexistru de cambeos</string>
-    <string name="update_notification_title">Anovando depósitos</string>
+    <string name="banner_updating_repositories">Anovando depósitos</string>
     <string name="pref_language">Llingua</string>
     <string name="pref_language_default">La del sistema</string>
     <string name="wifi">Wi-Fi</string>
diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml
index 444380cf5..25bfcb7b1 100644
--- a/app/src/main/res/values-be/strings.xml
+++ b/app/src/main/res/values-be/strings.xml
@@ -128,7 +128,7 @@
     <string name="status_download_unknown_size">Спампоўванне
 \n%2$s з
 \n%1$s</string>
-    <string name="update_notification_title">Абнаўленне рэпазіторыяў</string>
+    <string name="banner_updating_repositories">Абнаўленне рэпазіторыяў</string>
     <string name="status_processing_xml_percent">Апрацоўка %2$s / %3$s (%4$d%%) з %1$s</string>
     <string name="status_connecting_to_repo">Злучэнне з
 \n%1$s</string>
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index 99d2af0e2..d48547536 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -156,7 +156,7 @@
     <string name="interval_2w">През 2 седмици</string>
     <string name="downloading">Сваляне…</string>
     <string name="about_source">Изходен код</string>
-    <string name="update_notification_title">Обновяване на хранилищата</string>
+    <string name="banner_updating_repositories">Обновяване на хранилищата</string>
     <string name="install_error_unknown">Инсталирането се провали поради неизвестна грешка</string>
     <string name="uninstall_error_unknown">Деинсталирането се провали поради неизвестна грешка</string>
     <string name="swap_choose_apps">Изберете приложения</string>
diff --git a/app/src/main/res/values-bo/strings.xml b/app/src/main/res/values-bo/strings.xml
index 35953459e..e05ea4e5c 100644
--- a/app/src/main/res/values-bo/strings.xml
+++ b/app/src/main/res/values-bo/strings.xml
@@ -183,7 +183,7 @@
 \n%2$s ནས་
 \n%1$s</string>
     <string name="download_404">རེ་སྐུལ་ཞུས་པའི་ཡིག་ཆ་དེ་རྙེད་མ་སོང་།</string>
-    <string name="update_notification_title">མཛོད་ཁང་རྣམས་གསར་བསྒྱུར་བྱེད་བཞིན་པ།</string>
+    <string name="banner_updating_repositories">མཛོད་ཁང་རྣམས་གསར་བསྒྱུར་བྱེད་བཞིན་པ།</string>
     <string name="status_connecting_to_repo">%1$s འདིར་མཐུད་བཞིན་པ།</string>
     <string name="repos_unchanged">མཛོད་ཁང་ཚང་མ་དུས་ཐོག་ཏུ་ཡོད།</string>
     <string name="all_other_repos_fine">རེ་པོ་གཞན་དག་ཚང་མར་སྐྱོན་ཤོར་མིན་འདུག</string>
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 04406c046..3740aa2cc 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -154,7 +154,7 @@
     <string name="menu_bitcoin">Bitcoin</string>
     <string name="menu_litecoin">Litecoin</string>
     <string name="menu_flattr">Flattr</string>
-    <string name="update_notification_title">Actualitzant els dipòsits</string>
+    <string name="banner_updating_repositories">Actualitzant els dipòsits</string>
     <string name="more">Més</string>
     <string name="less">Menys</string>
     <string name="permissions">Permisos</string>
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 558b40d32..c2c348434 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -145,7 +145,7 @@
     <string name="menu_litecoin">Litecoin</string>
     <string name="menu_flattr">Flattr</string>
     <string name="status_download_unknown_size">Stahování\n%2$s z\n%1$s</string>
-    <string name="update_notification_title">Aktualizace repozitářů</string>
+    <string name="banner_updating_repositories">Aktualizace repozitářů</string>
     <string name="status_processing_xml_percent">Zpracovávání %2$s / %3$s (%4$d%%) z %1$s</string>
     <string name="all_other_repos_fine">Žádné jiné repozitáře nenahlásily chyby.</string>
     <string name="permissions">Oprávnění</string>
diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml
index 5b3061c68..c3828723d 100644
--- a/app/src/main/res/values-cy/strings.xml
+++ b/app/src/main/res/values-cy/strings.xml
@@ -237,7 +237,7 @@
 \n%2$s o
 \n%1$s</string>
     <string name="download_404">Ni chanfuwyd y ffeil honno.</string>
-    <string name="update_notification_title">Yn diweddaru ystorfeydd</string>
+    <string name="banner_updating_repositories">Yn diweddaru ystorfeydd</string>
     <string name="status_processing_xml_percent">Yn prosesu %2$s / %3$s (%4$d%%) o %1$s</string>
     <string name="status_connecting_to_repo">Yn cysylltu â
 \n%1$s</string>
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 19e984cdb..8dd1acd0a 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -108,7 +108,7 @@
     <string name="proxy_port_summary">Proxy portnummer (e.g. 8118)</string>
     <string name="status_download">Henter\n%2$s / %3$s (%4$d%%) fra\n%1$s</string>
     <string name="status_download_unknown_size">Henter\n%2$s fra\n%1$s</string>
-    <string name="update_notification_title">Opdaterer depoter</string>
+    <string name="banner_updating_repositories">Opdaterer depoter</string>
     <string name="status_processing_xml_percent">Behandler %2$s / %3$s (%4$d%%) fra %1$s</string>
     <string name="status_connecting_to_repo">Forbinder til\n%1$s</string>
     <string name="status_inserting_apps">Gemmer app-detaljer</string>
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index cac67e025..62953be0b 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -146,7 +146,7 @@
     <string name="back">Zurück</string>
     <string name="bad_fingerprint">Falscher Fingerabdruck</string>
     <string name="invalid_url">Das ist keine gültige Adresse.</string>
-    <string name="update_notification_title">Paketquellenaktualisierung</string>
+    <string name="banner_updating_repositories">Paketquellenaktualisierung</string>
     <string name="pref_language">Sprache</string>
     <string name="pref_language_default">Systemstandard</string>
     <string name="wifi">WLAN</string>
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 544359d0c..ab9faed63 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -134,7 +134,7 @@
     <string name="status_download_unknown_size">Λήψη
 \n%2$s από
 \n%1$s</string>
-    <string name="update_notification_title">Ενημέρωση αποθετηρίων</string>
+    <string name="banner_updating_repositories">Ενημέρωση αποθετηρίων</string>
     <string name="status_processing_xml_percent">Επεξεργασία %2$s / %3$s (%4$d%%) από %1$s</string>
     <string name="repos_unchanged">Όλα τα αποθετήρια είναι ενημερωμένα</string>
     <string name="all_other_repos_fine">Τα υπόλοιπα αποθετήρια δεν δημιούργησαν σφάλματα.</string>
diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml
index 966a8886a..fd22192ae 100644
--- a/app/src/main/res/values-en-rGB/strings.xml
+++ b/app/src/main/res/values-en-rGB/strings.xml
@@ -206,7 +206,7 @@
     <string name="status_inserting_x_apps">Saving app details (%1$d/%2$d) from %3$s</string>
     <string name="status_connecting_to_repo">Connecting to
 \n%1$s</string>
-    <string name="update_notification_title">Updating repositories</string>
+    <string name="banner_updating_repositories">Updating repositories</string>
     <string name="download_404">The requested file was not found.</string>
     <string name="status_download_unknown_size">Downloading
 \n%2$s from
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index c90d4520d..6801f6c30 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -141,7 +141,7 @@
     <string name="status_download_unknown_size">Elŝutado
 \n%2$s el
 \n%1$s</string>
-    <string name="update_notification_title">Ĝisdatigado de deponejoj</string>
+    <string name="banner_updating_repositories">Ĝisdatigado de deponejoj</string>
     <string name="status_processing_xml_percent">Prilaborado de %2$s / %3$s (%4$d%%) el %1$s</string>
     <string name="status_connecting_to_repo">Konektado al
 \n%1$s</string>
diff --git a/app/src/main/res/values-es-rAR/strings.xml b/app/src/main/res/values-es-rAR/strings.xml
index 20abf7c55..26826c4b6 100644
--- a/app/src/main/res/values-es-rAR/strings.xml
+++ b/app/src/main/res/values-es-rAR/strings.xml
@@ -287,7 +287,7 @@
 \n%2$s desde
 \n%1$s</string>
     <string name="download_404">El archivo pedido no fue encontrado.</string>
-    <string name="update_notification_title">Actualizando repositorios</string>
+    <string name="banner_updating_repositories">Actualizando repositorios</string>
     <string name="status_processing_xml_percent">Procesando %2$s / %3$s (%4$d%%) de %1$s</string>
     <string name="status_connecting_to_repo">Conectando a 
 \n%1$s</string>
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 8d7665333..acf7c25d9 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -147,7 +147,7 @@
     <string name="bad_fingerprint">Huella digital incorrecta</string>
     <string name="invalid_url">No es una URL válida.</string>
     <string name="menu_changelog">Historial de cambios</string>
-    <string name="update_notification_title">Actualizando repositorios</string>
+    <string name="banner_updating_repositories">Actualizando repositorios</string>
     <string name="status_processing_xml_percent">Procesando %2$s / %3$s (%4$d%%) desde %1$s</string>
     <string name="pref_language">Idioma</string>
     <string name="pref_language_default">Predeterminado del sistema</string>
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
index fe89d6bbc..9a7b50505 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -70,7 +70,7 @@
     <string name="adding_apks_format">%s lisatakse hoidlasse…</string>
     <string name="linking_apks">APK faile lingitakse hoidlasse…</string>
     <string name="copying_icons">Rakenduste ikoone kopeeritakse hoidlasse…</string>
-    <string name="update_notification_title">Hoidlaid värskendatakse</string>
+    <string name="banner_updating_repositories">Hoidlaid värskendatakse</string>
     <string name="repos_unchanged">Kõik hoidlad on kaasajastaud</string>
     <string name="all_other_repos_fine">Kõik ülejäänud hoidlad vigu ei põhjustanud.</string>
     <string name="repo_details">Hoidla</string>
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index 6de294462..173d412c2 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -121,7 +121,7 @@
     <string name="copying_icons">Aplikazioen ikonoak biltegira kopiatzen…</string>
     <string name="proxy_host">Proxy ostalaria</string>
     <string name="enable_proxy_summary">Konfiguratu HTTP Proxya sare eskari guztientzat</string>
-    <string name="update_notification_title">Biltegiak eguneratzen</string>
+    <string name="banner_updating_repositories">Biltegiak eguneratzen</string>
     <string name="repos_unchanged">Biltegi guztiak egunean daude</string>
     <string name="all_other_repos_fine">Beste biltegiek ez dute errorerik sortu.</string>
     <string name="global_error_updating_repos">Errorea eguneratzean: %s</string>
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index 3983247c0..4a23ad00f 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -118,7 +118,7 @@
     <string name="proxy_port">درگاه پروکسی</string>
     <string name="proxy_port_summary">شمارهٔ درگاه پروکسی (مثلاً 8118)</string>
     <string name="status_download_unknown_size">در حال بارگیری\n%2$s از\n%1$s</string>
-    <string name="update_notification_title">در حال به‌روز رسانی مخزن‌ها</string>
+    <string name="banner_updating_repositories">در حال به‌روز رسانی مخزن‌ها</string>
     <string name="status_processing_xml_percent">در حال پردازش %2$s / %3$s (%4$d%%) از %1$s</string>
     <string name="status_inserting_apps">در حال ذخیرهٔ جزئیات برنامه</string>
     <string name="repos_unchanged">تمام مخزن‌ها به‌روز هستند</string>
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index cff787e32..594fa7a92 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -163,7 +163,7 @@
     <string name="show_incompat_versions_on">Näytä sovellusversiot, jotka eivät ole yhteensopivia laitteesi kanssa</string>
     <string name="useTor">Käytä Tor-verkkoa</string>
     <string name="useTorSummary">Pakota latausliikenne Tor-verkon kautta yksityisyyden lisäämiseksi. Vaatii Orbotin</string>
-    <string name="update_notification_title">Päivitetään sovelluslähteitä</string>
+    <string name="banner_updating_repositories">Päivitetään sovelluslähteitä</string>
     <string name="status_inserting_apps">Tallennetaan sovelluksen tietoja</string>
     <string name="no_permissions">Ei käyttöoikeuksia</string>
     <string name="permissions">Käyttöluvat</string>
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 2d589870d..e8f9ad5a6 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -148,7 +148,7 @@
     <string name="bad_fingerprint">Mauvaise empreinte</string>
     <string name="invalid_url">Ceci n\'est pas une URL valide.</string>
     <string name="menu_changelog">Journal des changements</string>
-    <string name="update_notification_title">Mise à jour des dépôts</string>
+    <string name="banner_updating_repositories">Mise à jour des dépôts</string>
     <string name="pref_language">Langue</string>
     <string name="pref_language_default">Langue du système</string>
     <string name="wifi">Wi-Fi</string>
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 6821a7842..ec99256b9 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -104,7 +104,7 @@
     <string name="status_download_unknown_size">Estase a baixar 
 \n%2$s dende 
 \n%1$s</string>
-    <string name="update_notification_title">Estanse a actualizar os repositorios</string>
+    <string name="banner_updating_repositories">Estanse a actualizar os repositorios</string>
     <string name="status_processing_xml_percent">Estase a procesar %2$s / %3$s (%4$d%%) dende %1$s</string>
     <string name="repos_unchanged">Tódolos repositorios están actualizados</string>
     <string name="all_other_repos_fine">Os demais repositorios non xeraron erros.</string>
diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml
index cf3acae1a..0e671a196 100644
--- a/app/src/main/res/values-he/strings.xml
+++ b/app/src/main/res/values-he/strings.xml
@@ -92,7 +92,7 @@
     <string name="status_download">מתבצעת הורדה 
 \n%2$s / %3$s (%4$d%%) מתוך 
 \n%1$s</string>
-    <string name="update_notification_title">המאגרים מתעדכנים</string>
+    <string name="banner_updating_repositories">המאגרים מתעדכנים</string>
     <string name="status_processing_xml_percent">%2$s בהליכי עיבוד / %3$s (%4$d%%) מתוך %1$s</string>
     <string name="status_connecting_to_repo">מתבצעת התחברות אל 
 \n%1$s</string>
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index b6b9be66e..c34084365 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -239,7 +239,7 @@
     <string name="status_download_unknown_size">डाउनलोड कर रहा है
 \n%2$s से
 \n%1$s</string>
-    <string name="update_notification_title">रिपोजिटरी को अपडेट करना</string>
+    <string name="banner_updating_repositories">रिपोजिटरी को अपडेट करना</string>
     <string name="no_permissions">कोई अनुमति नहीं</string>
     <string name="permissions">अनुमतियां</string>
     <string name="no_handler_app">आपके पास कोई भी उपलब्ध ऐप नहीं है जो %s को संभाल सके।</string>
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 375fbec8e..8a80718a5 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -118,7 +118,7 @@
     <string name="proxy_port_summary">Broj priključka Vašeg proxyja (npr. 8118)</string>
     <string name="status_download">Preuzimam\n%2$s / %3$s (%4$d%%) sa\n%1$s</string>
     <string name="status_download_unknown_size">Preuzimam\n%2$s sa\n%1$s</string>
-    <string name="update_notification_title">Ažuriram repozitorije</string>
+    <string name="banner_updating_repositories">Ažuriram repozitorije</string>
     <string name="status_processing_xml_percent">Obrađujem %2$s / %3$s (%4$d%%) od %1$s</string>
     <string name="status_connecting_to_repo">Spajam se na\n%1$s</string>
     <string name="status_inserting_apps">Spremanje detalja aplikacije</string>
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 3aa3d986e..d360e5b73 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -116,7 +116,7 @@
     <string name="unsigned">Aláíratlan</string>
     <string name="unverified">Megerősítetlen</string>
     <string name="repo_details">Tároló</string>
-    <string name="update_notification_title">Tárolók frissítése</string>
+    <string name="banner_updating_repositories">Tárolók frissítése</string>
     <string name="repos_unchanged">Minden tároló naprakész</string>
     <string name="repo_url">Cím</string>
     <string name="repo_num_apps">Alkalmazások száma</string>
diff --git a/app/src/main/res/values-hy/strings.xml b/app/src/main/res/values-hy/strings.xml
index eb6ccf799..548a808ef 100644
--- a/app/src/main/res/values-hy/strings.xml
+++ b/app/src/main/res/values-hy/strings.xml
@@ -188,7 +188,7 @@
     <string name="menu_upgrade">Թարմացնել</string>
     <string name="main_menu__latest_apps">Ամենանորը</string>
     <string name="adding_apks_format">Ավելացնում եմ %s շտեմարանին…</string>
-    <string name="update_notification_title">Թարմացնում եմ շտեմարանները</string>
+    <string name="banner_updating_repositories">Թարմացնում եմ շտեմարանները</string>
     <string name="repos_unchanged">Բոլոր շտեմարանները արդի են</string>
     <string name="repo_details">Շտեմարան</string>
     <string name="repo_not_yet_updated">Այս շտեմարանը դեռևս չի օգտագործվել։
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index 139025863..3ef4c9f67 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -102,7 +102,7 @@
     <string name="status_download_unknown_size">Mengunduh
 \n%2$s dari
 \n%1$s</string>
-    <string name="update_notification_title">Memperbarui repositori</string>
+    <string name="banner_updating_repositories">Memperbarui repositori</string>
     <string name="status_processing_xml_percent">Memproses %2$s / %3$s (%4$d%%) dari %1$s</string>
     <string name="status_connecting_to_repo">Menghubungkan ke
 \n%1$s</string>
diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml
index 47a6e1025..9ead97937 100644
--- a/app/src/main/res/values-is/strings.xml
+++ b/app/src/main/res/values-is/strings.xml
@@ -99,7 +99,7 @@
     <string name="status_download_unknown_size">Sæki
 \n%2$s frá
 \n%1$s</string>
-    <string name="update_notification_title">Uppfæri hugbúnaðarsöfn</string>
+    <string name="banner_updating_repositories">Uppfæri hugbúnaðarsöfn</string>
     <string name="status_processing_xml_percent">Meðhöndla %2$s / %3$s (%4$d%%) frá %1$s</string>
     <string name="status_connecting_to_repo">Tengist við
 \n%1$s</string>
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index a90d761e3..c481f41b4 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -208,7 +208,7 @@
     <string name="menu_changelog">Cronologia</string>
     <string name="menu_litecoin">Litecoin</string>
     <string name="menu_flattr">Flattr</string>
-    <string name="update_notification_title">Aggiornamento dei repository</string>
+    <string name="banner_updating_repositories">Aggiornamento dei repository</string>
     <string name="status_processing_xml_percent">Elaborazione %2$s/%3$s (%4$d%%) di %1$s</string>
     <string name="status_inserting_apps">Salvataggio dettagli applicazione</string>
     <string name="repo_details">Repository</string>
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 61ecef13f..682f3af8f 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -141,7 +141,7 @@
     <string name="bad_fingerprint">フィンガープリントが間違っています</string>
     <string name="invalid_url">有効なURLではありません。</string>
     <string name="menu_changelog">変更履歴</string>
-    <string name="update_notification_title">リポジトリを更新中</string>
+    <string name="banner_updating_repositories">リポジトリを更新中</string>
     <string name="status_processing_xml_percent">%1$sから%2$s/%3$s(%4$d%%)処理中</string>
     <string name="pref_language">言語</string>
     <string name="pref_language_default">システムの既定</string>
diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml
index 4d871df8c..c69791996 100644
--- a/app/src/main/res/values-kab/strings.xml
+++ b/app/src/main/res/values-kab/strings.xml
@@ -210,7 +210,7 @@
 \n%2$s si
 \n%1$s</string>
     <string name="download_404">Afaylu i tettnadiḍ ulac-it.</string>
-    <string name="update_notification_title">Aleqqem n ikufiyen</string>
+    <string name="banner_updating_repositories">Aleqqem n ikufiyen</string>
     <string name="status_connecting_to_repo">Tuqna γer
 \n%1$s</string>
     <string name="global_error_updating_repos">Tuccḍa di uleqqem: %s</string>
diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml
index 1ae885d96..2603db4d1 100644
--- a/app/src/main/res/values-kn/strings.xml
+++ b/app/src/main/res/values-kn/strings.xml
@@ -459,7 +459,7 @@
     <string name="status_inserting_x_apps">ಅಪ್ಲಿಕೇಶನ್ ವಿವರಗಳನ್ನು (%1$d /%2$d) %3$s ನಿಂದ ಉಳಿಸಲಾಗುತ್ತಿದೆ</string>
     <string name="status_connecting_to_repo">ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ
 \n%1$s</string>
-    <string name="update_notification_title">ರೆಪೊಸಿಟರಿಗಳನ್ನು ನವೀಕರಿಸಲಾಗುತ್ತಿದೆ</string>
+    <string name="banner_updating_repositories">ರೆಪೊಸಿಟರಿಗಳನ್ನು ನವೀಕರಿಸಲಾಗುತ್ತಿದೆ</string>
     <string name="download_404">ವಿನಂತಿಸಿದ ಫೈಲ್ ಕಂಡುಬಂದಿಲ್ಲ.</string>
     <string name="status_download_unknown_size">ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ
 \n%2$s ನಿಂದ
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index c7191cf51..c9e50a29a 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -161,7 +161,7 @@
     <string name="status_download_unknown_size">%1$s에서
 \n%2$s
 \n다운로드 중</string>
-    <string name="update_notification_title">저장소 업데이트 중</string>
+    <string name="banner_updating_repositories">저장소 업데이트 중</string>
     <string name="status_processing_xml_percent">%1$s에서 %2$s / %3$s (%4$d%%) 처리 중</string>
     <string name="status_inserting_apps">앱 자세한 사항 저장 중</string>
     <string name="permissions">권한</string>
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 084a2a953..8deea5e1f 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -157,7 +157,7 @@
     <string name="hide_on_long_search_press_title">Paslėpti su paieškos mygtuku</string>
     <string name="hide_on_long_search_press_summary">Ilgai palaikus paieškos mygtuka programa bus paslėpta</string>
     <string name="download_404">Užklaustas failas nebuvo rastas.</string>
-    <string name="update_notification_title">Atnaujinamos saugyklos</string>
+    <string name="banner_updating_repositories">Atnaujinamos saugyklos</string>
     <string name="status_inserting_x_apps">Saugojama programos informacija (%1$d/%2$d) nuo %3$s</string>
     <string name="all_other_repos_fine">Visos kitos saugyklos nesukūrė klaidų.</string>
     <string name="no_permissions">Nėra leidimų</string>
diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml
index 8b95f2ddf..860cecf49 100644
--- a/app/src/main/res/values-mk/strings.xml
+++ b/app/src/main/res/values-mk/strings.xml
@@ -46,7 +46,7 @@
     <string name="status_inserting_x_apps">Зачувување детали за апликацијата (%1$d/%2$d) од %3$s</string>
     <string name="status_connecting_to_repo">Поврзување со
 \n%1$s</string>
-    <string name="update_notification_title">Ажурирање на складиштата</string>
+    <string name="banner_updating_repositories">Ажурирање на складиштата</string>
     <string name="download_404">Бараната датотека не е пронајдена.</string>
     <string name="hide_on_long_search_press_summary">Долго притискање на копчето за пребарување ќе ја скрие апликацијата</string>
     <string name="hide_on_long_search_press_title">Сокриј со копчето за пребарување</string>
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
index 75ad0bd9d..24d571823 100644
--- a/app/src/main/res/values-ml/strings.xml
+++ b/app/src/main/res/values-ml/strings.xml
@@ -195,7 +195,7 @@
 \n %2$s നെ 
 \n %1$s ല്‍ നിന്ന്</string>
     <string name="download_404">അഭ്യർത്ഥിച്ച ഫയൽ കണ്ടെത്തിയില്ല.</string>
-    <string name="update_notification_title">ആപ്പ് ശേഖരണം പുതുക്കുന്നു</string>
+    <string name="banner_updating_repositories">ആപ്പ് ശേഖരണം പുതുക്കുന്നു</string>
     <string name="status_connecting_to_repo">ബന്ധിപ്പിക്കുന്നു 
 \n %1$s ലേക്ക്</string>
     <string name="repos_unchanged">എല്ലാ സംഭരണികളും കാലികമാണ്</string>
diff --git a/app/src/main/res/values-mn/strings.xml b/app/src/main/res/values-mn/strings.xml
index 4d78c27c9..71660ab1e 100644
--- a/app/src/main/res/values-mn/strings.xml
+++ b/app/src/main/res/values-mn/strings.xml
@@ -220,7 +220,7 @@
     <string name="status_inserting_x_apps">Аппын дэлгэрэнгүйг (%1$d /%2$d) %3$s-с хадгалах</string>
     <string name="status_connecting_to_repo">Холбогдож байна
 \n%1$s</string>
-    <string name="update_notification_title">Агуулахуудыг шинэчилж байна</string>
+    <string name="banner_updating_repositories">Агуулахуудыг шинэчилж байна</string>
     <string name="download_404">Хүссэн файл олдсонгүй.</string>
     <string name="status_download_unknown_size">Татаж байна
 \n%2$s-аас
diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml
index 25036a86a..b5c116762 100644
--- a/app/src/main/res/values-mr/strings.xml
+++ b/app/src/main/res/values-mr/strings.xml
@@ -305,7 +305,7 @@
     <string name="status_inserting_x_apps">%3$s मधून
 \n (%1$d/%2$d) अँप विवरण नोंद करून घेतले जात आहे</string>
     <string name="status_connecting_to_repo">%1$s शी जोडले जात</string>
-    <string name="update_notification_title">भांडाराला अद्ययावत केले जात</string>
+    <string name="banner_updating_repositories">भांडाराला अद्ययावत केले जात</string>
     <string name="download_404">अपेक्षित फाईल मिळाली नाही.</string>
     <string name="status_download_unknown_size">%1$s मधून %2$s डाऊनलोड केले जात आहे</string>
     <string name="status_download">%1$s मधून %2$s / %3$s (%4$d%%) 
diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml
index 383d64701..f4deb1957 100644
--- a/app/src/main/res/values-my/strings.xml
+++ b/app/src/main/res/values-my/strings.xml
@@ -112,7 +112,7 @@
         %2$s ကို
         ေဒါင္းလုတ္ဆြဲေနပါသည္
     </string>
-    <string name="update_notification_title">repositories ကိုအသစ္မြမ္းမံေနသည္</string>
+    <string name="banner_updating_repositories">repositories ကိုအသစ္မြမ္းမံေနသည္</string>
     <string name="status_processing_xml_percent">%1$s မွ %2$s / %3$s (%4$d%%) ကိုရယူေနသည္</string>
     <string name="status_connecting_to_repo">%1$s
         သို႔ခ်ိတ္ဆက္ေနသည္
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index fff436562..b800697ba 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -152,7 +152,7 @@
     <string name="menu_bitcoin">Bitcoin</string>
     <string name="menu_litecoin">Litecoin</string>
     <string name="menu_flattr">Flattr</string>
-    <string name="update_notification_title">Oppdaterer pakkebrønner</string>
+    <string name="banner_updating_repositories">Oppdaterer pakkebrønner</string>
     <string name="status_processing_xml_percent">Behandler %2$s / %3$s (%4$d%%) fra %1$s</string>
     <string name="repo_details">Pakkebrønn</string>
     <string name="repo_url">Adresse</string>
diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml
index fe8703b62..5f7d91577 100644
--- a/app/src/main/res/values-nl-rBE/strings.xml
+++ b/app/src/main/res/values-nl-rBE/strings.xml
@@ -245,7 +245,7 @@
 \nvan %1$s gedownload</string>
     <string name="status_download_unknown_size">%2$s wordt gedownload van %1$s</string>
     <string name="download_404">Het gevraagde bestand is niet gevonden.</string>
-    <string name="update_notification_title">Applicatiebronnen worden bijgewerkt</string>
+    <string name="banner_updating_repositories">Applicatiebronnen worden bijgewerkt</string>
     <string name="status_connecting_to_repo">Verbinding met 
 \n%1$s aan het maken</string>
     <string name="status_inserting_x_apps">Appgegevens van %3$s worden opgeslagen (%1$d/%2$d)</string>
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 6ed200184..b82e34d56 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -142,7 +142,7 @@
     <string name="bad_fingerprint">Slechte vingerafdruk</string>
     <string name="invalid_url">Dit is geen geldige URL.</string>
     <string name="menu_changelog">Lijst van veranderingen</string>
-    <string name="update_notification_title">Applicatiebronnen worden bijgewerkt</string>
+    <string name="banner_updating_repositories">Applicatiebronnen worden bijgewerkt</string>
     <string name="status_processing_xml_percent">%2$s / %3$s (%4$d%%) van %1$s worden verwerkt</string>
     <string name="pref_language">Taal</string>
     <string name="pref_language_default">Systeemstandaard</string>
diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml
index e2c13d49c..f05638281 100644
--- a/app/src/main/res/values-nn/strings.xml
+++ b/app/src/main/res/values-nn/strings.xml
@@ -282,7 +282,7 @@
 \n%2$s frå
 \n%1$s</string>
     <string name="download_404">Fann ikkje førespurd fil.</string>
-    <string name="update_notification_title">Oppdaterer pakkebrønnar</string>
+    <string name="banner_updating_repositories">Oppdaterer pakkebrønnar</string>
     <string name="status_connecting_to_repo">Koplar til
 \n%1$s</string>
     <string name="status_inserting_x_apps">Lagrar appdetaljar (%1$d/%2$d) frå %3$s</string>
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 869490c89..87b6683fc 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -132,7 +132,7 @@
     <string name="antitracklist">Ta aplikacja śledzi i raportuje Twoją aktywność</string>
     <string name="show_incompat_versions_on">Pokazuj aplikacje, które są niekompatybilne z tym urządzeniem</string>
     <string name="status_download">Pobieranie\n%2$s / %3$s (%4$d%%) z\n%1$s</string>
-    <string name="update_notification_title">Aktualizowanie repozytoriów</string>
+    <string name="banner_updating_repositories">Aktualizowanie repozytoriów</string>
     <string name="status_processing_xml_percent">Przetwarzanie %2$s / %3$s (%4$d%%) z %1$s</string>
     <string name="no_permissions">Brak uprawnień</string>
     <string name="unsigned">Brak podpisu</string>
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 75f0889be..432e6569e 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -152,7 +152,7 @@
     <string name="bad_fingerprint">Falha na fingerprint</string>
     <string name="invalid_url">Esta não é uma URL válida.</string>
     <string name="menu_changelog">Changelog</string>
-    <string name="update_notification_title">Atualizando repositórios</string>
+    <string name="banner_updating_repositories">Atualizando repositórios</string>
     <string name="status_processing_xml_percent">Processando %2$s / %3$s (%4$d%%) de %1$s</string>
     <string name="pref_language">Idioma</string>
     <string name="pref_language_default">Padrão do sistema</string>
diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml
index f00719674..22d572653 100644
--- a/app/src/main/res/values-pt-rPT/strings.xml
+++ b/app/src/main/res/values-pt-rPT/strings.xml
@@ -104,7 +104,7 @@
     <string name="status_download_unknown_size">A descarregar
 \n%2$s de
 \n%1$s</string>
-    <string name="update_notification_title">A atualizar repositórios</string>
+    <string name="banner_updating_repositories">A atualizar repositórios</string>
     <string name="status_processing_xml_percent">A processar %2$s/%3$s (%4$d%%) de %1$s</string>
     <string name="status_connecting_to_repo">Estabelecendo ligação
 \na %1$s</string>
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 36d5bad23..3898d56d2 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -282,7 +282,7 @@
 \n%2$s de
 \n%1$s</string>
     <string name="download_404">O ficheiro solicitado não foi encontrado.</string>
-    <string name="update_notification_title">A atualizar repositórios</string>
+    <string name="banner_updating_repositories">A atualizar repositórios</string>
     <string name="status_connecting_to_repo">Estabelecendo ligação
 \na %1$s</string>
     <string name="status_inserting_x_apps">A guardar detalhes da aplicação (%1$d/%2$d) de %3$s</string>
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 10750af47..4e99e503c 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -148,7 +148,7 @@
     <string name="status_download">Descărcare
 \n%2$s / %3$s (%4$d%%) din
 \n%1$s</string>
-    <string name="update_notification_title">Actualizare depozit</string>
+    <string name="banner_updating_repositories">Actualizare depozit</string>
     <string name="status_connecting_to_repo">Conectare la\n%1$s</string>
     <string name="global_error_updating_repos">Eroare la actualizare: %s</string>
     <string name="permissions">Permisiuni</string>
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 85afa8a29..42a5c0d9c 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -151,7 +151,7 @@
     <string name="category_Sports_Health">Спорт и здоровье</string>
     <string name="category_Time">Время</string>
     <string name="app_name">F-Droid</string>
-    <string name="update_notification_title">Обновление репозиториев</string>
+    <string name="banner_updating_repositories">Обновление репозиториев</string>
     <string name="status_processing_xml_percent">Обработка %2$s / %3$s (%4$d%%) из %1$s</string>
     <string name="install_error_unknown">Не удалось установить из-за неизвестной ошибки</string>
     <string name="uninstall_error_unknown">Не удалось удалить из-за неизвестной ошибки</string>
diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml
index 006c24ff7..fb7fa7a6a 100644
--- a/app/src/main/res/values-sc/strings.xml
+++ b/app/src/main/res/values-sc/strings.xml
@@ -153,7 +153,7 @@
     <string name="back">In dae segus</string>
     <string name="invalid_url">Custu no est unu ligàmene vàlidu.</string>
     <string name="menu_changelog">Lista modìficas</string>
-    <string name="update_notification_title">Agiornende sos depòsitos</string>
+    <string name="banner_updating_repositories">Agiornende sos depòsitos</string>
     <string name="status_processing_xml_percent">Protzessende %2$s / %3$s (%4$d%%) dae %1$s</string>
     <string name="pref_language">Limba</string>
     <string name="pref_language_default">Predefinida de sistema</string>
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index ee5e8b480..b420f9590 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -159,7 +159,7 @@
     <string name="bad_fingerprint">Zlý otlačok</string>
     <string name="invalid_url">Nie je validná URL.</string>
     <string name="menu_changelog">Changelog</string>
-    <string name="update_notification_title">Aktualizujem repozitáre</string>
+    <string name="banner_updating_repositories">Aktualizujem repozitáre</string>
     <string name="status_processing_xml_percent">Spracúvam %2$s / %3$s (%4$d%%) z %1$s</string>
     <string name="pref_language">Jazyk</string>
     <string name="pref_language_default">Prednastavené systémom</string>
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index 72c457cfc..0b012cbc1 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -229,7 +229,7 @@
     <string name="hide_on_long_search_press_title">Skrij iskalni gumb</string>
     <string name="hide_on_long_search_press_summary">Dolg pritisk na gumb iskanje bo skril aplikacije</string>
     <string name="download_404">Zahtevana datoteka ni bila najdena.</string>
-    <string name="update_notification_title">Posodabljanje skladišča aplikacij</string>
+    <string name="banner_updating_repositories">Posodabljanje skladišča aplikacij</string>
     <string name="repos_unchanged">Vsa skladišča aplikacij so posodobljena</string>
     <string name="global_error_updating_repos">Med posodobitvijo aplikacije %s je prišlo do napake</string>
     <string name="no_permissions">Ni dovoljenj</string>
diff --git a/app/src/main/res/values-sn/strings.xml b/app/src/main/res/values-sn/strings.xml
index 2b8cadba7..74e314381 100644
--- a/app/src/main/res/values-sn/strings.xml
+++ b/app/src/main/res/values-sn/strings.xml
@@ -153,7 +153,7 @@
         %2$s kubva
         %1$s
     </string>
-    <string name="update_notification_title">Kunatsa pfimbi</string>
+    <string name="banner_updating_repositories">Kunatsa pfimbi</string>
     <string name="status_processing_xml_percent">Kushisha %2$s / %3$s (%4$d%%) kubva %1$s</string>
     <string name="status_connecting_to_repo">Kuhakira ku
         %1$s
diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml
index e79a52e19..7f0dbac97 100644
--- a/app/src/main/res/values-sq/strings.xml
+++ b/app/src/main/res/values-sq/strings.xml
@@ -237,7 +237,7 @@
     <string name="hide_on_long_search_press_title">Fshihe me butonin e kërkimit</string>
     <string name="hide_on_long_search_press_summary">Prekja e zgjatur e butonit të kërkimit do të fshehë aplikacionin</string>
     <string name="download_404">Kartela e domosdoshme s’u gjet.</string>
-    <string name="update_notification_title">Përditësim deposh</string>
+    <string name="banner_updating_repositories">Përditësim deposh</string>
     <string name="repo_num_apps">Numër aplikacionesh</string>
     <string name="repo_official_mirrors">Pasqyra zyrtare</string>
     <string name="repo_user_mirrors">Pasqyra përdoruesi</string>
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index fb76869c4..592bab7ba 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -143,7 +143,7 @@
     <string name="bad_fingerprint">Лош отисак</string>
     <string name="invalid_url">Ово није исправна адреса.</string>
     <string name="menu_changelog">Дневник измена</string>
-    <string name="update_notification_title">Освежавам ризнице</string>
+    <string name="banner_updating_repositories">Освежавам ризнице</string>
     <string name="status_processing_xml_percent">Обрађујем %2$s / %3$s (%4$d%%) од %1$s</string>
     <string name="pref_language">Језик</string>
     <string name="pref_language_default">Системски подразумеван</string>
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 8b977b7ce..9b2baa01c 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -154,7 +154,7 @@
     <string name="status_download_unknown_size">Hämtar
 \n%2$s från
 \n%1$s</string>
-    <string name="update_notification_title">Uppdaterar filförråd</string>
+    <string name="banner_updating_repositories">Uppdaterar filförråd</string>
     <string name="permissions">Behörigheter</string>
     <string name="repo_details">Förråd</string>
     <string name="repo_url">Adress</string>
diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml
index 6eff9c78a..2b85e3555 100644
--- a/app/src/main/res/values-te/strings.xml
+++ b/app/src/main/res/values-te/strings.xml
@@ -192,7 +192,7 @@
     <string name="hide_on_long_search_press_title">శోధన బటన్తో దాచు</string>
     <string name="hide_on_long_search_press_summary">చాలాసేపు శోధన బటన్ను నొక్కినప్పుడు అనువర్తనం దాచబడుతుంది</string>
     <string name="download_404">అభ్యర్థించిన ఫైల్ కనుగొనబడలేదు.</string>
-    <string name="update_notification_title">రిపోజిటరీలను నవీకరిస్తోంది</string>
+    <string name="banner_updating_repositories">రిపోజిటరీలను నవీకరిస్తోంది</string>
     <string name="repos_unchanged">అన్ని రిపోజిటరీలు తాజావి</string>
     <string name="all_other_repos_fine">అన్ని ఇతర రేపోలు లోపాలు సృష్టించలేదు.</string>
     <string name="global_error_updating_repos">నవీకరణ సమయంలో లోపం: %s</string>
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index 4dc9528da..9c897252d 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -208,7 +208,7 @@
     <string name="proxy_port_summary">หมายเลขพอร์ตพร็อกซีของคุณ (เช่น 8118)</string>
     <string name="status_download">กำลังดาวน์โหลด\n%2$s / %3$s (%4$d%%) จาก\n%1$s</string>
     <string name="status_download_unknown_size">กำลังดาวน์โหลด\n%2$s จาก\n%1$s</string>
-    <string name="update_notification_title">กำลังอัพเดตข้อมูลจากแหล่งโปรแกรม</string>
+    <string name="banner_updating_repositories">กำลังอัพเดตข้อมูลจากแหล่งโปรแกรม</string>
     <string name="status_processing_xml_percent">กำลังประมวลผลข้อมูล %2$s / %3$s (%4$d%%) จาก %1$s</string>
     <string name="requires_features">ต้องใช้: %1$s</string>
     <string name="wifi">Wi-Fi</string>
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 58878316c..74a37381c 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -162,7 +162,7 @@
     <string name="status_download_unknown_size">%1$s konumundan
 \n%2$s
 \nindiriliyor</string>
-    <string name="update_notification_title">Depolar güncelleniyor</string>
+    <string name="banner_updating_repositories">Depolar güncelleniyor</string>
     <string name="status_processing_xml_percent">İşleniyor %2$s / %3$s (%%%4$d) kaynak: %1$s</string>
     <string name="status_inserting_apps">Uygulama ayrıntıları kaydediliyor</string>
     <string name="permissions">İzinler</string>
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 426c4a373..519cf241f 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -90,7 +90,7 @@
     <string name="proxy_port">Проксі порт</string>
     <string name="proxy_port_summary">Номер порту вашого проксі (наприклад 8118)</string>
     <string name="status_download">Завантаження\n%2$s / %3$s (%4$d%%) з\n%1$s</string>
-    <string name="update_notification_title">Оновлення репозиторіїв</string>
+    <string name="banner_updating_repositories">Оновлення репозиторіїв</string>
     <string name="status_processing_xml_percent">Обробка %2$s / %3$s (%4$d%%) з %1$s</string>
     <string name="status_connecting_to_repo">З\'єднання з
 \n%1$s</string>
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index ba4e0dac4..7fa4554e7 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -152,7 +152,7 @@
     <string name="enable_proxy_summary">Thiết lập proxy HTTP cho tất cả các yêu cầu nối mạng</string>
     <string name="proxy_host">Máy chủ Proxy</string>
     <string name="proxy_host_summary">Tên máy chủ proxy của bạn (ví dụ 127.0.0.1)</string>
-    <string name="update_notification_title">Đang cập nhật các kho ứng dụng</string>
+    <string name="banner_updating_repositories">Đang cập nhật các kho ứng dụng</string>
     <string name="status_processing_xml_percent">Đang xử lí %2$s / %3$s (%4$d%%) từ %1$s</string>
     <string name="unsigned">Chưa được kí</string>
     <string name="unsigned_description">Điều này nghĩa là danh sách ứng dụng không được kiểm duyệt. Bạn hãy cẩn thận khi
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index f0bcc8e3f..5214cd650 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -142,7 +142,7 @@
     <string name="next">下一步</string>
     <string name="skip">跳过</string>
     <string name="status_download_unknown_size">下载中\n%2$s 来自\n%1$s</string>
-    <string name="update_notification_title">正在更新库</string>
+    <string name="banner_updating_repositories">正在更新库</string>
     <string name="status_processing_xml_percent">处理中 %2$s / %3$s (%4$d%%) 来自 %1$s</string>
     <string name="repos_unchanged">所有的存储库已是最新的</string>
     <string name="all_other_repos_fine">所有其他的存储库并没有产生错误。</string>
diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml
index f13c0f16d..791fa90f2 100644
--- a/app/src/main/res/values-zh-rHK/strings.xml
+++ b/app/src/main/res/values-zh-rHK/strings.xml
@@ -119,7 +119,7 @@
     <string name="back">返回</string>
     <string name="invalid_url">這不是有效的網址。</string>
     <string name="menu_changelog">更新日誌</string>
-    <string name="update_notification_title">正在更新軟件庫</string>
+    <string name="banner_updating_repositories">正在更新軟件庫</string>
     <string name="no_handler_app">您沒有任何應用程式可以開啟 %s。</string>
     <string name="repo_confirm_delete_body">刪除軟件庫後,庫中的應用程式將不會在 F-Droid 中出現。
 \n
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 5b259d0d8..cf3fb0188 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -116,7 +116,7 @@
     <string name="deleting_repo">正在刪除目前的軟體庫…</string>
     <string name="adding_apks_format">正在加入 %s 到軟體庫…</string>
     <string name="copying_icons">正在複製應用程式圖示至軟體庫…</string>
-    <string name="update_notification_title">正在更新軟體庫</string>
+    <string name="banner_updating_repositories">正在更新軟體庫</string>
     <string name="repos_unchanged">所有軟體庫已更新至最新的版本</string>
     <string name="all_other_repos_fine">所有其它軟體庫都沒有出現錯誤。</string>
     <string name="global_error_updating_repos">更新時發生錯誤:%s</string>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index add32eb5f..189a2970b 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -378,7 +378,7 @@ This often occurs with apps installed via Google Play or other sources, if they
     -->
     <string name="status_download_unknown_size">Downloading\n%2$s from\n%1$s</string>
     <string name="download_404">The requested file was not found.</string>
-    <string name="update_notification_title">Updating repositories</string>
+    <string name="banner_updating_repositories">Updating repositories</string>
     <string name="status_processing_xml_percent">Processing %2$s / %3$s (%4$d%%) from %1$s</string>
     <string name="status_connecting_to_repo">Connecting to\n%1$s</string>
     <string name="status_inserting_apps">Saving app details</string>

From a505850110151d17ee9eea74fd808fbbda0a3434 Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner <hans@eds.org>
Date: Tue, 13 Apr 2021 14:40:09 +0200
Subject: [PATCH 4/7] "No internet" banner on main, categories, and updates
 screen

An alternate implementation of @pserwylo's fdroidclient!724

closes #884
---
 .../fdroid/views/BannerUpdatingRepos.java     | 83 +++++++++++++------
 app/src/main/res/values/strings.xml           |  1 +
 2 files changed, 59 insertions(+), 25 deletions(-)

diff --git a/app/src/main/java/org/fdroid/fdroid/views/BannerUpdatingRepos.java b/app/src/main/java/org/fdroid/fdroid/views/BannerUpdatingRepos.java
index a93d89a79..b9ea3b3df 100644
--- a/app/src/main/java/org/fdroid/fdroid/views/BannerUpdatingRepos.java
+++ b/app/src/main/java/org/fdroid/fdroid/views/BannerUpdatingRepos.java
@@ -4,21 +4,40 @@ import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.net.ConnectivityManager;
 import android.util.AttributeSet;
 import android.view.Gravity;
 import android.view.View;
 
 import org.fdroid.fdroid.R;
 import org.fdroid.fdroid.UpdateService;
+import org.fdroid.fdroid.net.ConnectivityMonitorService;
 
 import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 
 /**
- * Widget which reflects whether or not a repo update is currently in progress or not. If so, shows
- * some sort of feedback to the user.
+ * Banner widget which reflects current status related to repository updates.
+ * It will display whether repositories area actively being updated, or
+ * whether there is no Internet connection, so repositories cannot be updated
+ * from the Internet.
+ * <p>
+ * It shows a "No Internet" message when it identifies the device is not
+ * connected. Will only monitor the wifi state when attached to the window.
+ * Note that this does a pretty poor job of responding to network changes in
+ * real time. It only knows how to respond to the <em>enabling</em> of WiFi
+ * (not disabling of WiFi, nor enabling/disabling of mobile data). However it
+ * will always query the network state when it is shown to the user. This way
+ * if they change between tabs, hide and then open F-Droid, or do other things
+ * which require the view to attach to the window again then it will update the
+ * network state. In practice this works pretty well.
+ *
+ * @see <a href="https://gitlab.com/fdroid/fdroidclient/-/merge_requests/724">"No internet" banner on main, categories, and updates screen</a>
  */
 public class BannerUpdatingRepos extends androidx.appcompat.widget.AppCompatTextView {
 
+    private int updateServiceStatus = UpdateService.STATUS_COMPLETE_WITH_CHANGES;
+    private int networkState = ConnectivityMonitorService.FLAG_NET_NO_LIMIT;
+
     public BannerUpdatingRepos(Context context) {
         this(context, null);
     }
@@ -33,51 +52,65 @@ public class BannerUpdatingRepos extends androidx.appcompat.widget.AppCompatText
         setPadding(padding, padding, padding, padding);
         setBackgroundColor(0xFF4A4A4A);
         setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);
-        setText(R.string.banner_updating_repositories);
         setTextColor(0xFFFFFFFF);
     }
 
     @Override
     protected void onAttachedToWindow() {
         super.onAttachedToWindow();
-        monitorRepoUpdates();
+        Context context = getContext();
+        networkState = ConnectivityMonitorService.getNetworkState(context);
+        context.registerReceiver(onNetworkStateChanged,
+                new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
+
+        if (UpdateService.isUpdating()) {
+            updateServiceStatus = UpdateService.STATUS_INFO;
+        }
+        LocalBroadcastManager.getInstance(context).registerReceiver(onRepoFeedback,
+                new IntentFilter(UpdateService.LOCAL_ACTION_STATUS));
+
+        setBannerTextAndVisibility();
     }
 
     @Override
     protected void onDetachedFromWindow() {
         super.onDetachedFromWindow();
-        stopMonitoringRepoUpdates();
+        Context context = getContext();
+        LocalBroadcastManager.getInstance(context).unregisterReceiver(onRepoFeedback);
+        context.unregisterReceiver(onNetworkStateChanged);
     }
 
-    private void monitorRepoUpdates() {
-        if (isInEditMode()) {
-            return;
-        }
-
-        LocalBroadcastManager.getInstance(getContext()).registerReceiver(onRepoFeedback,
-                new IntentFilter(UpdateService.LOCAL_ACTION_STATUS));
-        setBannerIsVisible(UpdateService.isUpdating());
-    }
-
-    private void setBannerIsVisible(boolean isUpdating) {
-        if (isUpdating) {
+    private void setBannerTextAndVisibility() {
+        if (updateServiceStatus == UpdateService.STATUS_INFO) {
+            setText(R.string.banner_updating_repositories);
+            setVisibility(View.VISIBLE);
+        } else if (networkState == ConnectivityMonitorService.FLAG_NET_UNAVAILABLE
+                || networkState == ConnectivityMonitorService.FLAG_NET_DEVICE_AP_WITHOUT_INTERNET) {
+            setText(R.string.banner_no_internet);
             setVisibility(View.VISIBLE);
         } else {
             setVisibility(View.GONE);
         }
     }
 
-    private void stopMonitoringRepoUpdates() {
-        LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(onRepoFeedback);
-    }
-
+    /**
+     * Anything other than a {@link UpdateService#STATUS_INFO} broadcast
+     * signifies that it was complete (and out banner should be removed).
+     */
     private final BroadcastReceiver onRepoFeedback = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
-            // Anything other than a STATUS_INFO broadcast signifies that it was complete (and out
-            // banner should be removed).
-            boolean isInfo = intent.getIntExtra(UpdateService.EXTRA_STATUS_CODE, 0) == UpdateService.STATUS_INFO;
-            setBannerIsVisible(isInfo);
+            updateServiceStatus = intent.getIntExtra(UpdateService.EXTRA_STATUS_CODE,
+                    UpdateService.STATUS_COMPLETE_WITH_CHANGES);
+            setBannerTextAndVisibility();
+        }
+    };
+
+    private final BroadcastReceiver onNetworkStateChanged = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            networkState = ConnectivityMonitorService.getNetworkState(context);
+            setBannerTextAndVisibility();
         }
     };
 }
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 189a2970b..2dbe54327 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -379,6 +379,7 @@ This often occurs with apps installed via Google Play or other sources, if they
     <string name="status_download_unknown_size">Downloading\n%2$s from\n%1$s</string>
     <string name="download_404">The requested file was not found.</string>
     <string name="banner_updating_repositories">Updating repositories</string>
+    <string name="banner_no_internet">No Internet</string>
     <string name="status_processing_xml_percent">Processing %2$s / %3$s (%4$d%%) from %1$s</string>
     <string name="status_connecting_to_repo">Connecting to\n%1$s</string>
     <string name="status_inserting_apps">Saving app details</string>

From 8773d6205ce990022c3084b2a8e97d75ab435d3c Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner <hans@eds.org>
Date: Tue, 13 Apr 2021 14:42:11 +0200
Subject: [PATCH 5/7] rename BannerUpdatingRepos --> StatusBanner

---
 .../java/org/fdroid/fdroid/MainActivityEspressoTest.java  | 4 ++--
 app/src/full/res/layout/main_tab_categories.xml           | 2 +-
 .../views/{BannerUpdatingRepos.java => StatusBanner.java} | 8 ++++----
 app/src/main/res/layout/main_tab_latest.xml               | 2 +-
 app/src/main/res/layout/main_tab_updates.xml              | 2 +-
 5 files changed, 9 insertions(+), 9 deletions(-)
 rename app/src/main/java/org/fdroid/fdroid/views/{BannerUpdatingRepos.java => StatusBanner.java} (93%)

diff --git a/app/src/androidTest/java/org/fdroid/fdroid/MainActivityEspressoTest.java b/app/src/androidTest/java/org/fdroid/fdroid/MainActivityEspressoTest.java
index 080c64ef8..9cc828da3 100644
--- a/app/src/androidTest/java/org/fdroid/fdroid/MainActivityEspressoTest.java
+++ b/app/src/androidTest/java/org/fdroid/fdroid/MainActivityEspressoTest.java
@@ -21,7 +21,7 @@ import androidx.test.uiautomator.UiObjectNotFoundException;
 import androidx.test.uiautomator.UiSelector;
 import android.util.Log;
 import android.view.View;
-import org.fdroid.fdroid.views.BannerUpdatingRepos;
+import org.fdroid.fdroid.views.StatusBanner;
 import org.fdroid.fdroid.views.main.MainActivity;
 import org.hamcrest.Matchers;
 import org.junit.After;
@@ -267,7 +267,7 @@ public class MainActivityEspressoTest {
         if (!BuildConfig.FLAVOR.startsWith("full")) {
             return;
         }
-        onView(Matchers.<View>instanceOf(BannerUpdatingRepos.class)).check(matches(not(isDisplayed())));
+        onView(Matchers.<View>instanceOf(StatusBanner.class)).check(matches(not(isDisplayed())));
         onView(allOf(withText(R.string.menu_settings), isDisplayed())).perform(click());
         onView(allOf(withText(R.string.main_menu__latest_apps), isDisplayed())).perform(click());
         onView(allOf(withId(R.id.swipe_to_refresh), isDisplayed()))
diff --git a/app/src/full/res/layout/main_tab_categories.xml b/app/src/full/res/layout/main_tab_categories.xml
index af80ac01c..301570f7f 100644
--- a/app/src/full/res/layout/main_tab_categories.xml
+++ b/app/src/full/res/layout/main_tab_categories.xml
@@ -17,7 +17,7 @@
             android:layout_width="match_parent"
             android:layout_height="match_parent">
 
-            <org.fdroid.fdroid.views.BannerUpdatingRepos
+            <org.fdroid.fdroid.views.StatusBanner
                 android:id="@+id/banner_updating_repos"
                 android:layout_width="0dp"
                 android:layout_height="wrap_content"
diff --git a/app/src/main/java/org/fdroid/fdroid/views/BannerUpdatingRepos.java b/app/src/main/java/org/fdroid/fdroid/views/StatusBanner.java
similarity index 93%
rename from app/src/main/java/org/fdroid/fdroid/views/BannerUpdatingRepos.java
rename to app/src/main/java/org/fdroid/fdroid/views/StatusBanner.java
index b9ea3b3df..1e3bfafa8 100644
--- a/app/src/main/java/org/fdroid/fdroid/views/BannerUpdatingRepos.java
+++ b/app/src/main/java/org/fdroid/fdroid/views/StatusBanner.java
@@ -33,20 +33,20 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager;
  *
  * @see <a href="https://gitlab.com/fdroid/fdroidclient/-/merge_requests/724">"No internet" banner on main, categories, and updates screen</a>
  */
-public class BannerUpdatingRepos extends androidx.appcompat.widget.AppCompatTextView {
+public class StatusBanner extends androidx.appcompat.widget.AppCompatTextView {
 
     private int updateServiceStatus = UpdateService.STATUS_COMPLETE_WITH_CHANGES;
     private int networkState = ConnectivityMonitorService.FLAG_NET_NO_LIMIT;
 
-    public BannerUpdatingRepos(Context context) {
+    public StatusBanner(Context context) {
         this(context, null);
     }
 
-    public BannerUpdatingRepos(Context context, AttributeSet attrs) {
+    public StatusBanner(Context context, AttributeSet attrs) {
         this(context, attrs, android.R.attr.textViewStyle);
     }
 
-    public BannerUpdatingRepos(Context context, AttributeSet attrs, int defStyleAttr) {
+    public StatusBanner(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
         int padding = (int) getResources().getDimension(R.dimen.banner__padding);
         setPadding(padding, padding, padding, padding);
diff --git a/app/src/main/res/layout/main_tab_latest.xml b/app/src/main/res/layout/main_tab_latest.xml
index 31b4a1c4a..99d3e3452 100644
--- a/app/src/main/res/layout/main_tab_latest.xml
+++ b/app/src/main/res/layout/main_tab_latest.xml
@@ -16,7 +16,7 @@
             android:layout_height="match_parent"
             android:orientation="vertical">
 
-            <org.fdroid.fdroid.views.BannerUpdatingRepos
+            <org.fdroid.fdroid.views.StatusBanner
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content" />
 
diff --git a/app/src/main/res/layout/main_tab_updates.xml b/app/src/main/res/layout/main_tab_updates.xml
index 2aea585f7..1db3a3375 100644
--- a/app/src/main/res/layout/main_tab_updates.xml
+++ b/app/src/main/res/layout/main_tab_updates.xml
@@ -18,7 +18,7 @@
             android:layout_height="match_parent"
             android:background="?attr/mainTabSwapBackground">
 
-            <org.fdroid.fdroid.views.BannerUpdatingRepos
+            <org.fdroid.fdroid.views.StatusBanner
                 android:id="@+id/banner_updating_repos"
                 android:layout_width="0dp"
                 android:layout_height="wrap_content"

From 908921e9789d12e9b247faeff03c3a75393606e9 Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner <hans@eds.org>
Date: Tue, 13 Apr 2021 16:25:10 +0200
Subject: [PATCH 6/7] show banner when Over Data/WiFi Settings disable updating
 from internet

---
 .../java/org/fdroid/fdroid/UpdateService.java | 45 +++++++++++++------
 .../org/fdroid/fdroid/views/StatusBanner.java | 40 +++++++++++++++++
 app/src/main/res/values/strings.xml           |  4 ++
 tools/check-string-maxlength.py               |  9 ++--
 4 files changed, 82 insertions(+), 16 deletions(-)

diff --git a/app/src/main/java/org/fdroid/fdroid/UpdateService.java b/app/src/main/java/org/fdroid/fdroid/UpdateService.java
index 0d06c3e0d..3487e9980 100644
--- a/app/src/main/java/org/fdroid/fdroid/UpdateService.java
+++ b/app/src/main/java/org/fdroid/fdroid/UpdateService.java
@@ -253,6 +253,37 @@ public class UpdateService extends JobIntentService {
         }
     }
 
+    /**
+     * Return a {@link List} of all {@link Repo}s that have either a local
+     * canonical URL or a local mirror URL.  These are repos that can be
+     * updated and used without using the Internet.
+     */
+    public static List<Repo> getLocalRepos(Context context) {
+        return getLocalRepos(RepoProvider.Helper.all(context));
+    }
+
+    /**
+     * Return the repos in the {@code repos} {@link List} that have either a
+     * local canonical URL or a local mirror URL.  These are repos that can be
+     * updated and used without using the Internet.
+     */
+    public static List<Repo> getLocalRepos(List<Repo> repos) {
+        ArrayList<Repo> localRepos = new ArrayList<>();
+        for (Repo repo : repos) {
+            if (isLocalRepoAddress(repo.address)) {
+                localRepos.add(repo);
+            } else {
+                for (String mirrorAddress : repo.getMirrorList()) {
+                    if (isLocalRepoAddress(mirrorAddress)) {
+                        localRepos.add(repo);
+                        break;
+                    }
+                }
+            }
+        }
+        return localRepos;
+    }
+
     @Override
     public void onCreate() {
         super.onCreate();
@@ -405,19 +436,7 @@ public class UpdateService extends JobIntentService {
                 Utils.debugLog(TAG, "skipping internet check, this is local: " + address);
             } else if (netState == ConnectivityMonitorService.FLAG_NET_UNAVAILABLE) {
                 // keep track of repos that have a local copy in case internet is not available
-                ArrayList<Repo> localRepos = new ArrayList<>();
-                for (Repo repo : repos) {
-                    if (isLocalRepoAddress(repo.address)) {
-                        localRepos.add(repo);
-                    } else {
-                        for (String mirrorAddress : repo.getMirrorList()) {
-                            if (isLocalRepoAddress(mirrorAddress)) {
-                                localRepos.add(repo);
-                                break;
-                            }
-                        }
-                    }
-                }
+                List<Repo> localRepos = getLocalRepos(repos);
                 if (localRepos.size() > 0) {
                     repos = localRepos;
                 } else {
diff --git a/app/src/main/java/org/fdroid/fdroid/views/StatusBanner.java b/app/src/main/java/org/fdroid/fdroid/views/StatusBanner.java
index 1e3bfafa8..3adf112ee 100644
--- a/app/src/main/java/org/fdroid/fdroid/views/StatusBanner.java
+++ b/app/src/main/java/org/fdroid/fdroid/views/StatusBanner.java
@@ -4,16 +4,22 @@ import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.SharedPreferences;
 import android.net.ConnectivityManager;
 import android.util.AttributeSet;
 import android.view.Gravity;
 import android.view.View;
 
+import org.fdroid.fdroid.Preferences;
 import org.fdroid.fdroid.R;
 import org.fdroid.fdroid.UpdateService;
+import org.fdroid.fdroid.data.Repo;
 import org.fdroid.fdroid.net.ConnectivityMonitorService;
 
+import java.util.List;
+
 import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+import androidx.preference.PreferenceManager;
 
 /**
  * Banner widget which reflects current status related to repository updates.
@@ -37,6 +43,11 @@ public class StatusBanner extends androidx.appcompat.widget.AppCompatTextView {
 
     private int updateServiceStatus = UpdateService.STATUS_COMPLETE_WITH_CHANGES;
     private int networkState = ConnectivityMonitorService.FLAG_NET_NO_LIMIT;
+    private int overDataState;
+    private int overWiFiState;
+    private List<Repo> localRepos;
+
+    private final SharedPreferences preferences;
 
     public StatusBanner(Context context) {
         this(context, null);
@@ -53,6 +64,8 @@ public class StatusBanner extends androidx.appcompat.widget.AppCompatTextView {
         setBackgroundColor(0xFF4A4A4A);
         setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);
         setTextColor(0xFFFFFFFF);
+
+        preferences = PreferenceManager.getDefaultSharedPreferences(context);
     }
 
     @Override
@@ -69,6 +82,11 @@ public class StatusBanner extends androidx.appcompat.widget.AppCompatTextView {
         LocalBroadcastManager.getInstance(context).registerReceiver(onRepoFeedback,
                 new IntentFilter(UpdateService.LOCAL_ACTION_STATUS));
 
+        overDataState = Preferences.get().getOverData();
+        overWiFiState = Preferences.get().getOverWifi();
+        localRepos = UpdateService.getLocalRepos(context);
+        preferences.registerOnSharedPreferenceChangeListener(dataWifiChangeListener);
+
         setBannerTextAndVisibility();
     }
 
@@ -78,6 +96,7 @@ public class StatusBanner extends androidx.appcompat.widget.AppCompatTextView {
         Context context = getContext();
         LocalBroadcastManager.getInstance(context).unregisterReceiver(onRepoFeedback);
         context.unregisterReceiver(onNetworkStateChanged);
+        preferences.unregisterOnSharedPreferenceChangeListener(dataWifiChangeListener);
     }
 
     private void setBannerTextAndVisibility() {
@@ -88,6 +107,15 @@ public class StatusBanner extends androidx.appcompat.widget.AppCompatTextView {
                 || networkState == ConnectivityMonitorService.FLAG_NET_DEVICE_AP_WITHOUT_INTERNET) {
             setText(R.string.banner_no_internet);
             setVisibility(View.VISIBLE);
+        } else if (overDataState == Preferences.OVER_NETWORK_NEVER
+                && overWiFiState == Preferences.OVER_NETWORK_NEVER) {
+            localRepos = UpdateService.getLocalRepos(getContext());
+            if (localRepos.size() == 0) {
+                setText(R.string.banner_no_data_or_wifi);
+                setVisibility(View.VISIBLE);
+            } else {
+                setVisibility(View.GONE);
+            }
         } else {
             setVisibility(View.GONE);
         }
@@ -113,4 +141,16 @@ public class StatusBanner extends androidx.appcompat.widget.AppCompatTextView {
             setBannerTextAndVisibility();
         }
     };
+
+    private final SharedPreferences.OnSharedPreferenceChangeListener dataWifiChangeListener =
+            new SharedPreferences.OnSharedPreferenceChangeListener() {
+                @Override
+                public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+                    if (key == Preferences.PREF_OVER_DATA || key == Preferences.PREF_OVER_WIFI) {
+                        overDataState = Preferences.get().getOverData();
+                        overWiFiState = Preferences.get().getOverWifi();
+                        setBannerTextAndVisibility();
+                    }
+                }
+            };
 }
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 2dbe54327..c860370f1 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -378,8 +378,12 @@ This often occurs with apps installed via Google Play or other sources, if they
     -->
     <string name="status_download_unknown_size">Downloading\n%2$s from\n%1$s</string>
     <string name="download_404">The requested file was not found.</string>
+    <!-- This is a banner title, it should be maximum 30 characters -->
     <string name="banner_updating_repositories">Updating repositories</string>
+    <!-- This is a banner title, it should be maximum 30 characters -->
     <string name="banner_no_internet">No Internet</string>
+    <!-- This is a banner title, it should be maximum 30 characters -->
+    <string name="banner_no_data_or_wifi">No Data or WiFi enabled</string>
     <string name="status_processing_xml_percent">Processing %2$s / %3$s (%4$d%%) from %1$s</string>
     <string name="status_connecting_to_repo">Connecting to\n%1$s</string>
     <string name="status_inserting_apps">Saving app details</string>
diff --git a/tools/check-string-maxlength.py b/tools/check-string-maxlength.py
index 6356fc2f8..5ee839440 100755
--- a/tools/check-string-maxlength.py
+++ b/tools/check-string-maxlength.py
@@ -8,21 +8,24 @@ import sys
 from xml.etree import ElementTree
 
 maxlengths = {
+    "banner_no_data_or_wifi": 30,
+    "banner_no_internet": 30,
+    "banner_updating_repositories": 30,
+    "installing": 50,
     "menu_install": 15,
     "menu_uninstall": 15,
-    "installing": 50,
-    "uninstalling": 50,
     "nearby_splash__find_people_button": 30,
     "nearby_splash__request_permission": 30,
     "swap": 25,
-    "swap_nfc_title": 25,
     "swap_choose_apps": 25,
     "swap_confirm": 25,
     "swap_connecting": 25,
     "swap_nearby": 25,
+    "swap_nfc_title": 25,
     "swap_scan_qr": 18,
     "swap_send_fdroid": 18,
     "swap_success": 25,
+    "uninstalling": 50,
     "update_all": 20,
     "updates__hide_updateable_apps": 35,
     "updates__show_updateable_apps": 35,

From 18a43ac47101072e0b2fa921fa22dafe02158ac6 Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner <hans@eds.org>
Date: Tue, 13 Apr 2021 21:58:19 +0200
Subject: [PATCH 7/7] ignore system partition repos when checking for local
 repos

The system partition repos like shipped with CalyxOS are not really visible
to the user, they are built-in.  So they should not prevent the warning
banner showing when the user has switched Over Data and Over WiFi to never.
---
 .../org/fdroid/fdroid/views/StatusBanner.java | 24 ++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/app/src/main/java/org/fdroid/fdroid/views/StatusBanner.java b/app/src/main/java/org/fdroid/fdroid/views/StatusBanner.java
index 3adf112ee..9659b3bef 100644
--- a/app/src/main/java/org/fdroid/fdroid/views/StatusBanner.java
+++ b/app/src/main/java/org/fdroid/fdroid/views/StatusBanner.java
@@ -6,6 +6,7 @@ import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.SharedPreferences;
 import android.net.ConnectivityManager;
+import android.net.Uri;
 import android.util.AttributeSet;
 import android.view.Gravity;
 import android.view.View;
@@ -16,6 +17,7 @@ import org.fdroid.fdroid.UpdateService;
 import org.fdroid.fdroid.data.Repo;
 import org.fdroid.fdroid.net.ConnectivityMonitorService;
 
+import java.util.Arrays;
 import java.util.List;
 
 import androidx.localbroadcastmanager.content.LocalBroadcastManager;
@@ -99,6 +101,16 @@ public class StatusBanner extends androidx.appcompat.widget.AppCompatTextView {
         preferences.unregisterOnSharedPreferenceChangeListener(dataWifiChangeListener);
     }
 
+    /**
+     * Display banner with specific text depending on updating status, network
+     * connectivity, and Data/WiFi Settings.  This also takes into account
+     * whether there are local repos/mirrors available, e.g. if there is a
+     * mirror on a USB OTG thumb drive.  Local repos on system partitions are
+     * not treated as local mirrors here, they are shipped as part of the
+     * device, and users are generally not aware of them.
+     *
+     * @see org.fdroid.fdroid.data.DBHelper#loadAdditionalRepos(String)
+     */
     private void setBannerTextAndVisibility() {
         if (updateServiceStatus == UpdateService.STATUS_INFO) {
             setText(R.string.banner_updating_repositories);
@@ -110,7 +122,17 @@ public class StatusBanner extends androidx.appcompat.widget.AppCompatTextView {
         } else if (overDataState == Preferences.OVER_NETWORK_NEVER
                 && overWiFiState == Preferences.OVER_NETWORK_NEVER) {
             localRepos = UpdateService.getLocalRepos(getContext());
-            if (localRepos.size() == 0) {
+            boolean hasLocalNonSystemRepos = true;
+            final List<String> systemPartitions = Arrays.asList("odm", "oem", "product", "system", "vendor");
+            for (Repo repo : localRepos) {
+                for (String segment : Uri.parse(repo.address).getPathSegments()) {
+                    if (systemPartitions.contains(segment)) {
+                        hasLocalNonSystemRepos = false;
+                    }
+                    break; // only check the first segment NOPMD
+                }
+            }
+            if (localRepos.size() == 0 || !hasLocalNonSystemRepos) {
                 setText(R.string.banner_no_data_or_wifi);
                 setVisibility(View.VISIBLE);
             } else {