From 5bd276c8042c856adf5d9efa45850441717c3fd9 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 6 Apr 2018 15:50:57 +0200 Subject: [PATCH] make "Only on WiFi" also apply to updates, graphics, and icons The "Only on WiFi" pref originally only controlled index updates, but now it makes sense to include all of the various files that are downloaded. #1381 --- app/src/main/AndroidManifest.xml | 3 + .../java/org/fdroid/fdroid/FDroidApp.java | 8 +- .../java/org/fdroid/fdroid/Preferences.java | 11 ++- .../java/org/fdroid/fdroid/UpdateService.java | 45 ++-------- .../net/ConnectivityMonitorService.java | 86 +++++++++++++++++++ .../fdroid/views/ScreenShotsActivity.java | 15 ++++ 6 files changed, 125 insertions(+), 43 deletions(-) create mode 100644 app/src/main/java/org/fdroid/fdroid/net/ConnectivityMonitorService.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a8e9d7557..91ea6c205 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -271,6 +271,9 @@ android:name=".DeleteCacheService" android:exported="false"/> + = 16 && cm.isActiveNetworkMetered()) { - return FLAG_NET_METERED; - } else { - return FLAG_NET_NO_LIMIT; - } - default: - return FLAG_NET_METERED; - } - } - /** * In order to send a {@link Toast} from a {@link IntentService}, we have to do these tricks. */ @@ -371,8 +339,8 @@ public class UpdateService extends IntentService { try { // See if it's time to actually do anything yet... - int netState = getNetworkState(this); - if (netState == FLAG_NET_UNAVAILABLE) { + int netState = ConnectivityMonitorService.getNetworkState(this); + if (netState == ConnectivityMonitorService.FLAG_NET_UNAVAILABLE) { Utils.debugLog(TAG, "No internet, cannot update"); if (manualUpdate) { sendNoInternetToast(); @@ -380,10 +348,10 @@ public class UpdateService extends IntentService { return; } + final Preferences fdroidPrefs = Preferences.get(); if (manualUpdate || forcedUpdate) { Utils.debugLog(TAG, "manually requested or forced update"); - } else if (!verifyIsTimeForScheduledRun() - || (netState == FLAG_NET_METERED && Preferences.get().isUpdateOnlyOnUnmeteredNetworks())) { + } else if (!verifyIsTimeForScheduledRun() || !fdroidPrefs.isBackgroundDownloadAllowed()) { Utils.debugLog(TAG, "don't run update"); return; } @@ -403,7 +371,6 @@ public class UpdateService extends IntentService { ArrayList repoErrors = new ArrayList<>(); boolean changes = false; boolean singleRepoUpdate = !TextUtils.isEmpty(address); - final Preferences fdroidPrefs = Preferences.get(); for (final Repo repo : repos) { if (!repo.inuse) { continue; @@ -442,7 +409,7 @@ public class UpdateService extends IntentService { } // now that downloading the index is done, start downloading updates - if (changes && fdroidPrefs.isAutoDownloadEnabled()) { + if (changes && fdroidPrefs.isAutoDownloadEnabled() && fdroidPrefs.isBackgroundDownloadAllowed()) { autoDownloadUpdates(this); } } diff --git a/app/src/main/java/org/fdroid/fdroid/net/ConnectivityMonitorService.java b/app/src/main/java/org/fdroid/fdroid/net/ConnectivityMonitorService.java new file mode 100644 index 000000000..13df8ee6f --- /dev/null +++ b/app/src/main/java/org/fdroid/fdroid/net/ConnectivityMonitorService.java @@ -0,0 +1,86 @@ +package org.fdroid.fdroid.net; + +import android.app.IntentService; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.Build; +import com.nostra13.universalimageloader.core.ImageLoader; +import org.fdroid.fdroid.FDroidApp; +import org.fdroid.fdroid.Preferences; + +/** + * An {@link IntentService} subclass for tracking whether there is metered or + * unmetered internet available, based on + * {@link android.net.ConnectivityManager#CONNECTIVITY_ACTION} + */ +public class ConnectivityMonitorService extends IntentService { + public static final String TAG = "ConnectivityMonitorServ"; + + public static final int FLAG_NET_UNAVAILABLE = 0; + public static final int FLAG_NET_METERED = 1; + public static final int FLAG_NET_NO_LIMIT = 2; + + private static final String ACTION_START = "org.fdroid.fdroid.net.action.CONNECTIVITY_MONITOR"; + + private static final BroadcastReceiver CONNECTIVITY_RECEIVER = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + start(context); + } + }; + + public ConnectivityMonitorService() { + super("ConnectivityMonitorService"); + } + + public static void registerAndStart(Context context) { + context.registerReceiver(CONNECTIVITY_RECEIVER, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); + } + + public static void start(Context context) { + Intent intent = new Intent(context, ConnectivityMonitorService.class); + intent.setAction(ACTION_START); + context.startService(intent); + } + + /** + * Gets the state of internet availability, whether there is no connection at all, + * whether the connection has no usage limit (like most WiFi), or whether this is + * a metered connection like most cellular plans or hotspot WiFi connections. + */ + public static int getNetworkState(Context context) { + ConnectivityManager cm = (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE); + if (cm == null) { + return FLAG_NET_UNAVAILABLE; + } + NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); + if (activeNetwork == null || !activeNetwork.isConnected()) { + return FLAG_NET_UNAVAILABLE; + } + + int networkType = activeNetwork.getType(); + switch (networkType) { + case ConnectivityManager.TYPE_ETHERNET: + case ConnectivityManager.TYPE_WIFI: + if (Build.VERSION.SDK_INT >= 16 && cm.isActiveNetworkMetered()) { + return FLAG_NET_METERED; + } else { + return FLAG_NET_NO_LIMIT; + } + default: + return FLAG_NET_METERED; + } + } + + @Override + protected void onHandleIntent(Intent intent) { + if (intent != null && ACTION_START.equals(intent.getAction())) { + FDroidApp.networkState = getNetworkState(this); + ImageLoader.getInstance().denyNetworkDownloads(!Preferences.get().isBackgroundDownloadAllowed()); + } + } +} diff --git a/app/src/main/java/org/fdroid/fdroid/views/ScreenShotsActivity.java b/app/src/main/java/org/fdroid/fdroid/views/ScreenShotsActivity.java index bc88526df..4e930ce06 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/ScreenShotsActivity.java +++ b/app/src/main/java/org/fdroid/fdroid/views/ScreenShotsActivity.java @@ -18,6 +18,7 @@ import android.widget.ImageView; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import org.fdroid.fdroid.FDroidApp; +import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.R; import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.data.App; @@ -36,6 +37,8 @@ public class ScreenShotsActivity extends AppCompatActivity { private static final String EXTRA_PACKAGE_NAME = "EXTRA_PACKAGE_NAME"; private static final String EXTRA_START_POSITION = "EXTRA_START_POSITION"; + private static final ImageLoader IMAGE_LOADER = ImageLoader.getInstance(); + public static Intent getStartIntent(Context context, String packageName, int startPosition) { Intent intent = new Intent(context, ScreenShotsActivity.class); intent.putExtra(EXTRA_PACKAGE_NAME, packageName); @@ -68,6 +71,18 @@ public class ScreenShotsActivity extends AppCompatActivity { } } + @Override + protected void onResume() { + super.onResume(); + IMAGE_LOADER.denyNetworkDownloads(false); + } + + @Override + protected void onPause() { + super.onPause(); + IMAGE_LOADER.denyNetworkDownloads(!Preferences.get().isBackgroundDownloadAllowed()); + } + private static class ScreenShotPagerAdapter extends FragmentStatePagerAdapter { private final String[] screenshots;