Add feed preference to include/exclude certain feeds from auto downloads

This commit is contained in:
Michael Kaiser 2013-10-08 17:23:04 +02:00
parent 3a777628dc
commit cb56bf053c
8 changed files with 97 additions and 54 deletions

View File

@ -93,6 +93,18 @@
android:layout_below="@id/txtvAuthor"
android:layout_margin="8dp"
android:layout_toRightOf="@id/center_divider" />
<CheckBox
android:id="@+id/cbxAutoDownload"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@id/txtvLanguage"
android:layout_margin="8dp"
android:text="@string/auto_download_label"
android:enabled="false"
android:textStyle="bold" />
</RelativeLayout>
<TextView

View File

@ -51,6 +51,7 @@
<string name="image_of_prefix">Image of:\u0020</string>
<string name="save_username_password_label">Save username and password</string>
<string name="close_label">Close</string>
<string name="auto_download_label">Include in auto downloads</string>
<!-- 'Add Feed' Activity labels -->

View File

@ -7,6 +7,8 @@ import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
import de.danoeh.antennapod.AppConfig;
@ -35,6 +37,7 @@ public class FeedInfoActivity extends ActionBarActivity {
private TextView txtvDescription;
private TextView txtvLanguage;
private TextView txtvAuthor;
private CheckBox cbxAutoDownload;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -44,6 +47,13 @@ public class FeedInfoActivity extends ActionBarActivity {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
long feedId = getIntent().getLongExtra(EXTRA_FEED_ID, -1);
imgvCover = (ImageView) findViewById(R.id.imgvCover);
txtvTitle = (TextView) findViewById(R.id.txtvTitle);
txtvDescription = (TextView) findViewById(R.id.txtvDescription);
txtvLanguage = (TextView) findViewById(R.id.txtvLanguage);
txtvAuthor = (TextView) findViewById(R.id.txtvAuthor);
cbxAutoDownload = (CheckBox) findViewById(R.id.cbxAutoDownload);
AsyncTask<Long, Void, Feed> loadTask = new AsyncTask<Long, Void, Feed>() {
@Override
@ -53,18 +63,12 @@ public class FeedInfoActivity extends ActionBarActivity {
@Override
protected void onPostExecute(Feed result) {
super.onPostExecute(result);
if (result != null) {
feed = result;
if (AppConfig.DEBUG)
Log.d(TAG, "Language is " + feed.getLanguage());
if (AppConfig.DEBUG)
Log.d(TAG, "Author is " + feed.getAuthor());
imgvCover = (ImageView) findViewById(R.id.imgvCover);
txtvTitle = (TextView) findViewById(R.id.txtvTitle);
txtvDescription = (TextView) findViewById(R.id.txtvDescription);
txtvLanguage = (TextView) findViewById(R.id.txtvLanguage);
txtvAuthor = (TextView) findViewById(R.id.txtvAuthor);
imgvCover.post(new Runnable() {
@Override
@ -83,6 +87,17 @@ public class FeedInfoActivity extends ActionBarActivity {
txtvLanguage.setText(LangUtils
.getLanguageString(feed.getLanguage()));
}
cbxAutoDownload.setEnabled(UserPreferences.isEnableAutodownload());
cbxAutoDownload.setChecked(feed.getPreferences().getAutoDownload());
cbxAutoDownload.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
feed.getPreferences().setAutoDownload(checked);
feed.savePreferences(FeedInfoActivity.this);
}
});
supportInvalidateOptionsMenu();
} else {

View File

@ -1,11 +1,14 @@
package de.danoeh.antennapod.feed;
import android.content.Context;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import de.danoeh.antennapod.preferences.UserPreferences;
import de.danoeh.antennapod.storage.DBWriter;
import de.danoeh.antennapod.util.EpisodeFilter;
/**
@ -46,6 +49,11 @@ public class Feed extends FeedFile {
*/
private String type;
/**
* Feed preferences
*/
private FeedPreferences preferences;
/**
* This constructor is used for restoring a feed from the database.
*/
@ -366,4 +374,15 @@ public class Feed extends FeedFile {
this.type = type;
}
public void setPreferences(FeedPreferences preferences) {
this.preferences = preferences;
}
public FeedPreferences getPreferences() {
return preferences;
}
public void savePreferences(Context context) {
DBWriter.setFeedPreferences(context, preferences);
}
}

View File

@ -1,14 +1,20 @@
package de.danoeh.antennapod.feed;
import android.content.Context;
import de.danoeh.antennapod.storage.DBWriter;
/**
* Contains preferences for a single feed.
*/
public class FeedPreferences {
private long feedID;
private boolean autoDownload;
public FeedPreferences(long feedID) {
public FeedPreferences(long feedID, boolean autoDownload) {
this.feedID = feedID;
this.autoDownload = autoDownload;
}
public long getFeedID() {
@ -18,4 +24,16 @@ public class FeedPreferences {
public void setFeedID(long feedID) {
this.feedID = feedID;
}
public boolean getAutoDownload() {
return autoDownload;
}
public void setAutoDownload(boolean autoDownload) {
this.autoDownload = autoDownload;
}
public void save(Context context) {
DBWriter.setFeedPreferences(context, this);
}
}

View File

@ -333,6 +333,11 @@ public final class DBReader {
if (image != null) {
image.setFeed(feed);
}
FeedPreferences preferences = new FeedPreferences(cursor.getLong(PodDBAdapter.IDX_FEED_SEL_STD_ID),
cursor.getInt(PodDBAdapter.IDX_FEED_SEL_PREFERENCES_AUTO_DOWNLOAD) > 0);
feed.setPreferences(preferences);
return feed;
}
@ -768,29 +773,4 @@ public final class DBReader {
return media;
}
private static FeedPreferences extractFeedPreferencesFromCursorRow(final Cursor cursor) {
return new FeedPreferences(cursor.getLong(PodDBAdapter.IDX_FEED_SEL_PREFERENCES_ID));
}
/**
* Loads the FeedPreferences-object of a specific Feed from the database.
*
* @param context A context that is used for opening a database connection.
* @param feedID ID of the Feed.
* @return The FeedPreferences of the Feed with the given ID or null if the no Feed could be found.
*/
public static FeedPreferences getFeedPreferencesOfFeed(final Context context, final long feedID) {
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
Cursor prefCursor = adapter.getFeedPreferenceCursor(feedID);
if (prefCursor.moveToFirst()) {
FeedPreferences result = extractFeedPreferencesFromCursorRow(prefCursor);
prefCursor.close();
return result;
} else {
return null;
}
}
}

View File

@ -324,12 +324,14 @@ public final class DBTasks {
int counter = 0;
for (FeedItem item : queue) {
if (item.hasMedia() && !item.getMedia().isDownloaded()
&& !item.getMedia().isPlaying()) {
&& !item.getMedia().isPlaying()
&& item.getFeed().getPreferences().getAutoDownload()) {
counter++;
}
}
for (FeedItem item : unreadItems) {
if (item.hasMedia() && !item.getMedia().isDownloaded()) {
if (item.hasMedia() && !item.getMedia().isDownloaded()
&& item.getFeed().getPreferences().getAutoDownload()) {
counter++;
}
}
@ -375,7 +377,8 @@ public final class DBTasks {
for (int i = 0; i < queue.size(); i++) { // ignore playing item
FeedItem item = queue.get(i);
if (item.hasMedia() && !item.getMedia().isDownloaded()
&& !item.getMedia().isPlaying()) {
&& !item.getMedia().isPlaying()
&& item.getFeed().getPreferences().getAutoDownload()) {
itemsToDownload.add(item);
episodeSpaceLeft--;
undownloadedEpisodes--;
@ -387,7 +390,8 @@ public final class DBTasks {
}
if (episodeSpaceLeft > 0 && undownloadedEpisodes > 0) {
for (FeedItem item : unreadItems) {
if (item.hasMedia() && !item.getMedia().isDownloaded()) {
if (item.hasMedia() && !item.getMedia().isDownloaded()
&& item.getFeed().getPreferences().getAutoDownload()) {
itemsToDownload.add(item);
episodeSpaceLeft--;
undownloadedEpisodes--;

View File

@ -24,7 +24,7 @@ import de.danoeh.antennapod.service.download.DownloadStatus;
*/
public class PodDBAdapter {
private static final String TAG = "PodDBAdapter";
private static final int DATABASE_VERSION = 9;
private static final int DATABASE_VERSION = 10;
public static final String DATABASE_NAME = "Antennapod.db";
/**
@ -124,6 +124,7 @@ public class PodDBAdapter {
public static final String KEY_DOWNLOADSTATUS_TITLE = "title";
public static final String KEY_CHAPTER_TYPE = "type";
public static final String KEY_PLAYBACK_COMPLETION_DATE = "playback_completion_date";
public static final String KEY_AUTO_DOWNLOAD = "auto_download";
// Table names
public static final String TABLE_NAME_FEEDS = "Feeds";
@ -145,8 +146,7 @@ public class PodDBAdapter {
+ KEY_DESCRIPTION + " TEXT," + KEY_PAYMENT_LINK + " TEXT,"
+ KEY_LASTUPDATE + " TEXT," + KEY_LANGUAGE + " TEXT," + KEY_AUTHOR
+ " TEXT," + KEY_IMAGE + " INTEGER," + KEY_TYPE + " TEXT,"
+ KEY_FEED_IDENTIFIER + " TEXT)";
;
+ KEY_FEED_IDENTIFIER + " TEXT," + KEY_AUTO_DOWNLOAD + " INTEGER DEFAULT 1)";
private static final String CREATE_TABLE_FEED_ITEMS = "CREATE TABLE "
+ TABLE_NAME_FEED_ITEMS + " (" + TABLE_PRIMARY_KEY + KEY_TITLE
@ -206,7 +206,8 @@ public class PodDBAdapter {
TABLE_NAME_FEEDS + "." + KEY_AUTHOR,
TABLE_NAME_FEEDS + "." + KEY_IMAGE,
TABLE_NAME_FEEDS + "." + KEY_TYPE,
TABLE_NAME_FEEDS + "." + KEY_FEED_IDENTIFIER
TABLE_NAME_FEEDS + "." + KEY_FEED_IDENTIFIER,
TABLE_NAME_FEEDS + "." + KEY_AUTO_DOWNLOAD,
};
// column indices for FEED_SEL_STD
@ -224,17 +225,8 @@ public class PodDBAdapter {
public static final int IDX_FEED_SEL_STD_IMAGE = 11;
public static final int IDX_FEED_SEL_STD_TYPE = 12;
public static final int IDX_FEED_SEL_STD_FEED_IDENTIFIER = 13;
public static final int IDX_FEED_SEL_PREFERENCES_AUTO_DOWNLOAD = 14;
/**
* Select all preference-columns from the feed table
*/
private static final String[] FEED_SEL_PREFERENCES = {
TABLE_NAME_FEEDS + "." + KEY_ID,
// enter preferences here
};
// column indices for FEED_SEL_PREFERENCES
public static final int IDX_FEED_SEL_PREFERENCES_ID = 0;
/**
* Select all columns from the feeditems-table except description and
@ -373,6 +365,7 @@ public class PodDBAdapter {
throw new IllegalArgumentException("Feed ID of preference must not be null");
}
ContentValues values = new ContentValues();
values.put(KEY_AUTO_DOWNLOAD, prefs.getAutoDownload());
db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", new String[]{String.valueOf(prefs.getFeedID())});
}
@ -930,10 +923,6 @@ public class PodDBAdapter {
return c;
}
public final Cursor getFeedPreferenceCursor(final long feedID) {
return db.query(TABLE_NAME_FEEDS, FEED_SEL_PREFERENCES, KEY_ID + "=" + feedID, null, null, null, null);
}
public final Cursor getFeedItemCursor(final String... ids) {
if (ids.length > IN_OPERATOR_MAXIMUM) {
throw new IllegalArgumentException(
@ -1173,6 +1162,11 @@ public class PodDBAdapter {
}
feeditemCursor.close();
}
if (oldVersion <= 9) {
db.execSQL("ALTER TABLE " + TABLE_NAME_FEEDS
+ " ADD COLUMN " + KEY_AUTO_DOWNLOAD
+ " INTEGER DEFAULT 1");
}
}
}
}