Added FeedPreferences class

This commit is contained in:
daniel oeh 2013-09-11 18:46:25 +02:00
parent c0c98dcfab
commit 3a777628dc
4 changed files with 98 additions and 22 deletions

View File

@ -0,0 +1,21 @@
package de.danoeh.antennapod.feed;
/**
* Contains preferences for a single feed.
*/
public class FeedPreferences {
private long feedID;
public FeedPreferences(long feedID) {
this.feedID = feedID;
}
public long getFeedID() {
return feedID;
}
public void setFeedID(long feedID) {
this.feedID = feedID;
}
}

View File

@ -10,14 +10,7 @@ import android.database.Cursor;
import android.database.SQLException; import android.database.SQLException;
import android.util.Log; import android.util.Log;
import de.danoeh.antennapod.AppConfig; import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.feed.Chapter; import de.danoeh.antennapod.feed.*;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.FeedImage;
import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.feed.FeedMedia;
import de.danoeh.antennapod.feed.ID3Chapter;
import de.danoeh.antennapod.feed.SimpleChapter;
import de.danoeh.antennapod.feed.VorbisCommentChapter;
import de.danoeh.antennapod.service.download.*; import de.danoeh.antennapod.service.download.*;
import de.danoeh.antennapod.util.DownloadError; import de.danoeh.antennapod.util.DownloadError;
import de.danoeh.antennapod.util.comparator.DownloadStatusComparator; import de.danoeh.antennapod.util.comparator.DownloadStatusComparator;
@ -28,7 +21,6 @@ import de.danoeh.antennapod.util.comparator.FeedItemPubdateComparator;
* In general, all database calls in DBReader-methods are executed on the caller's thread. * In general, all database calls in DBReader-methods are executed on the caller's thread.
* This means that the caller should make sure that DBReader-methods are not executed on the GUI-thread. * This means that the caller should make sure that DBReader-methods are not executed on the GUI-thread.
* This class will use the {@link de.danoeh.antennapod.feed.EventDistributor} to notify listeners about changes in the database. * This class will use the {@link de.danoeh.antennapod.feed.EventDistributor} to notify listeners about changes in the database.
*/ */
public final class DBReader { public final class DBReader {
private static final String TAG = "DBReader"; private static final String TAG = "DBReader";
@ -77,9 +69,10 @@ public final class DBReader {
/** /**
* Returns a list with the download URLs of all feeds. * Returns a list with the download URLs of all feeds.
*
* @param context A context that is used for opening the database connection. * @param context A context that is used for opening the database connection.
* @return A list of Strings with the download URLs of all feeds. * @return A list of Strings with the download URLs of all feeds.
* */ */
public static List<String> getFeedListDownloadUrls(final Context context) { public static List<String> getFeedListDownloadUrls(final Context context) {
PodDBAdapter adapter = new PodDBAdapter(context); PodDBAdapter adapter = new PodDBAdapter(context);
List<String> result = new ArrayList<String>(); List<String> result = new ArrayList<String>();
@ -337,7 +330,7 @@ public final class DBReader {
cursor.getString(PodDBAdapter.IDX_FEED_SEL_STD_DOWNLOAD_URL), cursor.getString(PodDBAdapter.IDX_FEED_SEL_STD_DOWNLOAD_URL),
cursor.getInt(PodDBAdapter.IDX_FEED_SEL_STD_DOWNLOADED) > 0); cursor.getInt(PodDBAdapter.IDX_FEED_SEL_STD_DOWNLOADED) > 0);
if (image != null) { if (image != null) {
image.setFeed(feed); image.setFeed(feed);
} }
return feed; return feed;
@ -775,4 +768,29 @@ 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

@ -729,7 +729,7 @@ public class DBWriter {
/** /**
* Updates download URLs of feeds from a given Map. The key of the Map is the original URL of the feed * Updates download URLs of feeds from a given Map. The key of the Map is the original URL of the feed
* and the value is the updated URL * and the value is the updated URL
* */ */
public static Future<?> updateFeedDownloadURLs(final Context context, final Map<String, String> urls) { public static Future<?> updateFeedDownloadURLs(final Context context, final Map<String, String> urls) {
return dbExec.submit(new Runnable() { return dbExec.submit(new Runnable() {
@Override @Override
@ -746,6 +746,24 @@ public class DBWriter {
}); });
} }
/**
* Saves a FeedPreferences object in the database. The Feed ID of the FeedPreferences-object MUST NOT be 0.
*
* @param context Used for opening a database connection.
* @param preferences The FeedPreferences object.
*/
public static Future<?> setFeedPreferences(final Context context, final FeedPreferences preferences) {
return dbExec.submit(new Runnable() {
@Override
public void run() {
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
adapter.setFeedPreferences(preferences);
adapter.close();
}
});
}
private static boolean itemListContains(List<FeedItem> items, long itemId) { private static boolean itemListContains(List<FeedItem> items, long itemId) {
for (FeedItem item : items) { for (FeedItem item : items) {
if (item.getId() == itemId) { if (item.getId() == itemId) {

View File

@ -14,11 +14,7 @@ import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log; import android.util.Log;
import de.danoeh.antennapod.AppConfig; import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.feed.Chapter; import de.danoeh.antennapod.feed.*;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.FeedImage;
import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.feed.FeedMedia;
import de.danoeh.antennapod.service.download.DownloadStatus; import de.danoeh.antennapod.service.download.DownloadStatus;
// TODO Remove media column from feeditem table // TODO Remove media column from feeditem table
@ -195,9 +191,9 @@ public class PodDBAdapter {
/** /**
* Select all columns from the feed-table except feed preferences. * Select all columns from the feed-table except feed preferences.
* */ */
private static final String[] FEED_SEL_STD = { private static final String[] FEED_SEL_STD = {
TABLE_NAME_FEEDS + "." + KEY_ID, TABLE_NAME_FEEDS + "." + KEY_ID,
TABLE_NAME_FEEDS + "." + KEY_TITLE, TABLE_NAME_FEEDS + "." + KEY_TITLE,
TABLE_NAME_FEEDS + "." + KEY_FILE_URL, TABLE_NAME_FEEDS + "." + KEY_FILE_URL,
TABLE_NAME_FEEDS + "." + KEY_DOWNLOAD_URL, TABLE_NAME_FEEDS + "." + KEY_DOWNLOAD_URL,
@ -229,6 +225,16 @@ public class PodDBAdapter {
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;
/**
* 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
@ -362,6 +368,14 @@ public class PodDBAdapter {
return feed.getId(); return feed.getId();
} }
public void setFeedPreferences(FeedPreferences prefs) {
if (prefs.getFeedID() == 0) {
throw new IllegalArgumentException("Feed ID of preference must not be null");
}
ContentValues values = new ContentValues();
db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", new String[]{String.valueOf(prefs.getFeedID())});
}
/** /**
* Inserts or updates an image entry * Inserts or updates an image entry
* *
@ -490,7 +504,8 @@ public class PodDBAdapter {
/** /**
* Inserts or updates a feeditem entry * Inserts or updates a feeditem entry
* @param item The FeedItem *
* @param item The FeedItem
* @param saveFeed true if the Feed of the item should also be saved. This should be set to * @param saveFeed true if the Feed of the item should also be saved. This should be set to
* false if the method is executed on a list of FeedItems of the same Feed. * false if the method is executed on a list of FeedItems of the same Feed.
* @return the id of the entry * @return the id of the entry
@ -521,7 +536,7 @@ public class PodDBAdapter {
new String[]{String.valueOf(item.getId())}); new String[]{String.valueOf(item.getId())});
} }
if (item.getMedia() != null) { if (item.getMedia() != null) {
setMedia(item.getMedia()); setMedia(item.getMedia());
} }
if (item.getChapters() != null) { if (item.getChapters() != null) {
setChapters(item); setChapters(item);
@ -797,7 +812,7 @@ public class PodDBAdapter {
"SELECT %s FROM %s INNER JOIN %s ON %s=%s ORDER BY %s", args); "SELECT %s FROM %s INNER JOIN %s ON %s=%s ORDER BY %s", args);
Cursor c = db.rawQuery(query, null); Cursor c = db.rawQuery(query, null);
/* /*
* Cursor c = db.query(TABLE_NAME_FEED_ITEMS, FEEDITEM_SEL_FI_SMALL, * Cursor c = db.query(TABLE_NAME_FEED_ITEMS, FEEDITEM_SEL_FI_SMALL,
* "INNER JOIN ? ON ?=?", new String[] { TABLE_NAME_QUEUE, * "INNER JOIN ? ON ?=?", new String[] { TABLE_NAME_QUEUE,
* TABLE_NAME_FEED_ITEMS + "." + KEY_ID, TABLE_NAME_QUEUE + "." + * TABLE_NAME_FEED_ITEMS + "." + KEY_ID, TABLE_NAME_QUEUE + "." +
* KEY_FEEDITEM }, null, null, TABLE_NAME_QUEUE + "." + KEY_FEEDITEM); * KEY_FEEDITEM }, null, null, TABLE_NAME_QUEUE + "." + KEY_FEEDITEM);
@ -915,6 +930,10 @@ 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(