Add feed preference to include/exclude certain feeds from auto downloads
This commit is contained in:
parent
3a777628dc
commit
cb56bf053c
|
@ -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
|
||||||
|
|
|
@ -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 -->
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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--;
|
||||||
|
|
|
@ -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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue