diff options
Diffstat (limited to 'app/src/main/java')
12 files changed, 96 insertions, 80 deletions
diff --git a/app/src/main/java/org/rssin/android/ArticleActivity.java b/app/src/main/java/org/rssin/android/ArticleActivity.java index 0cc9055..2e5460c 100644..100755 --- a/app/src/main/java/org/rssin/android/ArticleActivity.java +++ b/app/src/main/java/org/rssin/android/ArticleActivity.java @@ -4,18 +4,18 @@ import android.content.Intent; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.text.Html; -import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; -import android.view.View; -import android.widget.ScrollView; import android.widget.TextView; +import org.rssin.rssin.SortedFeedItemContainer; import org.rssin.rss.FeedItem; import org.rssin.rssin.R; -public class ArticleActivity extends ActionBarActivity { +import static org.rssin.neurons.Feedback.*; +public class ArticleActivity extends ActionBarActivity { + private SortedFeedItemContainer container; @Override protected void onCreate(Bundle savedInstanceState) { @@ -23,7 +23,8 @@ public class ArticleActivity extends ActionBarActivity { setContentView(R.layout.activity_article); Intent intent = getIntent(); Bundle arguments = intent.getExtras(); - FeedItem item = (FeedItem) arguments.getSerializable("Feed item"); + container = (SortedFeedItemContainer) arguments.getSerializable("item"); + FeedItem item = container.getFeeditem(); TextView title = (TextView) findViewById(R.id.article_title); title.setText(item.getTitle()); @@ -33,6 +34,8 @@ public class ArticleActivity extends ActionBarActivity { author.setText("Written by: " + item.getAuthor()); TextView date = (TextView) findViewById(R.id.article_date); date.setText("Published on: " + item.getPubDate().toString()); + + new Thread(new FeedSorterTrainer(container.getSorter())).start(); } @Override @@ -50,7 +53,12 @@ public class ArticleActivity extends ActionBarActivity { int id = item.getItemId(); //noinspection SimplifiableIfStatement - if (id == R.id.action_settings) { + if (id == R.id.article_action_dislike) { + container.feedback(Dislike); + return true; + } else if(id == R.id.article_action_like) + { + container.feedback(Like); return true; } diff --git a/app/src/main/java/org/rssin/android/FeedItemAdapter.java b/app/src/main/java/org/rssin/android/FeedItemAdapter.java index fe9821e..de1766a 100755 --- a/app/src/main/java/org/rssin/android/FeedItemAdapter.java +++ b/app/src/main/java/org/rssin/android/FeedItemAdapter.java @@ -12,10 +12,8 @@ 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.SortedFeedItemContainer;
import org.rssin.rssin.R;
import java.util.List;
@@ -65,9 +63,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.getFeeditem());
+ intent.putExtra("item", item);
itemView.getContext().startActivity(intent);
- item.getSorter().feedback(item.getFeeditem(), Feedback.Like);
+ item.feedback(Feedback.Like);
}
});
}
diff --git a/app/src/main/java/org/rssin/android/FeedSorterTrainer.java b/app/src/main/java/org/rssin/android/FeedSorterTrainer.java index bcfa4a5..1289d1a 100755 --- a/app/src/main/java/org/rssin/android/FeedSorterTrainer.java +++ b/app/src/main/java/org/rssin/android/FeedSorterTrainer.java @@ -1,5 +1,7 @@ package org.rssin.android;
+import android.util.Log;
+
import org.rssin.neurons.FeedSorter;
import java.util.PriorityQueue;
@@ -17,6 +19,7 @@ public class FeedSorterTrainer implements Runnable { @Override
public void run() {
for (int i = 0; i < 50; i++) {
+ Log.d("FeedSorterTrainer", "Training: round " + i);
sorter.train();
try {
Thread.sleep(10);
diff --git a/app/src/main/java/org/rssin/android/FilterActivity.java b/app/src/main/java/org/rssin/android/FilterActivity.java index 47502ad..5003cfb 100755 --- a/app/src/main/java/org/rssin/android/FilterActivity.java +++ b/app/src/main/java/org/rssin/android/FilterActivity.java @@ -1,6 +1,5 @@ package org.rssin.android; -import android.app.Activity; import android.content.Intent; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; @@ -12,8 +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.SortedFeedItemContainer; import org.rssin.rssin.FeedLoaderAndSorter; import org.rssin.rssin.Filter; import org.rssin.rssin.R; diff --git a/app/src/main/java/org/rssin/android/FiltersList.java b/app/src/main/java/org/rssin/android/FiltersList.java index b555e5e..6b53186 100755 --- a/app/src/main/java/org/rssin/android/FiltersList.java +++ b/app/src/main/java/org/rssin/android/FiltersList.java @@ -12,7 +12,7 @@ import java.util.List; * A list of filters that can be saved using the DefaultStorageProvider * @author Camil Staps */ -class FiltersList { +public class FiltersList { private static FiltersList instance; diff --git a/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java b/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java index 4cc9386..4cc9386 100644..100755 --- a/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java +++ b/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java diff --git a/app/src/main/java/org/rssin/android/UnifiedInboxActivity.java b/app/src/main/java/org/rssin/android/UnifiedInboxActivity.java index 76618ba..ec8dce7 100755 --- a/app/src/main/java/org/rssin/android/UnifiedInboxActivity.java +++ b/app/src/main/java/org/rssin/android/UnifiedInboxActivity.java @@ -11,9 +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.SortedFeedItemContainer; import org.rssin.rssin.Filter; import org.rssin.rssin.R; import org.rssin.rssin.UnifiedFilterLoader; diff --git a/app/src/main/java/org/rssin/neurons/FeedSorter.java b/app/src/main/java/org/rssin/neurons/FeedSorter.java index e7fdb1f..4a8fe7e 100755 --- a/app/src/main/java/org/rssin/neurons/FeedSorter.java +++ b/app/src/main/java/org/rssin/neurons/FeedSorter.java @@ -1,6 +1,9 @@ package org.rssin.neurons;
+import android.util.Log;
+
import org.rssin.rss.FeedItem;
+import org.rssin.rssin.SortedFeedItemContainer;
import org.rssin.storage.Storable;
import org.rssin.serialization.SerializationTools;
@@ -9,7 +12,6 @@ import java.util.ArrayList; import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
-import java.util.Comparator;
import java.util.Hashtable;
import java.util.List;
import java.util.Random;
@@ -150,6 +152,8 @@ public class FeedSorter implements Storable { * dislike will move them down.
*/
public void feedback(FeedItem item, Feedback feedback) {
+ Log.d("FeedSorter", "Collected feedback: " + feedback.toString());
+
PredictionInterface prediction = getPrediction(item);
prediction.learn(feedback.toExpectedOutput());
trainingCases.add(new TrainingCase(prediction.getInputs(), feedback));
@@ -180,23 +184,21 @@ public class FeedSorter implements Storable { /**
* Returns a sorted list of all the items in the List, according to the neural network.
+ * The original list of items is modified.
*
* @param items The list of items.
- * @return A new, sorted, list of items. The parameter items is not modified.
+ * @return A new, sorted, list of items.
*/
- public List<SortedFeedItemContainer> sortItems(List<FeedItem> items) {
+ public List<SortedFeedItemContainer> sortItems(List<SortedFeedItemContainer> items) {
final int SECONDS_IN_DAY = 24 * 60 * 60;
- final List<SortedFeedItemContainer> newItems = new ArrayList<>();
- for (FeedItem item : items) {
- PredictionInterface prediction = getPrediction(item);
- SortedFeedItemContainer container = new SortedFeedItemContainer(item, this);
- container.setScore((long) (item.getPubDate().getTime() / 1000 + prediction.getOutput() * SECONDS_IN_DAY));
- newItems.add(container);
+ for (SortedFeedItemContainer item : items) {
+ PredictionInterface prediction = getPrediction(item.getFeeditem());
+ item.setScore((long) (item.getFeeditem().getPubDate().getTime() / 1000 + prediction.getOutput() * SECONDS_IN_DAY));
}
- Collections.sort(newItems);
+ Collections.sort(items);
- return newItems;
+ return items;
}
}
diff --git a/app/src/main/java/org/rssin/neurons/SortedFeedItemContainer.java b/app/src/main/java/org/rssin/neurons/SortedFeedItemContainer.java deleted file mode 100755 index cc36f5e..0000000 --- a/app/src/main/java/org/rssin/neurons/SortedFeedItemContainer.java +++ /dev/null @@ -1,45 +0,0 @@ -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/rssin/FeedLoaderAndSorter.java b/app/src/main/java/org/rssin/rssin/FeedLoaderAndSorter.java index ecdfc33..3211325 100755 --- a/app/src/main/java/org/rssin/rssin/FeedLoaderAndSorter.java +++ b/app/src/main/java/org/rssin/rssin/FeedLoaderAndSorter.java @@ -5,7 +5,6 @@ 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;
@@ -30,7 +29,7 @@ public class FeedLoaderAndSorter { */
public void getFilteredFeedItems(Fetcher fetcher, final Listener<List<SortedFeedItemContainer>> listener)
{
- final List<FeedItem> resultingItems = new ArrayList<>();
+ final List<SortedFeedItemContainer> resultingItems = new ArrayList<>();
final Counter counter = new Counter(filter.getFeeds().size());
final FeedSorter sorter = filter.getFeedSorter();
@@ -40,7 +39,7 @@ public class FeedLoaderAndSorter { @Override
public void onReceive(Object data) {
for (FeedItem item : loader.getFeed().getPosts()) {
- resultingItems.add(item);
+ resultingItems.add(new SortedFeedItemContainer(item, filter));
}
List<SortedFeedItemContainer> sorted = sorter.sortItems(resultingItems);
diff --git a/app/src/main/java/org/rssin/rssin/SortedFeedItemContainer.java b/app/src/main/java/org/rssin/rssin/SortedFeedItemContainer.java new file mode 100755 index 0000000..d46cf3b --- /dev/null +++ b/app/src/main/java/org/rssin/rssin/SortedFeedItemContainer.java @@ -0,0 +1,58 @@ +package org.rssin.rssin;
+
+import org.rssin.android.FiltersList;
+import org.rssin.neurons.FeedSorter;
+import org.rssin.neurons.Feedback;
+import org.rssin.rss.FeedItem;
+
+import java.io.Serializable;
+
+/**
+ * @author Jos.
+ */
+public class SortedFeedItemContainer implements Comparable<SortedFeedItemContainer>, Serializable {
+ private FeedItem feeditem;
+ private int filterHashCode;
+ private long score;
+
+ public SortedFeedItemContainer(FeedItem feeditem, Filter filter)
+ {
+ this.feeditem = feeditem;
+ this.filterHashCode = filter.hashCode();
+ this.setScore(-1);
+ }
+
+ public FeedItem getFeeditem() {
+ return feeditem;
+ }
+
+ public FeedSorter getSorter() {
+ FiltersList provider = FiltersList.getInstance();
+ Filter f = provider.getFilterFromHashCode(filterHashCode);
+
+ return f.getFeedSorter();
+ }
+
+ public long getScore() {
+ if(score == -1)
+ {
+ throw new UnsupportedOperationException("score not set");
+ }
+
+ return score;
+ }
+
+ public void feedback(Feedback feedback)
+ {
+ getSorter().feedback(getFeeditem(), feedback);
+ }
+
+ public void setScore(long score) {
+ this.score = score;
+ }
+
+ @Override
+ public int compareTo(SortedFeedItemContainer another) {
+ return (int)(another.getScore() - this.getScore());
+ }
+}
diff --git a/app/src/main/java/org/rssin/rssin/UnifiedFilterLoader.java b/app/src/main/java/org/rssin/rssin/UnifiedFilterLoader.java index 6ca8b50..619a152 100755 --- a/app/src/main/java/org/rssin/rssin/UnifiedFilterLoader.java +++ b/app/src/main/java/org/rssin/rssin/UnifiedFilterLoader.java @@ -3,12 +3,9 @@ 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;
import java.util.Collections;
-import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
|