From 01cfe2a94b680127f89de34d1ba95105bb303d40 Mon Sep 17 00:00:00 2001 From: Simon Rutishauser Date: Wed, 15 Jan 2014 20:24:06 +0100 Subject: * don't load all Feeds and FeedItems to memory when refreshing the flattr status with items received from the flattr api * added method for resetting flattr status of all feeds and items This adresses https://github.com/danieloeh/AntennaPod/pull/331#issuecomment-32112929 items 1 and 3. followup on #331 --- src/de/danoeh/antennapod/storage/DBWriter.java | 115 ++++++++++--------------- 1 file changed, 46 insertions(+), 69 deletions(-) (limited to 'src/de/danoeh/antennapod/storage/DBWriter.java') 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 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 = new ArrayList(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 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 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(); } + }); } } -- cgit v1.2.3