Added support for id-tag in Atom's feed-element

This commit is contained in:
daniel oeh 2012-09-02 15:18:47 +02:00
parent 7e97934764
commit 6ed19acd34
5 changed files with 99 additions and 76 deletions

View File

@ -19,6 +19,8 @@ public class Feed extends FeedFile {
public static final String TYPE_ATOM1 = "atom"; public static final String TYPE_ATOM1 = "atom";
private String title; private String title;
/** Contains 'id'-element in Atom feed. */
private String feedIdentifier;
/** Link to the website. */ /** Link to the website. */
private String link; private String link;
private String description; private String description;
@ -116,6 +118,22 @@ public class Feed extends FeedFile {
return count; return count;
} }
/**
* Returns the value that uniquely identifies this Feed. If the
* feedIdentifier attribute is not null, it will be returned. Else it will
* try to return the link. If the link is not given, it will use the title
* of the entry.
* */
public String getIdentifyingValue() {
if (feedIdentifier != null) {
return feedIdentifier;
} else if (link != null) {
return link;
} else {
return title;
}
}
public String getTitle() { public String getTitle() {
return title; return title;
} }
@ -172,6 +190,14 @@ public class Feed extends FeedFile {
this.lastUpdate = lastUpdate; this.lastUpdate = lastUpdate;
} }
public String getFeedIdentifier() {
return feedIdentifier;
}
public void setFeedIdentifier(String feedIdentifier) {
this.feedIdentifier = feedIdentifier;
}
public String getPaymentLink() { public String getPaymentLink() {
return paymentLink; return paymentLink;
} }

View File

