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_below="@id/txtvAuthor"
android:layout_margin="8dp" android:layout_margin="8dp"
android:layout_toRightOf="@id/center_divider" /> 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> </RelativeLayout>
<TextView <TextView

View File

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

View File

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

View File

@ -1,11 +1,14 @@
package de.danoeh.antennapod.feed; package de.danoeh.antennapod.feed;
import android.content.Context;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import de.danoeh.antennapod.preferences.UserPreferences; import de.danoeh.antennapod.preferences.UserPreferences;
import de.danoeh.antennapod.storage.DBWriter;
import de.danoeh.antennapod.util.EpisodeFilter; import de.danoeh.antennapod.util.EpisodeFilter;
/** /**
@ -46,6 +49,11 @@ public class Feed extends FeedFile {
*/ */
private String type; private String type;
/**
* Feed preferences
*/
private FeedPreferences preferences;
/** /**
* This constructor is used for restoring a feed from the database. * This constructor is used for restoring a feed from the database.
*/ */
@ -366,4 +374,15 @@ public class Feed extends FeedFile {
this.type = type; 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; package de.danoeh.antennapod.feed;
import android.content.Context;
import de.danoeh.antennapod.storage.DBWriter;
/** /**
* Contains preferences for a single feed. * Contains preferences for a single feed.
*/ */
public class FeedPreferences { public class FeedPreferences {
private long feedID; private long feedID;
private boolean autoDownload;
public FeedPreferences(long feedID) { public FeedPreferences(long feedID, boolean autoDownload) {
this.feedID = feedID; this.feedID = feedID;
this.autoDownload = autoDownload;
} }
public long getFeedID() { public long getFeedID() {
@ -18,4 +24,16 @@ public class FeedPreferences {
public void setFeedID(long feedID) { public void setFeedID(long feedID) {
this.feedID = 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) { if (image != null) {
image.setFeed(feed); 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; return feed;
} }
@ -768,29 +773,4 @@ public final class DBReader {
return media; 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; int counter = 0;
for (FeedItem item : queue) { for (FeedItem item : queue) {
if (item.hasMedia() && !item.getMedia().isDownloaded() if (item.hasMedia() && !item.getMedia().isDownloaded()
&& !item.getMedia().isPlaying()) { && !item.getMedia().isPlaying()
&& item.getFeed().getPreferences().getAutoDownload()) {
counter++; counter++;
} }
} }
for (FeedItem item : unreadItems) { for (FeedItem item : unreadItems) {
if (item.hasMedia() && !item.getMedia().isDownloaded()) { if (item.hasMedia() && !item.getMedia().isDownloaded()
&& item.getFeed().getPreferences().getAutoDownload()) {
counter++; counter++;
} }
} }
@ -375,7 +377,8 @@ public final class DBTasks {
for (int i = 0; i < queue.size(); i++) { // ignore playing item for (int i = 0; i < queue.size(); i++) { // ignore playing item
FeedItem item = queue.get(i); FeedItem item = queue.get(i);
if (item.hasMedia() && !item.getMedia().isDownloaded() if (item.hasMedia() && !item.getMedia().isDownloaded()
&& !item.getMedia().isPlaying()) { && !item.getMedia().isPlaying()
&& item.getFeed().getPreferences().getAutoDownload()) {
itemsToDownload.add(item); itemsToDownload.add(item);
episodeSpaceLeft--; episodeSpaceLeft--;
undownloadedEpisodes--; undownloadedEpisodes--;
@ -387,7 +390,8 @@ public final class DBTasks {
} }
if (episodeSpaceLeft > 0 && undownloadedEpisodes > 0) { if (episodeSpaceLeft > 0 && undownloadedEpisodes > 0) {
for (FeedItem item : unreadItems) { for (FeedItem item : unreadItems) {
if (item.hasMedia() && !item.getMedia().isDownloaded()) { if (item.hasMedia() && !item.getMedia().isDownloaded()
&& item.getFeed().getPreferences().getAutoDownload()) {
itemsToDownload.add(item); itemsToDownload.add(item);
episodeSpaceLeft--; episodeSpaceLeft--;
undownloadedEpisodes--; undownloadedEpisodes--;

View File

@ -24,7 +24,7 @@ import de.danoeh.antennapod.service.download.DownloadStatus;
*/ */
public class PodDBAdapter { public class PodDBAdapter {
private static final String TAG = "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"; 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_DOWNLOADSTATUS_TITLE = "title";
public static final String KEY_CHAPTER_TYPE = "type"; public static final String KEY_CHAPTER_TYPE = "type";
public static final String KEY_PLAYBACK_COMPLETION_DATE = "playback_completion_date"; public static final String KEY_PLAYBACK_COMPLETION_DATE = "playback_completion_date";
public static final String KEY_AUTO_DOWNLOAD = "auto_download";
// Table names // Table names
public static final String TABLE_NAME_FEEDS = "Feeds"; public static final String TABLE_NAME_FEEDS = "Feeds";
@ -145,8 +146,7 @@ public class PodDBAdapter {
+ KEY_DESCRIPTION + " TEXT," + KEY_PAYMENT_LINK + " TEXT," + KEY_DESCRIPTION + " TEXT," + KEY_PAYMENT_LINK + " TEXT,"
+ KEY_LASTUPDATE + " TEXT," + KEY_LANGUAGE + " TEXT," + KEY_AUTHOR + KEY_LASTUPDATE + " TEXT," + KEY_LANGUAGE + " TEXT," + KEY_AUTHOR
+ " TEXT," + KEY_IMAGE + " INTEGER," + KEY_TYPE + " TEXT," + " 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 " private static final String CREATE_TABLE_FEED_ITEMS = "CREATE TABLE "
+ TABLE_NAME_FEED_ITEMS + " (" + TABLE_PRIMARY_KEY + KEY_TITLE + 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_AUTHOR,
TABLE_NAME_FEEDS + "." + KEY_IMAGE, TABLE_NAME_FEEDS + "." + KEY_IMAGE,
TABLE_NAME_FEEDS + "." + KEY_TYPE, 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 // 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_IMAGE = 11;
public static final int IDX_FEED_SEL_STD_TYPE = 12; 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_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 * 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"); throw new IllegalArgumentException("Feed ID of preference must not be null");
} }
ContentValues values = new ContentValues(); 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())}); db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", new String[]{String.valueOf(prefs.getFeedID())});
} }
@ -930,10 +923,6 @@ public class PodDBAdapter {
return c; 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) { public final Cursor getFeedItemCursor(final String... ids) {
if (ids.length > IN_OPERATOR_MAXIMUM) { if (ids.length > IN_OPERATOR_MAXIMUM) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
@ -1173,6 +1162,11 @@ public class PodDBAdapter {
} }
feeditemCursor.close(); feeditemCursor.close();
} }
if (oldVersion <= 9) {
db.execSQL("ALTER TABLE " + TABLE_NAME_FEEDS
+ " ADD COLUMN " + KEY_AUTO_DOWNLOAD
+ " INTEGER DEFAULT 1");
}
} }
} }
} }