summaryrefslogtreecommitdiff
path: root/src/de/danoeh/antennapod/storage
diff options
context:
space:
mode:
authordaniel oeh <daniel.oeh@gmail.com>2013-12-31 03:17:02 +0100
committerdaniel oeh <daniel.oeh@gmail.com>2013-12-31 03:17:02 +0100
commitc76bd9ba080e154672de913967e0e5b7ea6f9cab (patch)
treed924d27c22274eb4115eddefb207b64a0fee7ebe /src/de/danoeh/antennapod/storage
parentbad86d8284fb48bd130370eefb8d8c7ae25ab44c (diff)
parent8fbd1ecf9ceec0523447346c1ae93e0cb612a96a (diff)
downloadAntennaPod-c76bd9ba080e154672de913967e0e5b7ea6f9cab.zip
Merge branch 'develop_flattr_queue_autoflattr' of git://github.com/peschmae0/AntennaPod into flattr_queue_autoflattr
Conflicts: src/de/danoeh/antennapod/storage/DBReader.java src/de/danoeh/antennapod/storage/PodDBAdapter.java
Diffstat (limited to 'src/de/danoeh/antennapod/storage')
-rw-r--r--src/de/danoeh/antennapod/storage/DBReader.java49
-rw-r--r--src/de/danoeh/antennapod/storage/DBTasks.java8
-rw-r--r--src/de/danoeh/antennapod/storage/DBWriter.java102
-rw-r--r--src/de/danoeh/antennapod/storage/PodDBAdapter.java39
4 files changed, 189 insertions, 9 deletions
diff --git a/src/de/danoeh/antennapod/storage/DBReader.java b/src/de/danoeh/antennapod/storage/DBReader.java
index 8aa93d7ed..012c5f3e1 100644
--- a/src/de/danoeh/antennapod/storage/DBReader.java
+++ b/src/de/danoeh/antennapod/storage/DBReader.java
@@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
+import java.util.LinkedList;
import android.content.Context;
import android.database.Cursor;
@@ -15,6 +16,8 @@ import de.danoeh.antennapod.service.download.*;
import de.danoeh.antennapod.util.DownloadError;
import de.danoeh.antennapod.util.comparator.DownloadStatusComparator;
import de.danoeh.antennapod.util.comparator.FeedItemPubdateComparator;
+import de.danoeh.antennapod.util.flattr.FlattrStatus;
+import de.danoeh.antennapod.util.flattr.FlattrThing;
/**
* Provides methods for reading data from the AntennaPod database.
@@ -210,6 +213,8 @@ public final class DBReader {
.getInt(PodDBAdapter.IDX_FI_SMALL_READ) > 0));
item.setItemIdentifier(itemlistCursor
.getString(PodDBAdapter.IDX_FI_SMALL_ITEM_IDENTIFIER));
+ item.setFlattrStatus(new FlattrStatus(itemlistCursor
+ .getLong(PodDBAdapter.IDX_FI_SMALL_FLATTR_STATUS)));
// extract chapters
boolean hasSimpleChapters = itemlistCursor
@@ -301,7 +306,8 @@ public final class DBReader {
cursor.getString(PodDBAdapter.KEY_FILE_URL_INDEX),
cursor.getString(PodDBAdapter.KEY_DOWNLOAD_URL_INDEX),
cursor.getInt(PodDBAdapter.KEY_DOWNLOADED_INDEX) > 0,
- playbackCompletionDate);
+ playbackCompletionDate,
+ cursor.getInt(PodDBAdapter.KEY_PLAYED_DURATION_INDEX));
}
private static Feed extractFeedFromCursorRow(PodDBAdapter adapter,
@@ -329,7 +335,8 @@ public final class DBReader {
image,
cursor.getString(PodDBAdapter.IDX_FEED_SEL_STD_FILE_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,
+ new FlattrStatus(cursor.getLong(PodDBAdapter.KEY_FEED_FLATTR_STATUS_INDEX)));
if (image != null) {
image.setFeed(feed);
@@ -774,4 +781,42 @@ public final class DBReader {
return media;
}
+
+
+ public static List<FlattrThing> getFlattrQueue(Context context) {
+ List<Feed> feeds = getFeedList(context);
+ List<FlattrThing> l = new LinkedList<FlattrThing>();
+
+ for (Feed feed : feeds) {
+ if (feed.getFlattrStatus().getFlattrQueue())
+ l.add(feed);
+
+ for (FeedItem item : getFeedItemList(context, feed))
+ if (item.getFlattrStatus().getFlattrQueue())
+ l.add(item);
+ }
+
+ Log.d(TAG, "Returning flattrQueueIterator for queue with " + l.size() + " items.");
+ return l;
+ }
+
+
+ public static boolean getFlattrQueueEmpty(Context context) {
+ List<Feed> feeds = getFeedList(context);
+
+ for (Feed feed : feeds) {
+ if (feed.getFlattrStatus().getFlattrQueue())
+ return false;
+ }
+
+ for (Feed feed : feeds) {
+ for (FeedItem item : getFeedItemList(context, feed))
+ if (item.getFlattrStatus().getFlattrQueue())
+ return false;
+ }
+
+ Log.d(TAG, "getFlattrQueueEmpty() = true");
+
+ return true;
+ }
}
diff --git a/src/de/danoeh/antennapod/storage/DBTasks.java b/src/de/danoeh/antennapod/storage/DBTasks.java
index 26d5c712a..b9190bbc4 100644
--- a/src/de/danoeh/antennapod/storage/DBTasks.java
+++ b/src/de/danoeh/antennapod/storage/DBTasks.java
@@ -4,6 +4,8 @@ import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.util.Log;
+import de.danoeh.antennapod.asynctask.FlattrClickWorker;
+import de.danoeh.antennapod.asynctask.FlattrStatusFetcher;
import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.feed.*;
import de.danoeh.antennapod.preferences.UserPreferences;
@@ -155,6 +157,12 @@ public final class DBTasks {
autodownloadUndownloadedItems(context);
}
}.start();
+
+ if (AppConfig.DEBUG) Log.d(TAG, "Flattring all pending things.");
+ new FlattrClickWorker(context).executeAsync(); // flattr pending things
+
+ if (AppConfig.DEBUG) Log.d(TAG, "Fetching flattr status.");
+ new FlattrStatusFetcher(context).executeAsync();
} else {
if (AppConfig.DEBUG)
Log.d(TAG,
diff --git a/src/de/danoeh/antennapod/storage/DBWriter.java b/src/de/danoeh/antennapod/storage/DBWriter.java
index 6be1a5327..bfad75254 100644
--- a/src/de/danoeh/antennapod/storage/DBWriter.java
+++ b/src/de/danoeh/antennapod/storage/DBWriter.java
@@ -2,20 +2,26 @@ package de.danoeh.antennapod.storage;
import java.io.File;
import java.util.Date;
+import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadFactory;
+import org.shredzone.flattr4j.model.Flattr;
+
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.preference.PreferenceManager;
import android.util.Log;
+import android.net.Uri;
import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.feed.*;
import de.danoeh.antennapod.preferences.GpodnetPreferences;
@@ -24,6 +30,7 @@ import de.danoeh.antennapod.service.GpodnetSyncService;
import de.danoeh.antennapod.service.PlaybackService;
import de.danoeh.antennapod.service.download.DownloadStatus;
import de.danoeh.antennapod.util.QueueAccess;
+import de.danoeh.antennapod.util.flattr.*;
/**
* Provides methods for writing data to AntennaPod's database.
@@ -823,4 +830,99 @@ public class DBWriter {
}
return false;
}
+
+ private static String normalizeURI(String uri) {
+ String normalizedURI = null;
+ if (uri != null) {
+ try {
+ normalizedURI = (new URI(uri)).normalize().toString();
+ if (! normalizedURI.endsWith("/"))
+ normalizedURI = normalizedURI + "/";
+ }
+ catch (URISyntaxException e) {
+ }
+ }
+ return normalizedURI;
+ }
+
+
+ // Set flattr status of the passed thing (either a FeedItem or a Feed)
+ public static void setFlattredStatus(Context context, FlattrThing thing) {
+ // must propagate this to back db
+ if (thing instanceof FeedItem)
+ DBWriter.setFeedItem(context, (FeedItem) thing);
+ else if (thing instanceof Feed)
+ DBWriter.setCompleteFeed(context, (Feed) thing);
+ else
+ Log.e(TAG, "flattrQueue processing - thing is neither FeedItem nor Feed");
+ }
+
+ /*
+ * Set flattr status of the feeds/feeditems in flattrList to flattred at the given timestamp,
+ * where the information has been retrieved from the flattr API
+ */
+ public static void setFlattredStatus(Context context, List<Flattr> flattrList) {
+ class FlattrLinkTime {
+ public String paymentLink;
+ public long time;
+
+ FlattrLinkTime(String paymentLink, long time) {
+ this.paymentLink = paymentLink;
+ this.time = time;
+ }
+ }
+
+ // build list with flattred things having normalized URLs
+ ArrayList<FlattrLinkTime> flattrLinkTime = new ArrayList<FlattrLinkTime>(flattrList.size());
+ for (Flattr flattr: flattrList) {
+ flattrLinkTime.add(new FlattrLinkTime(normalizeURI(flattr.getThing().getUrl()), flattr.getCreated().getTime()));
+ if (AppConfig.DEBUG)
+ Log.d(TAG, "FlattredUrl: " + flattr.getThing().getUrl());
+ }
+
+
+ String paymentLink;
+ List<Feed> feeds = DBReader.getFeedList(context);
+ for (Feed feed: feeds) {
+ // check if the feed has been flattred
+ paymentLink = feed.getPaymentLink();
+ if (paymentLink != null) {
+ String feedThingUrl = normalizeURI(Uri.parse(paymentLink).getQueryParameter("url"));
+
+ feed.getFlattrStatus().setUnflattred(); // reset our offline status tracking
+
+ if (AppConfig.DEBUG)
+ Log.d(TAG, "Feed: Trying to match " + feedThingUrl);
+ for (FlattrLinkTime flattr: flattrLinkTime) {
+ if (flattr.paymentLink.equals(feedThingUrl)) {
+ feed.setFlattrStatus(new FlattrStatus(flattr.time));
+ setCompleteFeed(context, feed);
+ break;
+ }
+ }
+ }
+
+ // check if any of the feeditems have been flattred
+ for (FeedItem item: DBReader.getFeedItemList(context, feed)) {
+ paymentLink = item.getPaymentLink();
+
+ if (paymentLink != null) {
+ String feedItemThingUrl = normalizeURI(Uri.parse(paymentLink).getQueryParameter("url"));
+
+ item.getFlattrStatus().setUnflattred(); // reset our offline status tracking
+
+ if (AppConfig.DEBUG)
+ Log.d(TAG, "FeedItem: Trying to match " + feedItemThingUrl);
+ for (FlattrLinkTime flattr: flattrLinkTime) {
+ if (flattr.paymentLink.equals(feedItemThingUrl)) {
+ item.setFlattrStatus(new FlattrStatus(flattr.time));
+ setFeedItem(context, item);
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
}
diff --git a/src/de/danoeh/antennapod/storage/PodDBAdapter.java b/src/de/danoeh/antennapod/storage/PodDBAdapter.java
index 068f80ded..44a95ed62 100644
--- a/src/de/danoeh/antennapod/storage/PodDBAdapter.java
+++ b/src/de/danoeh/antennapod/storage/PodDBAdapter.java
@@ -1,6 +1,7 @@
package de.danoeh.antennapod.storage;
import java.util.Arrays;
+import java.util.Iterator;
import java.util.List;
import android.content.ContentValues;
@@ -16,6 +17,7 @@ import android.util.Log;
import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.feed.*;
import de.danoeh.antennapod.service.download.DownloadStatus;
+import de.danoeh.antennapod.util.flattr.FlattrStatus;
// TODO Remove media column from feeditem table
@@ -24,7 +26,7 @@ import de.danoeh.antennapod.service.download.DownloadStatus;
*/
public class PodDBAdapter {
private static final String TAG = "PodDBAdapter";
- private static final int DATABASE_VERSION = 10;
+ private static final int DATABASE_VERSION = 11;
public static final String DATABASE_NAME = "Antennapod.db";
/**
@@ -54,6 +56,7 @@ public class PodDBAdapter {
public static final int KEY_IMAGE_INDEX = 11;
public static final int KEY_TYPE_INDEX = 12;
public static final int KEY_FEED_IDENTIFIER_INDEX = 13;
+ public static final int KEY_FEED_FLATTR_STATUS_INDEX = 14;
// ----------- FeedItem indices
public static final int KEY_CONTENT_ENCODED_INDEX = 2;
public static final int KEY_PUBDATE_INDEX = 3;
@@ -62,6 +65,7 @@ public class PodDBAdapter {
public static final int KEY_FEED_INDEX = 9;
public static final int KEY_HAS_SIMPLECHAPTERS_INDEX = 10;
public static final int KEY_ITEM_IDENTIFIER_INDEX = 11;
+ public static final int KEY_ITEM_FLATTR_STATUS_INDEX = 12;
// ---------- FeedMedia indices
public static final int KEY_DURATION_INDEX = 1;
public static final int KEY_POSITION_INDEX = 5;
@@ -69,6 +73,7 @@ public class PodDBAdapter {
public static final int KEY_MIME_TYPE_INDEX = 7;
public static final int KEY_PLAYBACK_COMPLETION_DATE_INDEX = 8;
public static final int KEY_MEDIA_FEEDITEM_INDEX = 9;
+ public static final int KEY_PLAYED_DURATION_INDEX = 10;
// --------- Download log indices
public static final int KEY_FEEDFILE_INDEX = 1;
public static final int KEY_FEEDFILETYPE_INDEX = 2;
@@ -119,12 +124,14 @@ public class PodDBAdapter {
public static final String KEY_HAS_CHAPTERS = "has_simple_chapters";
public static final String KEY_TYPE = "type";
public static final String KEY_ITEM_IDENTIFIER = "item_identifier";
+ public static final String KEY_FLATTR_STATUS = "flattr_status";
public static final String KEY_FEED_IDENTIFIER = "feed_identifier";
public static final String KEY_REASON_DETAILED = "reason_detailed";
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";
+ public static final String KEY_PLAYED_DURATION = "played_duration";
// Table names
public static final String TABLE_NAME_FEEDS = "Feeds";
@@ -146,7 +153,8 @@ 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_AUTO_DOWNLOAD + " INTEGER DEFAULT 1)";
+ + KEY_FEED_IDENTIFIER + " TEXT," + KEY_AUTO_DOWNLOAD + " INTEGER DEFAULT 1,"
+ + KEY_FLATTR_STATUS + " INTEGER)";
private static final String CREATE_TABLE_FEED_ITEMS = "CREATE TABLE "
+ TABLE_NAME_FEED_ITEMS + " (" + TABLE_PRIMARY_KEY + KEY_TITLE
@@ -154,7 +162,8 @@ public class PodDBAdapter {
+ " INTEGER," + KEY_READ + " INTEGER," + KEY_LINK + " TEXT,"
+ KEY_DESCRIPTION + " TEXT," + KEY_PAYMENT_LINK + " TEXT,"
+ KEY_MEDIA + " INTEGER," + KEY_FEED + " INTEGER,"
- + KEY_HAS_CHAPTERS + " INTEGER," + KEY_ITEM_IDENTIFIER + " TEXT)";
+ + KEY_HAS_CHAPTERS + " INTEGER," + KEY_ITEM_IDENTIFIER + " TEXT,"
+ + KEY_FLATTR_STATUS + " INTEGER)";
private static final String CREATE_TABLE_FEED_IMAGES = "CREATE TABLE "
+ TABLE_NAME_FEED_IMAGES + " (" + TABLE_PRIMARY_KEY + KEY_TITLE
@@ -167,7 +176,8 @@ public class PodDBAdapter {
+ " TEXT," + KEY_DOWNLOADED + " INTEGER," + KEY_POSITION
+ " INTEGER," + KEY_SIZE + " INTEGER," + KEY_MIME_TYPE + " TEXT,"
+ KEY_PLAYBACK_COMPLETION_DATE + " INTEGER,"
- + KEY_FEEDITEM + " INTEGER)";
+ + KEY_FEEDITEM + " INTEGER,"
+ + KEY_PLAYED_DURATION + " INTEGER)";
private static final String CREATE_TABLE_DOWNLOAD_LOG = "CREATE TABLE "
+ TABLE_NAME_DOWNLOAD_LOG + " (" + TABLE_PRIMARY_KEY + KEY_FEEDFILE
@@ -241,7 +251,8 @@ public class PodDBAdapter {
TABLE_NAME_FEED_ITEMS + "." + KEY_PAYMENT_LINK, KEY_MEDIA,
TABLE_NAME_FEED_ITEMS + "." + KEY_FEED,
TABLE_NAME_FEED_ITEMS + "." + KEY_HAS_CHAPTERS,
- TABLE_NAME_FEED_ITEMS + "." + KEY_ITEM_IDENTIFIER};
+ TABLE_NAME_FEED_ITEMS + "." + KEY_ITEM_IDENTIFIER,
+ TABLE_NAME_FEED_ITEMS + "." + KEY_FLATTR_STATUS};
/**
* Contains FEEDITEM_SEL_FI_SMALL as comma-separated list. Useful for raw queries.
@@ -265,6 +276,7 @@ public class PodDBAdapter {
public static final int IDX_FI_SMALL_FEED = 7;
public static final int IDX_FI_SMALL_HAS_CHAPTERS = 8;
public static final int IDX_FI_SMALL_ITEM_IDENTIFIER = 9;
+ public static final int IDX_FI_SMALL_FLATTR_STATUS = 10;
/**
* Select id, description and content-encoded column from feeditems.
@@ -346,6 +358,7 @@ public class PodDBAdapter {
values.put(KEY_LASTUPDATE, feed.getLastUpdate().getTime());
values.put(KEY_TYPE, feed.getType());
values.put(KEY_FEED_IDENTIFIER, feed.getFeedIdentifier());
+ values.put(KEY_FLATTR_STATUS, feed.getFlattrStatus().toLong());
if (feed.getId() == 0) {
// Create new entry
if (AppConfig.DEBUG)
@@ -435,6 +448,7 @@ public class PodDBAdapter {
ContentValues values = new ContentValues();
values.put(KEY_POSITION, media.getPosition());
values.put(KEY_DURATION, media.getDuration());
+ values.put(KEY_PLAYED_DURATION, media.getPlayedDuration());
db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?",
new String[]{String.valueOf(media.getId())});
} else {
@@ -497,8 +511,7 @@ public class PodDBAdapter {
/**
* 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
* false if the method is executed on a list of FeedItems of the same Feed.
* @return the id of the entry
@@ -522,6 +535,7 @@ public class PodDBAdapter {
values.put(KEY_READ, item.isRead());
values.put(KEY_HAS_CHAPTERS, item.getChapters() != null);
values.put(KEY_ITEM_IDENTIFIER, item.getItemIdentifier());
+ values.put(KEY_FLATTR_STATUS, item.getFlattrStatus().toLong());
if (item.getId() == 0) {
item.setId(db.insert(TABLE_NAME_FEED_ITEMS, null, values));
} else {
@@ -1170,6 +1184,17 @@ public class PodDBAdapter {
+ " ADD COLUMN " + KEY_AUTO_DOWNLOAD
+ " INTEGER DEFAULT 1");
}
+ if (oldVersion <= 10) {
+ db.execSQL("ALTER TABLE " + TABLE_NAME_FEEDS
+ + " ADD COLUMN " + KEY_FLATTR_STATUS
+ + " INTEGER");
+ db.execSQL("ALTER TABLE " + TABLE_NAME_FEED_ITEMS
+ + " ADD COLUMN " + KEY_FLATTR_STATUS
+ + " INTEGER");
+ db.execSQL("ALTER TABLE " + TABLE_NAME_FEED_MEDIA
+ + " ADD COLUMN " + KEY_PLAYED_DURATION
+ + " INTEGER");
+ }
}
}
}