@ -502,7 +502,8 @@ public class FeedManager {
*/ */
public Feed updateFeed(Context context, final Feed newFeed) { public Feed updateFeed(Context context, final Feed newFeed) {
// Look up feed in the feedslist // Look up feed in the feedslist
final Feed savedFeed = searchFeedByLink(newFeed.getLink()); final Feed savedFeed = searchFeedByIdentifyingValue(newFeed
.getIdentifyingValue());
if (savedFeed == null) { if (savedFeed == null) {
if (AppConfig.DEBUG) if (AppConfig.DEBUG)
Log.d(TAG, Log.d(TAG,
@ -544,9 +545,9 @@ public class FeedManager {
} }
/** Get a Feed by its link */ /** Get a Feed by its link */
private Feed searchFeedByLink(String link) { private Feed searchFeedByIdentifyingValue(String identifier) {
for (Feed feed : feeds) { for (Feed feed : feeds) {
if (feed.getLink().equals(link)) { if (feed.getIdentifyingValue().equals(identifier)) {
return feed; return feed;
} }
} }
@ -804,6 +805,8 @@ public class FeedManager {
.getString(PodDBAdapter.KEY_LANGUAGE_INDEX)); .getString(PodDBAdapter.KEY_LANGUAGE_INDEX));
feed.setType(feedlistCursor feed.setType(feedlistCursor
.getString(PodDBAdapter.KEY_TYPE_INDEX)); .getString(PodDBAdapter.KEY_TYPE_INDEX));
feed.setFeedIdentifier(feedlistCursor
.getString(PodDBAdapter.KEY_FEED_IDENTIFIER_INDEX));
long imageIndex = feedlistCursor long imageIndex = feedlistCursor
.getLong(PodDBAdapter.KEY_IMAGE_INDEX); .getLong(PodDBAdapter.KEY_IMAGE_INDEX);
if (imageIndex != 0) { if (imageIndex != 0) {

View File

@ -25,11 +25,10 @@ import android.util.Log;
* */ * */
public class PodDBAdapter { public class PodDBAdapter {
private static final String TAG = "PodDBAdapter"; private static final String TAG = "PodDBAdapter";
private static final int DATABASE_VERSION = 4; private static final int DATABASE_VERSION = 5;
private static final String DATABASE_NAME = "Antennapod.db"; private static final String DATABASE_NAME = "Antennapod.db";
// ----------- Column indices
// ----------- Column indices
// ----------- General indices // ----------- General indices
public static final int KEY_ID_INDEX = 0; public static final int KEY_ID_INDEX = 0;
public static final int KEY_TITLE_INDEX = 1; public static final int KEY_TITLE_INDEX = 1;
@ -45,6 +44,7 @@ public class PodDBAdapter {
public static final int KEY_AUTHOR_INDEX = 10; public static final int KEY_AUTHOR_INDEX = 10;
public static final int KEY_IMAGE_INDEX = 11; public static final int KEY_IMAGE_INDEX = 11;
public static final int KEY_TYPE_INDEX = 12; public static final int KEY_TYPE_INDEX = 12;
public static final int KEY_FEED_IDENTIFIER_INDEX = 13;
// ----------- FeedItem indices // ----------- FeedItem indices
public static final int KEY_CONTENT_ENCODED_INDEX = 2; public static final int KEY_CONTENT_ENCODED_INDEX = 2;
public static final int KEY_PUBDATE_INDEX = 3; public static final int KEY_PUBDATE_INDEX = 3;
@ -72,7 +72,6 @@ public class PodDBAdapter {
public static final int KEY_SC_FEEDITEM_INDEX = 3; public static final int KEY_SC_FEEDITEM_INDEX = 3;
public static final int KEY_SC_LINK_INDEX = 4; public static final int KEY_SC_LINK_INDEX = 4;
// Key-constants // Key-constants
public static final String KEY_ID = "id"; public static final String KEY_ID = "id";
public static final String KEY_TITLE = "title"; public static final String KEY_TITLE = "title";
@ -106,6 +105,7 @@ public class PodDBAdapter {
public static final String KEY_HAS_SIMPLECHAPTERS = "has_simple_chapters"; public static final String KEY_HAS_SIMPLECHAPTERS = "has_simple_chapters";
public static final String KEY_TYPE = "type"; public static final String KEY_TYPE = "type";
public static final String KEY_ITEM_IDENTIFIER = "item_identifier"; public static final String KEY_ITEM_IDENTIFIER = "item_identifier";
public static final String KEY_FEED_IDENTIFIER = "feed_identifier";
// Table names // Table names
public static final String TABLE_NAME_FEEDS = "Feeds"; public static final String TABLE_NAME_FEEDS = "Feeds";
@ -121,71 +121,48 @@ public class PodDBAdapter {
+ " INTEGER PRIMARY KEY AUTOINCREMENT ,"; + " INTEGER PRIMARY KEY AUTOINCREMENT ,";
private static final String CREATE_TABLE_FEEDS = "CREATE TABLE " private static final String CREATE_TABLE_FEEDS = "CREATE TABLE "
+ TABLE_NAME_FEEDS + " (" + TABLE_PRIMARY_KEY + + TABLE_NAME_FEEDS + " (" + TABLE_PRIMARY_KEY + KEY_TITLE
KEY_TITLE + " TEXT," + + " TEXT," + KEY_FILE_URL + " TEXT," + KEY_DOWNLOAD_URL + " TEXT,"
KEY_FILE_URL + " TEXT," + + KEY_DOWNLOADED + " INTEGER," + KEY_LINK + " TEXT,"
KEY_DOWNLOAD_URL + " TEXT," + + KEY_DESCRIPTION + " TEXT," + KEY_PAYMENT_LINK + " TEXT,"
KEY_DOWNLOADED + " INTEGER," + + KEY_LASTUPDATE + " TEXT," + KEY_LANGUAGE + " TEXT," + KEY_AUTHOR
KEY_LINK + " TEXT," + + " TEXT," + KEY_IMAGE + " INTEGER," + KEY_TYPE + " TEXT,"
KEY_DESCRIPTION + " TEXT," + + KEY_FEED_IDENTIFIER + " TEXT)";;
KEY_PAYMENT_LINK + " TEXT," +
KEY_LASTUPDATE + " TEXT," +
KEY_LANGUAGE + " TEXT," +
KEY_AUTHOR + " TEXT," +
KEY_IMAGE + " INTEGER," +
KEY_TYPE + " TEXT)";
;
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 + + TABLE_NAME_FEED_ITEMS + " (" + TABLE_PRIMARY_KEY + KEY_TITLE
KEY_TITLE + " TEXT," + + " TEXT," + KEY_CONTENT_ENCODED + " TEXT," + KEY_PUBDATE
KEY_CONTENT_ENCODED + " TEXT," + + " INTEGER," + KEY_READ + " INTEGER," + KEY_LINK + " TEXT,"
KEY_PUBDATE + " INTEGER," + + KEY_DESCRIPTION + " TEXT," + KEY_PAYMENT_LINK + " TEXT,"
KEY_READ + " INTEGER," + + KEY_MEDIA + " INTEGER," + KEY_FEED + " INTEGER,"
KEY_LINK + " TEXT," + + KEY_HAS_SIMPLECHAPTERS + " INTEGER," + KEY_ITEM_IDENTIFIER
KEY_DESCRIPTION + " TEXT," + + " TEXT)";
KEY_PAYMENT_LINK + " TEXT," +
KEY_MEDIA + " INTEGER," +
KEY_FEED + " INTEGER," +
KEY_HAS_SIMPLECHAPTERS + " INTEGER," +
KEY_ITEM_IDENTIFIER + " TEXT)";
private static final String CREATE_TABLE_FEED_IMAGES = "CREATE TABLE " private static final String CREATE_TABLE_FEED_IMAGES = "CREATE TABLE "
+ TABLE_NAME_FEED_IMAGES + " (" + TABLE_PRIMARY_KEY + + TABLE_NAME_FEED_IMAGES + " (" + TABLE_PRIMARY_KEY + KEY_TITLE
KEY_TITLE + " TEXT," + + " TEXT," + KEY_FILE_URL + " TEXT," + KEY_DOWNLOAD_URL + " TEXT,"
KEY_FILE_URL + " TEXT," +
KEY_DOWNLOAD_URL + " TEXT,"
+ KEY_DOWNLOADED + " INTEGER)"; + KEY_DOWNLOADED + " INTEGER)";
private static final String CREATE_TABLE_FEED_MEDIA = "CREATE TABLE " private static final String CREATE_TABLE_FEED_MEDIA = "CREATE TABLE "
+ TABLE_NAME_FEED_MEDIA + " (" + TABLE_PRIMARY_KEY + + TABLE_NAME_FEED_MEDIA + " (" + TABLE_PRIMARY_KEY + KEY_DURATION
KEY_DURATION + " INTEGER," + + " INTEGER," + KEY_FILE_URL + " TEXT," + KEY_DOWNLOAD_URL
KEY_FILE_URL + " TEXT," + + " TEXT," + KEY_DOWNLOADED + " INTEGER," + KEY_POSITION
KEY_DOWNLOAD_URL + " TEXT," + + " INTEGER," + KEY_SIZE + " INTEGER," + KEY_MIME_TYPE + " TEXT)";
KEY_DOWNLOADED + " INTEGER," +
KEY_POSITION + " INTEGER," +
KEY_SIZE + " INTEGER," +
KEY_MIME_TYPE + " TEXT)";
private static final String CREATE_TABLE_DOWNLOAD_LOG = "CREATE TABLE " private static final String CREATE_TABLE_DOWNLOAD_LOG = "CREATE TABLE "
+ TABLE_NAME_DOWNLOAD_LOG + " (" + TABLE_PRIMARY_KEY + + TABLE_NAME_DOWNLOAD_LOG + " (" + TABLE_PRIMARY_KEY + KEY_FEEDFILE
KEY_FEEDFILE + " INTEGER," + + " INTEGER," + KEY_FEEDFILETYPE + " INTEGER," + KEY_REASON
KEY_FEEDFILETYPE + " INTEGER," + + " INTEGER," + KEY_SUCCESSFUL + " INTEGER," + KEY_COMPLETION_DATE
KEY_REASON + " INTEGER," + + " INTEGER)";
KEY_SUCCESSFUL + " INTEGER," +
KEY_COMPLETION_DATE + " INTEGER)";
private static final String CREATE_TABLE_QUEUE = "CREATE TABLE " private static final String CREATE_TABLE_QUEUE = "CREATE TABLE "
+ TABLE_NAME_QUEUE + "(" + KEY_ID + " INTEGER PRIMARY KEY," + TABLE_NAME_QUEUE + "(" + KEY_ID + " INTEGER PRIMARY KEY,"
+ KEY_FEEDITEM + " INTEGER," + KEY_FEED + " INTEGER)"; + KEY_FEEDITEM + " INTEGER," + KEY_FEED + " INTEGER)";
private static final String CREATE_TABLE_SIMPLECHAPTERS = "CREATE TABLE " private static final String CREATE_TABLE_SIMPLECHAPTERS = "CREATE TABLE "
+ TABLE_NAME_SIMPLECHAPTERS + " (" + TABLE_PRIMARY_KEY + + TABLE_NAME_SIMPLECHAPTERS + " (" + TABLE_PRIMARY_KEY + KEY_TITLE
KEY_TITLE + " TEXT," + + " TEXT," + KEY_START + " INTEGER," + KEY_FEEDITEM + " INTEGER,"
KEY_START + " INTEGER," + + KEY_LINK + " TEXT)";
KEY_FEEDITEM + " INTEGER," +
KEY_LINK + " TEXT)";
/** /**
* Used for storing download status entries to determine the type of the * Used for storing download status entries to determine the type of the
@ -206,7 +183,8 @@ public class PodDBAdapter {
public PodDBAdapter open() { public PodDBAdapter open() {
if (db == null || !db.isOpen() || db.isReadOnly()) { if (db == null || !db.isOpen() || db.isReadOnly()) {
if (AppConfig.DEBUG) Log.d(TAG, "Opening DB"); if (AppConfig.DEBUG)
Log.d(TAG, "Opening DB");
try { try {
db = helper.getWritableDatabase(); db = helper.getWritableDatabase();
} catch (SQLException ex) { } catch (SQLException ex) {
@ -218,7 +196,8 @@ public class PodDBAdapter {
} }
public void close() { public void close() {
if (AppConfig.DEBUG) Log.d(TAG, "Closing DB"); if (AppConfig.DEBUG)
Log.d(TAG, "Closing DB");
db.close(); db.close();
} }
@ -247,12 +226,15 @@ public class PodDBAdapter {
values.put(KEY_DOWNLOADED, feed.isDownloaded()); values.put(KEY_DOWNLOADED, feed.isDownloaded());
values.put(KEY_LASTUPDATE, feed.getLastUpdate().getTime()); values.put(KEY_LASTUPDATE, feed.getLastUpdate().getTime());
values.put(KEY_TYPE, feed.getType()); values.put(KEY_TYPE, feed.getType());
values.put(KEY_FEED_IDENTIFIER, feed.getFeedIdentifier());
if (feed.getId() == 0) { if (feed.getId() == 0) {
// Create new entry // Create new entry
if (AppConfig.DEBUG) Log.d(this.toString(), "Inserting new Feed into db"); if (AppConfig.DEBUG)
Log.d(this.toString(), "Inserting new Feed into db");
feed.setId(db.insert(TABLE_NAME_FEEDS, null, values)); feed.setId(db.insert(TABLE_NAME_FEEDS, null, values));
} else { } else {
if (AppConfig.DEBUG) Log.d(this.toString(), "Updating existing Feed in db"); if (AppConfig.DEBUG)
Log.d(this.toString(), "Updating existing Feed in db");
db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?",
new String[] { Long.toString(feed.getId()) }); new String[] { Long.toString(feed.getId()) });
} }
@ -458,7 +440,6 @@ public class PodDBAdapter {
new String[] { String.valueOf(remove.getId()) }); new String[] { String.valueOf(remove.getId()) });
} }
/** /**
* Get all Feeds from the Feed Table. * Get all Feeds from the Feed Table.
* *
@ -518,10 +499,9 @@ public class PodDBAdapter {
public final Cursor getSimpleChaptersOfFeedItemCursor(final FeedItem item) { public final Cursor getSimpleChaptersOfFeedItemCursor(final FeedItem item) {
open(); open();
Cursor c = db Cursor c = db.query(TABLE_NAME_SIMPLECHAPTERS, null, KEY_FEEDITEM
.query(TABLE_NAME_SIMPLECHAPTERS, null, KEY_FEEDITEM + "=?", + "=?", new String[] { String.valueOf(item.getId()) }, null,
new String[] { String.valueOf(item.getId()) }, null, null, null);
null, null);
return c; return c;
} }
@ -639,16 +619,20 @@ public class PodDBAdapter {
Log.w("DBAdapter", "Upgrading from version " + oldVersion + " to " Log.w("DBAdapter", "Upgrading from version " + oldVersion + " to "
+ newVersion + "."); + newVersion + ".");
if (oldVersion <= 1) { if (oldVersion <= 1) {
db.execSQL("ALTER TABLE " + TABLE_NAME_FEEDS + " ADD COLUMN " + db.execSQL("ALTER TABLE " + TABLE_NAME_FEEDS + " ADD COLUMN "
KEY_TYPE + " TEXT"); + KEY_TYPE + " TEXT");
} }
if (oldVersion <= 2) { if (oldVersion <= 2) {
db.execSQL("ALTER TABLE " + TABLE_NAME_SIMPLECHAPTERS + " ADD COLUMN " + db.execSQL("ALTER TABLE " + TABLE_NAME_SIMPLECHAPTERS
KEY_LINK + " TEXT"); + " ADD COLUMN " + KEY_LINK + " TEXT");
} }
if (oldVersion <= 3) { if (oldVersion <= 3) {
db.execSQL("ALTER TABLE " + TABLE_NAME_FEED_ITEMS + " ADD COLUMN " + db.execSQL("ALTER TABLE " + TABLE_NAME_FEED_ITEMS
KEY_ITEM_IDENTIFIER + " TEXT"); + " ADD COLUMN " + KEY_ITEM_IDENTIFIER + " TEXT");
}
if (oldVersion <= 4) {
db.execSQL("ALTER TABLE " + TABLE_NAME_FEEDS + " ADD COLUMN "
+ KEY_FEED_IDENTIFIER + " TEXT");
} }
} }
} }

View File

@ -119,7 +119,9 @@ public class NSAtom extends Namespace {
} }
if (top.equals(ID)) { if (top.equals(ID)) {
if (second.equals(ENTRY)) { if (second.equals(FEED)) {
state.getFeed().setFeedIdentifier(content);
} else if (second.equals(ENTRY)) {
state.getCurrentItem().setItemIdentifier(content); state.getCurrentItem().setItemIdentifier(content);
} }
} else if (top.equals(TITLE)) { } else if (top.equals(TITLE)) {

View File

@ -460,6 +460,14 @@ public class FeedHandlerTest extends AndroidTestCase {
Log.e(TAG, "Feed has empty link"); Log.e(TAG, "Feed has empty link");
return false; return false;
} }
if (feed.getIdentifyingValue() == null) {
Log.e(TAG, "Feed has no identifying value");
return false;
}
if (feed.getIdentifyingValue() != null
&& feed.getIdentifyingValue().length() == 0) {
Log.e(TAG, "Feed has empty identifying value");
}
return true; return true;
} }