From dd851b2ab27390ac5402c39fcb73c7d1f79c9bb3 Mon Sep 17 00:00:00 2001 From: Size43 Date: Tue, 2 Jun 2015 16:05:11 +0200 Subject: SortedFeedItemContainer added --- .../java/org/rssin/android/FeedItemAdapter.java | 19 +++++---- .../java/org/rssin/android/FeedSorterTrainer.java | 28 ++++++++++++++ .../java/org/rssin/android/FilterActivity.java | 5 ++- .../org/rssin/android/UnifiedInboxActivity.java | 5 ++- .../main/java/org/rssin/neurons/FeedSorter.java | 19 ++++----- .../org/rssin/neurons/SortedFeedItemContainer.java | 45 ++++++++++++++++++++++ app/src/main/java/org/rssin/rss/FeedItem.java | 14 ------- .../java/org/rssin/rssin/FeedLoaderAndSorter.java | 7 ++-- .../java/org/rssin/rssin/UnifiedFilterLoader.java | 18 ++++----- 9 files changed, 109 insertions(+), 51 deletions(-) create mode 100755 app/src/main/java/org/rssin/android/FeedSorterTrainer.java create mode 100755 app/src/main/java/org/rssin/neurons/SortedFeedItemContainer.java (limited to 'app/src/main/java') diff --git a/app/src/main/java/org/rssin/android/FeedItemAdapter.java b/app/src/main/java/org/rssin/android/FeedItemAdapter.java index 7522bfa..fe9821e 100755 --- a/app/src/main/java/org/rssin/android/FeedItemAdapter.java +++ b/app/src/main/java/org/rssin/android/FeedItemAdapter.java @@ -12,15 +12,18 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import org.rssin.neurons.FeedSorter; +import org.rssin.neurons.Feedback; +import org.rssin.neurons.SortedFeedItemContainer; import org.rssin.rss.FeedItem; import org.rssin.rssin.R; import java.util.List; class FeedItemAdapter extends RecyclerView.Adapter { - List feedItems; + List feedItems; - public FeedItemAdapter(List objects) { + public FeedItemAdapter(List objects) { feedItems = objects; } @@ -34,11 +37,10 @@ class FeedItemAdapter extends RecyclerView.Adapter, VolleyError>() { + loaderAndSorter.getFilteredFeedItems(new VolleyFetcher(this), new FallibleListener, VolleyError>() { @Override - public void onReceive(List data) { + public void onReceive(List data) { FeedItemAdapter feedItemAdapter = new FeedItemAdapter(data); mRecyclerView.setAdapter(feedItemAdapter); diff --git a/app/src/main/java/org/rssin/android/UnifiedInboxActivity.java b/app/src/main/java/org/rssin/android/UnifiedInboxActivity.java index e38c663..76618ba 100755 --- a/app/src/main/java/org/rssin/android/UnifiedInboxActivity.java +++ b/app/src/main/java/org/rssin/android/UnifiedInboxActivity.java @@ -11,6 +11,7 @@ import android.view.MenuItem; import com.android.volley.VolleyError; import org.rssin.listener.FallibleListener; +import org.rssin.neurons.SortedFeedItemContainer; import org.rssin.rss.FeedItem; import org.rssin.rssin.FeedLoaderAndSorter; import org.rssin.rssin.Filter; @@ -54,9 +55,9 @@ public class UnifiedInboxActivity extends ActionBarActivity { * results. We could do this for example with {@link org.rssin.listener.RealtimeListener} */ UnifiedFilterLoader loaderAndSorter = new UnifiedFilterLoader(filtersList.getFilters()); - loaderAndSorter.getFilteredFeedItems(new VolleyFetcher(this), new FallibleListener, VolleyError>() { + loaderAndSorter.getFilteredFeedItems(new VolleyFetcher(this), new FallibleListener, VolleyError>() { @Override - public void onReceive(List data) { + public void onReceive(List data) { FeedItemAdapter feedItemAdapter = new FeedItemAdapter(data); mRecyclerView.setAdapter(feedItemAdapter); mRecyclerView.setHasFixedSize(true); diff --git a/app/src/main/java/org/rssin/neurons/FeedSorter.java b/app/src/main/java/org/rssin/neurons/FeedSorter.java index 6cb369a..e7fdb1f 100755 --- a/app/src/main/java/org/rssin/neurons/FeedSorter.java +++ b/app/src/main/java/org/rssin/neurons/FeedSorter.java @@ -163,7 +163,7 @@ public class FeedSorter implements Storable { /** * Runs an iteration of training, using feedback that was provided previously using FeedSorter.feedback(...). */ - public void train() { + public synchronized void train() { Random random = new Random(); for (int i = 0; i < trainingCases.size(); i++) { TrainingCase t = trainingCases.get(random.nextInt(trainingCases.size())); @@ -184,21 +184,18 @@ public class FeedSorter implements Storable { * @param items The list of items. * @return A new, sorted, list of items. The parameter items is not modified. */ - public List sortItems(List items) { + public List sortItems(List items) { final int SECONDS_IN_DAY = 24 * 60 * 60; - final List newItems = new ArrayList<>(items); + final List newItems = new ArrayList<>(); - for (FeedItem item : newItems) { + for (FeedItem item : items) { PredictionInterface prediction = getPrediction(item); - item.setScore((long) (item.getPubDate().getTime() / 1000 + prediction.getOutput() * SECONDS_IN_DAY)); + SortedFeedItemContainer container = new SortedFeedItemContainer(item, this); + container.setScore((long) (item.getPubDate().getTime() / 1000 + prediction.getOutput() * SECONDS_IN_DAY)); + newItems.add(container); } - Collections.sort(newItems, new Comparator() { - @Override - public int compare(FeedItem lhs, FeedItem rhs) { - return (int) Math.signum(rhs.getScore() - lhs.getScore()); - } - }); + Collections.sort(newItems); return newItems; } diff --git a/app/src/main/java/org/rssin/neurons/SortedFeedItemContainer.java b/app/src/main/java/org/rssin/neurons/SortedFeedItemContainer.java new file mode 100755 index 0000000..cc36f5e --- /dev/null +++ b/app/src/main/java/org/rssin/neurons/SortedFeedItemContainer.java @@ -0,0 +1,45 @@ +package org.rssin.neurons; + +import org.rssin.rss.FeedItem; + +/** + * @author Jos. + */ +public class SortedFeedItemContainer implements Comparable { + private FeedItem feeditem; + private FeedSorter sorter; + private long score; + + public SortedFeedItemContainer(FeedItem feeditem, FeedSorter sorter) + { + this.feeditem = feeditem; + this.sorter = sorter; + this.setScore(-1); + } + + public FeedItem getFeeditem() { + return feeditem; + } + + public FeedSorter getSorter() { + return sorter; + } + + public long getScore() { + if(score == -1) + { + throw new UnsupportedOperationException("score not set"); + } + + return score; + } + + public void setScore(long score) { + this.score = score; + } + + @Override + public int compareTo(SortedFeedItemContainer another) { + return Long.compare(this.getScore(), another.getScore()); + } +} diff --git a/app/src/main/java/org/rssin/rss/FeedItem.java b/app/src/main/java/org/rssin/rss/FeedItem.java index 5565488..7128c4c 100755 --- a/app/src/main/java/org/rssin/rss/FeedItem.java +++ b/app/src/main/java/org/rssin/rss/FeedItem.java @@ -20,7 +20,6 @@ public class FeedItem implements Serializable { private String enclosure; private String source; private List category = new LinkedList<>(); - private transient long score = -1; public FeedItem(String guid, Date pubDate, String title, String description, String link, String author, List category, String comments, String enclosure, String source) @@ -170,17 +169,4 @@ public class FeedItem implements Serializable { && (enclosure == null && other.enclosure == null) || (enclosure != null && enclosure.equals(other.enclosure)) && (source == null && other.source == null) || (source != null && source.equals(other.source)); } - - public long getScore() { - if(score == -1) - { - throw new UnsupportedOperationException("score not set"); - } - - return score; - } - - public void setScore(long score) { - this.score = score; - } } diff --git a/app/src/main/java/org/rssin/rssin/FeedLoaderAndSorter.java b/app/src/main/java/org/rssin/rssin/FeedLoaderAndSorter.java index 7ad0001..ecdfc33 100755 --- a/app/src/main/java/org/rssin/rssin/FeedLoaderAndSorter.java +++ b/app/src/main/java/org/rssin/rssin/FeedLoaderAndSorter.java @@ -5,6 +5,7 @@ import org.rssin.listener.FallibleListener; import org.rssin.listener.Listener; import org.rssin.listener.RealtimeListener; import org.rssin.neurons.FeedSorter; +import org.rssin.neurons.SortedFeedItemContainer; import org.rssin.rss.FeedItem; import org.rssin.rss.FeedLoader; @@ -27,7 +28,7 @@ public class FeedLoaderAndSorter { * @param fetcher HTTP Fetcher * @param listener Listener for when the fetcher finishes */ - public void getFilteredFeedItems(Fetcher fetcher, final Listener> listener) + public void getFilteredFeedItems(Fetcher fetcher, final Listener> listener) { final List resultingItems = new ArrayList<>(); final Counter counter = new Counter(filter.getFeeds().size()); @@ -42,10 +43,10 @@ public class FeedLoaderAndSorter { resultingItems.add(item); } - sorter.sortItems(resultingItems); + List sorted = sorter.sortItems(resultingItems); if (counter.decr().isZero() || listener.getClass() == RealtimeListener.class) { - listener.onReceive(resultingItems); + listener.onReceive(sorted); if (counter.decr().isZero() && listener.getClass() == RealtimeListener.class) { ((RealtimeListener) listener).finish(); } diff --git a/app/src/main/java/org/rssin/rssin/UnifiedFilterLoader.java b/app/src/main/java/org/rssin/rssin/UnifiedFilterLoader.java index 9740380..6ca8b50 100755 --- a/app/src/main/java/org/rssin/rssin/UnifiedFilterLoader.java +++ b/app/src/main/java/org/rssin/rssin/UnifiedFilterLoader.java @@ -3,6 +3,7 @@ package org.rssin.rssin; import org.rssin.http.Fetcher; import org.rssin.listener.Listener; import org.rssin.listener.RealtimeListener; +import org.rssin.neurons.SortedFeedItemContainer; import org.rssin.rss.FeedItem; import java.util.ArrayList; @@ -28,32 +29,27 @@ public class UnifiedFilterLoader { * @param fetcher HTTP Fetcher * @param listener Listener for when the fetcher finishes */ - public void getFilteredFeedItems(Fetcher fetcher, final Listener> listener) { + public void getFilteredFeedItems(Fetcher fetcher, final Listener> listener) { // HashSet to make sure that there are no duplicates when merging multiple filters, since different filters // may contain the same feed. - final HashSet resultingItems = new HashSet<>(); + final HashSet resultingItems = new HashSet<>(); final Counter counter = new Counter(filters.size()); for (Filter filter : filters) { // Load the sorted FeedItems from the filters, and combine them. FeedLoaderAndSorter loaderAndSorter = new FeedLoaderAndSorter(filter); - loaderAndSorter.getFilteredFeedItems(fetcher, new Listener>() { + loaderAndSorter.getFilteredFeedItems(fetcher, new Listener>() { @Override - public void onReceive(List data) { + public void onReceive(List data) { resultingItems.addAll(data); if (counter.decr().isZero() || listener.getClass() == RealtimeListener.class) { - ArrayList newItems = new ArrayList(resultingItems); + ArrayList newItems = new ArrayList(resultingItems); // Do another sort to make sure the items are still in the correct order. // this uses the score set by the FeedSorter class, which is called // in the Filter class. The Unified inbox does not have a separate network. - Collections.sort(newItems, new Comparator() { - @Override - public int compare(FeedItem lhs, FeedItem rhs) { - return (int) Math.signum(rhs.getScore() - lhs.getScore()); - } - }); + Collections.sort(newItems); listener.onReceive(newItems); if (counter.decr().isZero() && listener.getClass() == RealtimeListener.class) { -- cgit v1.2.3