Add ability to only do autodl when charging.

Defaults to allow autodl on battery to preserve existing behavior.
Might be a good idea to add a receiver for the intent similar to
ConnectivityActionReceiver as this will allow us to start/stop
downloads as needed.
This commit is contained in:
Tom Hennen 2015-01-05 21:23:21 -05:00
parent 9ece3a7db4
commit 1b9c96bc76
6 changed files with 59 additions and 3 deletions

View File

@ -195,6 +195,7 @@ public class PreferenceController {
if (newValue instanceof Boolean) { if (newValue instanceof Boolean) {
ui.findPreference(UserPreferences.PREF_ENABLE_AUTODL_WIFI_FILTER).setEnabled((Boolean) newValue); ui.findPreference(UserPreferences.PREF_ENABLE_AUTODL_WIFI_FILTER).setEnabled((Boolean) newValue);
setSelectedNetworksEnabled((Boolean) newValue && UserPreferences.isEnableAutodownloadWifiFilter()); setSelectedNetworksEnabled((Boolean) newValue && UserPreferences.isEnableAutodownloadWifiFilter());
ui.findPreference(UserPreferences.PREF_ENABLE_AUTODL_ON_BATTERY).setEnabled((Boolean) newValue);
} }
return true; return true;
} }
@ -376,6 +377,8 @@ public class PreferenceController {
setSelectedNetworksEnabled(UserPreferences.isEnableAutodownload() setSelectedNetworksEnabled(UserPreferences.isEnableAutodownload()
&& UserPreferences.isEnableAutodownloadWifiFilter()); && UserPreferences.isEnableAutodownloadWifiFilter());
ui.findPreference(UserPreferences.PREF_ENABLE_AUTODL_ON_BATTERY)
.setEnabled(UserPreferences.isEnableAutodownload());
} }
private void setEpisodeCacheSizeText(int cacheSize) { private void setEpisodeCacheSizeText(int cacheSize) {

View File

@ -92,6 +92,11 @@
android:key="prefEnableAutoDl" android:key="prefEnableAutoDl"
android:title="@string/pref_automatic_download_title" android:title="@string/pref_automatic_download_title"
android:defaultValue="false"/> android:defaultValue="false"/>
<CheckBoxPreference
android:key="prefEnableAutoDownloadOnBattery"
android:title="@string/pref_automatic_download_on_battery_title"
android:summary="@string/pref_automatic_download_on_battery_sum"
android:defaultValue="true"/>
<CheckBoxPreference <CheckBoxPreference
android:key="prefEnableAutoDownloadWifiFilter" android:key="prefEnableAutoDownloadWifiFilter"
android:title="@string/pref_autodl_wifi_filter_title" android:title="@string/pref_autodl_wifi_filter_title"

View File

@ -51,6 +51,7 @@ public class UserPreferences implements
public static final String PREF_DATA_FOLDER = "prefDataFolder"; public static final String PREF_DATA_FOLDER = "prefDataFolder";
public static final String PREF_ENABLE_AUTODL = "prefEnableAutoDl"; public static final String PREF_ENABLE_AUTODL = "prefEnableAutoDl";
public static final String PREF_ENABLE_AUTODL_WIFI_FILTER = "prefEnableAutoDownloadWifiFilter"; public static final String PREF_ENABLE_AUTODL_WIFI_FILTER = "prefEnableAutoDownloadWifiFilter";
public static final String PREF_ENABLE_AUTODL_ON_BATTERY = "prefEnableAutoDownloadOnBattery";
private static final String PREF_AUTODL_SELECTED_NETWORKS = "prefAutodownloadSelectedNetworks"; private static final String PREF_AUTODL_SELECTED_NETWORKS = "prefAutodownloadSelectedNetworks";
public static final String PREF_EPISODE_CACHE_SIZE = "prefEpisodeCacheSize"; public static final String PREF_EPISODE_CACHE_SIZE = "prefEpisodeCacheSize";
private static final String PREF_PLAYBACK_SPEED = "prefPlaybackSpeed"; private static final String PREF_PLAYBACK_SPEED = "prefPlaybackSpeed";
@ -82,6 +83,7 @@ public class UserPreferences implements
private int theme; private int theme;
private boolean enableAutodownload; private boolean enableAutodownload;
private boolean enableAutodownloadWifiFilter; private boolean enableAutodownloadWifiFilter;
private boolean enableAutodownloadOnBattery;
private String[] autodownloadSelectedNetworks; private String[] autodownloadSelectedNetworks;
private int episodeCacheSize; private int episodeCacheSize;
private String playbackSpeed; private String playbackSpeed;
@ -144,6 +146,7 @@ public class UserPreferences implements
episodeCacheSize = readEpisodeCacheSizeInternal(sp.getString( episodeCacheSize = readEpisodeCacheSizeInternal(sp.getString(
PREF_EPISODE_CACHE_SIZE, "20")); PREF_EPISODE_CACHE_SIZE, "20"));
enableAutodownload = sp.getBoolean(PREF_ENABLE_AUTODL, false); enableAutodownload = sp.getBoolean(PREF_ENABLE_AUTODL, false);
enableAutodownloadOnBattery = sp.getBoolean(PREF_ENABLE_AUTODL_ON_BATTERY, true);
playbackSpeed = sp.getString(PREF_PLAYBACK_SPEED, "1.0"); playbackSpeed = sp.getString(PREF_PLAYBACK_SPEED, "1.0");
playbackSpeedArray = readPlaybackSpeedArray(sp.getString( playbackSpeedArray = readPlaybackSpeedArray(sp.getString(
PREF_PLAYBACK_SPEED_ARRAY, null)); PREF_PLAYBACK_SPEED_ARRAY, null));
@ -344,6 +347,11 @@ public class UserPreferences implements
return instance.enableAutodownload; return instance.enableAutodownload;
} }
public static boolean isEnableAutodownloadOnBattery() {
instanceAvailable();
return instance.enableAutodownloadOnBattery;
}
public static boolean shouldPauseForFocusLoss() { public static boolean shouldPauseForFocusLoss() {
instanceAvailable(); instanceAvailable();
return instance.pauseForFocusLoss; return instance.pauseForFocusLoss;
@ -395,6 +403,8 @@ public class UserPreferences implements
PREF_EPISODE_CACHE_SIZE, "20")); PREF_EPISODE_CACHE_SIZE, "20"));
} else if (key.equals(PREF_ENABLE_AUTODL)) { } else if (key.equals(PREF_ENABLE_AUTODL)) {
enableAutodownload = sp.getBoolean(PREF_ENABLE_AUTODL, false); enableAutodownload = sp.getBoolean(PREF_ENABLE_AUTODL, false);
} else if (key.equals(PREF_ENABLE_AUTODL_ON_BATTERY)) {
enableAutodownloadOnBattery = sp.getBoolean(PREF_ENABLE_AUTODL_ON_BATTERY, true);
} else if (key.equals(PREF_PLAYBACK_SPEED)) { } else if (key.equals(PREF_PLAYBACK_SPEED)) {
playbackSpeed = sp.getString(PREF_PLAYBACK_SPEED, "1.0"); playbackSpeed = sp.getString(PREF_PLAYBACK_SPEED, "1.0");
} else if (key.equals(PREF_PLAYBACK_SPEED_ARRAY)) { } else if (key.equals(PREF_PLAYBACK_SPEED_ARRAY)) {

View File

@ -36,6 +36,7 @@ import de.danoeh.antennapod.core.service.download.DownloadStatus;
import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.service.playback.PlaybackService;
import de.danoeh.antennapod.core.util.DownloadError; import de.danoeh.antennapod.core.util.DownloadError;
import de.danoeh.antennapod.core.util.NetworkUtils; import de.danoeh.antennapod.core.util.NetworkUtils;
import de.danoeh.antennapod.core.util.PowerUtils;
import de.danoeh.antennapod.core.util.QueueAccess; import de.danoeh.antennapod.core.util.QueueAccess;
import de.danoeh.antennapod.core.util.comparator.FeedItemPubdateComparator; import de.danoeh.antennapod.core.util.comparator.FeedItemPubdateComparator;
import de.danoeh.antennapod.core.util.exception.MediaFileNotFoundException; import de.danoeh.antennapod.core.util.exception.MediaFileNotFoundException;
@ -449,7 +450,8 @@ public final class DBTasks {
/** /**
* Looks for undownloaded episodes in the queue or list of unread items and request a download if * Looks for undownloaded episodes in the queue or list of unread items and request a download if
* 1. Network is available * 1. Network is available
* 2. There is free space in the episode cache * 2. The device is charging or the user allows auto download on battery
* 3. There is free space in the episode cache
* This method is executed on an internal single thread executor. * This method is executed on an internal single thread executor.
* *
* @param context Used for accessing the DB. * @param context Used for accessing the DB.
@ -463,8 +465,10 @@ public final class DBTasks {
public void run() { public void run() {
if (BuildConfig.DEBUG) if (BuildConfig.DEBUG)
Log.d(TAG, "Performing auto-dl of undownloaded episodes"); Log.d(TAG, "Performing auto-dl of undownloaded episodes");
if (NetworkUtils.autodownloadNetworkAvailable(context) if ((NetworkUtils.autodownloadNetworkAvailable(context)
&& UserPreferences.isEnableAutodownload()) { && UserPreferences.isEnableAutodownload())
&& (PowerUtils.deviceCharging(context)
|| UserPreferences.isEnableAutodownloadOnBattery())) {
final List<FeedItem> queue = DBReader.getQueue(context); final List<FeedItem> queue = DBReader.getQueue(context);
final List<FeedItem> unreadItems = DBReader final List<FeedItem> unreadItems = DBReader
.getUnreadItemsList(context); .getUnreadItemsList(context);

View File

@ -0,0 +1,32 @@
package de.danoeh.antennapod.core.util;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
/**
* Created by Tom on 1/5/15.
*/
public class PowerUtils {
private static final String TAG = "PowerUtils";
private PowerUtils() {
}
/**
* @return true if the device is charging
*/
public static boolean deviceCharging(Context context) {
// from http://developer.android.com/training/monitoring-device-state/battery-monitoring.html
IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, iFilter);
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
return (status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL);
}
}

View File

@ -235,6 +235,8 @@
<string name="pref_automatic_download_sum">Configure the automatic download of episodes.</string> <string name="pref_automatic_download_sum">Configure the automatic download of episodes.</string>
<string name="pref_autodl_wifi_filter_title">Enable Wi-Fi filter</string> <string name="pref_autodl_wifi_filter_title">Enable Wi-Fi filter</string>
<string name="pref_autodl_wifi_filter_sum">Allow automatic download only for selected Wi-Fi networks.</string> <string name="pref_autodl_wifi_filter_sum">Allow automatic download only for selected Wi-Fi networks.</string>
<string name="pref_automatic_download_on_battery_title">Automatic download on battery</string>
<string name="pref_automatic_download_on_battery_sum">Allow automatic download while on battery</string>
<string name="pref_episode_cache_title">Episode cache</string> <string name="pref_episode_cache_title">Episode cache</string>
<string name="pref_theme_title_light">Light</string> <string name="pref_theme_title_light">Light</string>
<string name="pref_theme_title_dark">Dark</string> <string name="pref_theme_title_dark">Dark</string>