aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java
diff options
context:
space:
mode:
authorSize432015-06-02 16:05:11 +0200
committerSize432015-06-02 16:05:11 +0200
commitdd851b2ab27390ac5402c39fcb73c7d1f79c9bb3 (patch)
tree5799ab252226dfda9d7fec64b35b9fd8bc4d4526 /app/src/main/java
parentmerge (diff)
SortedFeedItemContainer added
Diffstat (limited to 'app/src/main/java')
-rwxr-xr-xapp/src/main/java/org/rssin/android/FeedItemAdapter.java19
-rwxr-xr-xapp/src/main/java/org/rssin/android/FeedSorterTrainer.java28
-rwxr-xr-xapp/src/main/java/org/rssin/android/FilterActivity.java5
-rwxr-xr-xapp/src/main/java/org/rssin/android/UnifiedInboxActivity.java5
-rwxr-xr-xapp/src/main/java/org/rssin/neurons/FeedSorter.java19
-rwxr-xr-xapp/src/main/java/org/rssin/neurons/SortedFeedItemContainer.java45
-rwxr-xr-xapp/src/main/java/org/rssin/rss/FeedItem.java14
-rwxr-xr-xapp/src/main/java/org/rssin/rssin/FeedLoaderAndSorter.java7
-rwxr-xr-xapp/src/main/java/org/rssin/rssin/UnifiedFilterLoader.java18
9 files changed, 109 insertions, 51 deletions
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<FeedItemAdapter.FeedItemHolder> {
- List<FeedItem> feedItems;
+ List<SortedFeedItemContainer> feedItems;
- public FeedItemAdapter(List<FeedItem> objects) {
+ public FeedItemAdapter(List<SortedFeedItemContainer> objects) {
feedItems = objects;
}
@@ -34,11 +37,10 @@ class FeedItemAdapter extends RecyclerView.Adapter<FeedItemAdapter.FeedItemHolde
@Override
public void onBindViewHolder(FeedItemHolder holder, int position) {
- FeedItem item = feedItems.get(position);
- holder.title.setText(item.getTitle());
- holder.summary.setText(Html.fromHtml(item.getDescription()));
+ SortedFeedItemContainer item = feedItems.get(position);
+ holder.title.setText(item.getFeeditem().getTitle());
+ holder.summary.setText(Html.fromHtml(item.getFeeditem().getDescription()));
holder.item = item;
-
}
@Override
@@ -53,7 +55,7 @@ class FeedItemAdapter extends RecyclerView.Adapter<FeedItemAdapter.FeedItemHolde
static class FeedItemHolder extends RecyclerView.ViewHolder {
TextView title;
TextView summary;
- FeedItem item;
+ SortedFeedItemContainer item;
public FeedItemHolder(final View itemView) {
super(itemView);
@@ -63,8 +65,9 @@ class FeedItemAdapter extends RecyclerView.Adapter<FeedItemAdapter.FeedItemHolde
@Override
public void onClick(View v) {
Intent intent = new Intent(itemView.getContext(), ArticleActivity.class);
- intent.putExtra("Feed item", item);
+ intent.putExtra("Feed item", item.getFeeditem());
itemView.getContext().startActivity(intent);
+ item.getSorter().feedback(item.getFeeditem(), Feedback.Like);
}
});
}
diff --git a/app/src/main/java/org/rssin/android/FeedSorterTrainer.java b/app/src/main/java/org/rssin/android/FeedSorterTrainer.java
new file mode 100755
index 0000000..bcfa4a5
--- /dev/null
+++ b/app/src/main/java/org/rssin/android/FeedSorterTrainer.java
@@ -0,0 +1,28 @@
+package org.rssin.android;
+
+import org.rssin.neurons.FeedSorter;
+
+import java.util.PriorityQueue;
+
+/**
+ * @author Jos.
+ */
+public class FeedSorterTrainer implements Runnable {
+ private FeedSorter sorter;
+ public FeedSorterTrainer(FeedSorter sorter)
+ {
+ this.sorter = sorter;
+ }
+
+ @Override
+ public void run() {
+ for (int i = 0; i < 50; i++) {
+ sorter.train();
+ try {
+ Thread.sleep(10);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/org/rssin/android/FilterActivity.java b/app/src/main/java/org/rssin/android/FilterActivity.java
index 252101a..47502ad 100755
--- a/app/src/main/java/org/rssin/android/FilterActivity.java
+++ b/app/src/main/java/org/rssin/android/FilterActivity.java
@@ -12,6 +12,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;
@@ -51,9 +52,9 @@ public class FilterActivity extends ActionBarActivity {
setTitle(filter.getTitle());
FeedLoaderAndSorter loaderAndSorter = new FeedLoaderAndSorter(filter);
- loaderAndSorter.getFilteredFeedItems(new VolleyFetcher(this), new FallibleListener<List<FeedItem>, VolleyError>() {
+ loaderAndSorter.getFilteredFeedItems(new VolleyFetcher(this), new FallibleListener<List<SortedFeedItemContainer>, VolleyError>() {
@Override
- public void onReceive(List<FeedItem> data) {
+ public void onReceive(List<SortedFeedItemContainer> 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<List<FeedItem>, VolleyError>() {
+ loaderAndSorter.getFilteredFeedItems(new VolleyFetcher(this), new FallibleListener<List<SortedFeedItemContainer>, VolleyError>() {
@Override
- public void onReceive(List<FeedItem> data) {
+ public void onReceive(List<SortedFeedItemContainer> 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<FeedItem> sortItems(List<FeedItem> items) {
+ public List<SortedFeedItemContainer> sortItems(List<FeedItem> items) {
final int SECONDS_IN_DAY = 24 * 60 * 60;
- final List<FeedItem> newItems = new ArrayList<>(items);
+ final List<SortedFeedItemContainer> 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<FeedItem>() {
- @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<SortedFeedItemContainer> {
+ 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<String> category = new LinkedList<>();
- private transient long score = -1;
public FeedItem(String guid, Date pubDate, String title, String description, String link,
String author, List<String> 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<List<FeedItem>> listener)
+ public void getFilteredFeedItems(Fetcher fetcher, final Listener<List<SortedFeedItemContainer>> listener)
{
final List<FeedItem> 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<SortedFeedItemContainer> 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<List<FeedItem>> listener) {
+ public void getFilteredFeedItems(Fetcher fetcher, final Listener<List<SortedFeedItemContainer>> listener) {
// HashSet to make sure that there are no duplicates when merging multiple filters, since different filters
// may contain the same feed.
- final HashSet<FeedItem> resultingItems = new HashSet<>();
+ final HashSet<SortedFeedItemContainer> 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<List<FeedItem>>() {
+ loaderAndSorter.getFilteredFeedItems(fetcher, new Listener<List<SortedFeedItemContainer>>() {
@Override
- public void onReceive(List<FeedItem> data) {
+ public void onReceive(List<SortedFeedItemContainer> data) {
resultingItems.addAll(data);
if (counter.decr().isZero() || listener.getClass() == RealtimeListener.class) {
- ArrayList<FeedItem> newItems = new ArrayList<FeedItem>(resultingItems);
+ ArrayList<SortedFeedItemContainer> newItems = new ArrayList<SortedFeedItemContainer>(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<FeedItem>() {
- @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) {