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 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 getLocalRepos(List repos) { + ArrayList 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 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 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 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 --> Downloading\n%2$s from\n%1$s The requested file was not found. + Updating repositories + No Internet + + No Data or WiFi enabled Processing %2$s / %3$s (%4$d%%) from %1$s Connecting to\n%1$s Saving app details 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,