diff options
Diffstat (limited to 'src/de/danoeh/antennapod')
-rw-r--r-- | src/de/danoeh/antennapod/storage/DBWriter.java | 115 | ||||
-rw-r--r-- | src/de/danoeh/antennapod/storage/PodDBAdapter.java | 47 | ||||
-rw-r--r-- | src/de/danoeh/antennapod/util/flattr/FlattrUtils.java | 4 |
3 files changed, 96 insertions, 70 deletions
diff --git a/src/de/danoeh/antennapod/storage/DBWriter.java b/src/de/danoeh/antennapod/storage/DBWriter.java index f5ad9bcf7..6938ade68 100644 --- a/src/de/danoeh/antennapod/storage/DBWriter.java +++ b/src/de/danoeh/antennapod/storage/DBWriter.java @@ -21,8 +21,10 @@ import de.danoeh.antennapod.util.flattr.SimpleFlattrThing; import org.shredzone.flattr4j.model.Flattr; import java.io.File; +import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; +import java.net.URLEncoder; import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -875,17 +877,20 @@ 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) { - } + /** + * format an url for querying the database + * (postfix a / and apply percent-encoding) + */ + private static String formatURIForQuery(String uri) { + try + { + return URLEncoder.encode(uri.endsWith("/") ? uri.substring(0, uri.length()-1) : uri, "UTF-8"); + } + catch (UnsupportedEncodingException e) + { + Log.e(TAG, e.getMessage()); + return ""; } - return normalizedURI; } @@ -912,71 +917,43 @@ public class DBWriter { } /** - * 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 + * Reset flattr status to unflattrd for all items */ - public static void setFlattredStatus(final 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 (final 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 (final FlattrLinkTime flattr : flattrLinkTime) { - if (flattr.paymentLink.equals(feedThingUrl)) { - feed.setFlattrStatus(new FlattrStatus(flattr.time)); - setFeedFlattrStatus(context, feed, false); - break; - } - } + public static Future<?> clearAllFlattrStatus(final Context context) + { + Log.d(TAG, "clearAllFlattrStatus()"); + return dbExec.submit(new Runnable() { + @Override + public void run() { + PodDBAdapter adapter = new PodDBAdapter(context); + adapter.open(); + adapter.clearAllFlattrStatus(); + adapter.close(); } + }); + } - // check if any of the feeditems have been flattred - for (final 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 + /** + * 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 Future<?> setFlattredStatus(final Context context, final List<Flattr> flattrList) { + Log.d(TAG, "setFlattredStatus to status retrieved from flattr api running with " + flattrList.size() + " items"); + // clear flattr status in db + clearAllFlattrStatus(context); - if (AppConfig.DEBUG) - Log.d(TAG, "FeedItem: Trying to match " + feedItemThingUrl); - for (final FlattrLinkTime flattr : flattrLinkTime) { - if (flattr.paymentLink.equals(feedItemThingUrl)) { - item.setFlattrStatus(new FlattrStatus(flattr.time)); - setFeedItemFlattrStatus(context, item, false); - break; - } - } - } + // submit list with flattred things having normalized URLs to db + return dbExec.submit(new Runnable() { + @Override + public void run() { + PodDBAdapter adapter = new PodDBAdapter(context); + adapter.open(); + for (Flattr flattr : flattrList) { + adapter.setItemFlattrStatus(formatURIForQuery(flattr.getThing().getUrl()), new FlattrStatus(flattr.getCreated().getTime())); } + adapter.close(); } + }); } } diff --git a/src/de/danoeh/antennapod/storage/PodDBAdapter.java b/src/de/danoeh/antennapod/storage/PodDBAdapter.java index f1409da6b..ef76349d1 100644 --- a/src/de/danoeh/antennapod/storage/PodDBAdapter.java +++ b/src/de/danoeh/antennapod/storage/PodDBAdapter.java @@ -572,6 +572,53 @@ public class PodDBAdapter { db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(feedItem.getId())}); } + /** + * Update the flattr status of a feed or feed item specified by its payment link + * and the new flattr status to use + */ + public void setItemFlattrStatus(String url, FlattrStatus status) + { + //Log.d(TAG, "setItemFlattrStatus(" + url + ") = " + status.toString()); + ContentValues values = new ContentValues(); + values.put(KEY_FLATTR_STATUS, status.toLong()); + + // regexps in sqlite would be neat! + String[] query_urls = new String[]{ + "*" + url + "&*", + "*" + url + "%2F&*", + "*" + url + "", + "*" + url + "%2F" + }; + + if (db.update(TABLE_NAME_FEEDS, values, + KEY_PAYMENT_LINK + " GLOB ?" + + " OR " + KEY_PAYMENT_LINK + " GLOB ?" + + " OR " + KEY_PAYMENT_LINK + " GLOB ?" + + " OR " + KEY_PAYMENT_LINK + " GLOB ?", query_urls) > 0) + { + Log.i(TAG, "setItemFlattrStatus found match for " + url + " = " + status.toLong() + " in Feeds table"); + return; + } + if (db.update(TABLE_NAME_FEED_ITEMS, values, + KEY_PAYMENT_LINK + " GLOB ?" + + " OR " + KEY_PAYMENT_LINK + " GLOB ?" + + " OR " + KEY_PAYMENT_LINK + " GLOB ?" + + " OR " + KEY_PAYMENT_LINK + " GLOB ?", query_urls) > 0) + { + Log.i(TAG, "setItemFlattrStatus found match for " + url + " = " + status.toLong() + " in FeedsItems table"); + } + } + + /** + * Reset flattr status to unflattrd for all items + */ + public void clearAllFlattrStatus() + { + ContentValues values = new ContentValues(); + values.put(KEY_FLATTR_STATUS, 0); + db.update(TABLE_NAME_FEEDS, values, null, null); + db.update(TABLE_NAME_FEED_ITEMS, values, null, null); + } /** * Inserts or updates a feeditem entry diff --git a/src/de/danoeh/antennapod/util/flattr/FlattrUtils.java b/src/de/danoeh/antennapod/util/flattr/FlattrUtils.java index 869435f73..215e67e55 100644 --- a/src/de/danoeh/antennapod/util/flattr/FlattrUtils.java +++ b/src/de/danoeh/antennapod/util/flattr/FlattrUtils.java @@ -30,6 +30,7 @@ import de.danoeh.antennapod.PodcastApp; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.FlattrAuthActivity; import de.danoeh.antennapod.asynctask.FlattrTokenFetcher; +import de.danoeh.antennapod.storage.DBWriter; /** Utility methods for doing something with flattr. */ @@ -190,7 +191,8 @@ public class FlattrUtils { deleteToken(); FlattrServiceCreator.deleteFlattrService(); showRevokeDialog(context); - } + DBWriter.clearAllFlattrStatus(context); + } // ------------------------------------------------ DIALOGS |