From 6e4dac4f333e02e624c5b7a1d579c2c7b2888d89 Mon Sep 17 00:00:00 2001 From: Size43 Date: Wed, 10 Jun 2015 11:08:28 +0200 Subject: Removed hardcoded strings & only one TrainingCase is stored per Article. --- app/src/main/res/values/strings.xml | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'app/src/main/res') diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1a279c7..3b3a884 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -65,4 +65,9 @@ Unknown author Published on: + All feeds + START + FILTERS (EDIT) + FEEDS (EDIT) + Feedback saved. -- cgit v1.2.3 From fef7df0f36e8871a6e2bd36030d5b68a85e91f0e Mon Sep 17 00:00:00 2001 From: Size43 Date: Wed, 10 Jun 2015 11:53:29 +0200 Subject: Fixed all hardcoded strings --- README.md | 2 -- app/src/main/java/org/rssin/android/FeedSorterTrainer.java | 3 ++- app/src/main/java/org/rssin/android/FeedsActivity.java | 4 ++-- app/src/main/java/org/rssin/android/FilterSettingsActivity.java | 4 ++-- app/src/main/java/org/rssin/android/HomeScreenActivity.java | 2 +- .../java/org/rssin/android/NavigationDrawerManageFeedsFragment.java | 4 ++-- .../java/org/rssin/android/NavigationDrawerManageFiltersFragment.java | 4 ++-- app/src/main/res/values/strings.xml | 4 ++++ 8 files changed, 15 insertions(+), 12 deletions(-) (limited to 'app/src/main/res') diff --git a/README.md b/README.md index 7cd6f2c..5afc936 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,6 @@ Copyright © 2015 Randy Wanga, Jos Craaijo, Joep Bernards, Camil Staps. All (see also the @todo markings throughout the source code) ## High priority -* Walk through all java to check for hardcoded strings -* Don't train both like and dislike * Test deleting feeds * Test settings button * Make "start" not clickable diff --git a/app/src/main/java/org/rssin/android/FeedSorterTrainer.java b/app/src/main/java/org/rssin/android/FeedSorterTrainer.java index 1f88a3e..987ed45 100755 --- a/app/src/main/java/org/rssin/android/FeedSorterTrainer.java +++ b/app/src/main/java/org/rssin/android/FeedSorterTrainer.java @@ -14,8 +14,8 @@ public class FeedSorterTrainer implements Runnable { @Override public void run() { + Log.d("FeedSorterTrainer", "Training starting..."); for (int i = 0; i < 50; i++) { - Log.d("FeedSorterTrainer", "Training: round " + i); sorterProvider.getFeedSorter().train(); try { Thread.sleep(10); @@ -24,6 +24,7 @@ public class FeedSorterTrainer implements Runnable { } } + Log.d("FeedSorterTrainer", "Training stopping..."); sorterProvider.save(); } } diff --git a/app/src/main/java/org/rssin/android/FeedsActivity.java b/app/src/main/java/org/rssin/android/FeedsActivity.java index 4a69af9..32f256a 100755 --- a/app/src/main/java/org/rssin/android/FeedsActivity.java +++ b/app/src/main/java/org/rssin/android/FeedsActivity.java @@ -105,8 +105,8 @@ public class FeedsActivity extends ActionBarActivity { AlertDialog.Builder alert = new AlertDialog.Builder(this); - alert.setTitle("Add feed"); - alert.setMessage("URL:"); + alert.setTitle(getString(R.string.feeds_activity_add_feed)); + alert.setMessage(getString(R.string.feeds_activity_url)); final EditText input = new EditText(this); input.setFocusable(true); diff --git a/app/src/main/java/org/rssin/android/FilterSettingsActivity.java b/app/src/main/java/org/rssin/android/FilterSettingsActivity.java index 931a86c..3041859 100755 --- a/app/src/main/java/org/rssin/android/FilterSettingsActivity.java +++ b/app/src/main/java/org/rssin/android/FilterSettingsActivity.java @@ -182,8 +182,8 @@ public class FilterSettingsActivity extends ActionBarActivity { AlertDialog.Builder alert = new AlertDialog.Builder(this); - alert.setTitle("Title"); - alert.setMessage("New title:"); + alert.setTitle(getString(R.string.filter_settings_title)); + alert.setMessage(getString(R.string.filter_settings_new_title)); final EditText input = new EditText(this); input.setText(filter.getTitle()); diff --git a/app/src/main/java/org/rssin/android/HomeScreenActivity.java b/app/src/main/java/org/rssin/android/HomeScreenActivity.java index 378ac18..f33411b 100755 --- a/app/src/main/java/org/rssin/android/HomeScreenActivity.java +++ b/app/src/main/java/org/rssin/android/HomeScreenActivity.java @@ -41,7 +41,7 @@ public class HomeScreenActivity extends ActionBarActivity implements NavigationD fragmentManager.beginTransaction() .replace(R.id.container, currentFragment = initialFragment) .commit(); - mTitle = "All feeds"; + mTitle = getString(R.string.navigation_drawer_all_feeds); } private Fragment currentFragment; diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerManageFeedsFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerManageFeedsFragment.java index c768a3b..e239588 100755 --- a/app/src/main/java/org/rssin/android/NavigationDrawerManageFeedsFragment.java +++ b/app/src/main/java/org/rssin/android/NavigationDrawerManageFeedsFragment.java @@ -119,8 +119,8 @@ public class NavigationDrawerManageFeedsFragment extends Fragment { AlertDialog.Builder alert = new AlertDialog.Builder(context); - alert.setTitle("Add feed"); - alert.setMessage("URL:"); + alert.setTitle(getString(R.string.feeds_activity_add_feed)); + alert.setMessage(getString(R.string.feeds_activity_url)); final EditText input = new EditText(context); input.setFocusable(true); diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerManageFiltersFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerManageFiltersFragment.java index 405d7be..42be75f 100755 --- a/app/src/main/java/org/rssin/android/NavigationDrawerManageFiltersFragment.java +++ b/app/src/main/java/org/rssin/android/NavigationDrawerManageFiltersFragment.java @@ -115,8 +115,8 @@ public class NavigationDrawerManageFiltersFragment extends Fragment { AlertDialog.Builder alert = new AlertDialog.Builder(rootView.getContext()); - alert.setTitle("Add filter"); - alert.setMessage("Title:"); + alert.setTitle(getString(R.string.filters_action_add)); + alert.setMessage(getString(R.string.filter_settings_title)); final EditText input = new EditText(rootView.getContext()); input.setFocusable(true); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3b3a884..591a878 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -70,4 +70,8 @@ FILTERS (EDIT) FEEDS (EDIT) Feedback saved. + Add feed + URL: + Title + New title: -- cgit v1.2.3 From 3617197cf2b010ce59691e4a263ce5f7e2c18b25 Mon Sep 17 00:00:00 2001 From: Size43 Date: Wed, 10 Jun 2015 12:19:22 +0200 Subject: Added icons, changed filter title edittext to singleline, fixed feed settings crash --- README.md | 2 -- app/src/main/java/org/rssin/android/FeedsActivity.java | 2 +- .../java/org/rssin/android/FilterSettingsActivity.java | 1 + .../java/org/rssin/android/NavigationDrawerAdapter.java | 5 +++-- .../main/res/drawable-hdpi/ic_action_action_delete.png | Bin 0 -> 239 bytes .../main/res/drawable-hdpi/ic_action_action_settings.png | Bin 0 -> 654 bytes .../res/drawable-hdpi/ic_action_editor_border_color.png | Bin 0 -> 410 bytes .../main/res/drawable-mdpi/ic_action_action_delete.png | Bin 0 -> 190 bytes .../main/res/drawable-mdpi/ic_action_action_settings.png | Bin 0 -> 399 bytes .../res/drawable-mdpi/ic_action_editor_border_color.png | Bin 0 -> 262 bytes .../main/res/drawable-xhdpi/ic_action_action_delete.png | Bin 0 -> 306 bytes .../res/drawable-xhdpi/ic_action_action_settings.png | Bin 0 -> 903 bytes .../res/drawable-xhdpi/ic_action_editor_border_color.png | Bin 0 -> 489 bytes .../main/res/drawable-xxhdpi/ic_action_action_delete.png | Bin 0 -> 444 bytes .../res/drawable-xxhdpi/ic_action_action_settings.png | Bin 0 -> 1289 bytes .../drawable-xxhdpi/ic_action_editor_border_color.png | Bin 0 -> 678 bytes .../res/drawable-xxxhdpi/ic_action_action_delete.png | Bin 0 -> 659 bytes .../res/drawable-xxxhdpi/ic_action_action_settings.png | Bin 0 -> 2029 bytes .../drawable-xxxhdpi/ic_action_editor_border_color.png | Bin 0 -> 940 bytes app/src/main/res/menu/global.xml | 2 +- app/src/main/res/menu/home_screen.xml | 2 +- app/src/main/res/menu/menu_article.xml | 2 +- app/src/main/res/menu/menu_filter.xml | 2 +- app/src/main/res/menu/menu_filter_settings.xml | 6 ++++-- app/src/main/res/menu/menu_unified_inbox.xml | 11 ----------- app/src/main/res/values/strings.xml | 1 + 26 files changed, 14 insertions(+), 22 deletions(-) create mode 100755 app/src/main/res/drawable-hdpi/ic_action_action_delete.png create mode 100755 app/src/main/res/drawable-hdpi/ic_action_action_settings.png create mode 100755 app/src/main/res/drawable-hdpi/ic_action_editor_border_color.png create mode 100755 app/src/main/res/drawable-mdpi/ic_action_action_delete.png create mode 100755 app/src/main/res/drawable-mdpi/ic_action_action_settings.png create mode 100755 app/src/main/res/drawable-mdpi/ic_action_editor_border_color.png create mode 100755 app/src/main/res/drawable-xhdpi/ic_action_action_delete.png create mode 100755 app/src/main/res/drawable-xhdpi/ic_action_action_settings.png create mode 100755 app/src/main/res/drawable-xhdpi/ic_action_editor_border_color.png create mode 100755 app/src/main/res/drawable-xxhdpi/ic_action_action_delete.png create mode 100755 app/src/main/res/drawable-xxhdpi/ic_action_action_settings.png create mode 100755 app/src/main/res/drawable-xxhdpi/ic_action_editor_border_color.png create mode 100755 app/src/main/res/drawable-xxxhdpi/ic_action_action_delete.png create mode 100755 app/src/main/res/drawable-xxxhdpi/ic_action_action_settings.png create mode 100755 app/src/main/res/drawable-xxxhdpi/ic_action_editor_border_color.png mode change 100644 => 100755 app/src/main/res/menu/menu_filter_settings.xml delete mode 100644 app/src/main/res/menu/menu_unified_inbox.xml (limited to 'app/src/main/res') diff --git a/README.md b/README.md index 5afc936..c6fc667 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,6 @@ Copyright © 2015 Randy Wanga, Jos Craaijo, Joep Bernards, Camil Staps. All ## High priority * Test deleting feeds -* Test settings button -* Make "start" not clickable * Titles & alignment "edit" ## Normal priority diff --git a/app/src/main/java/org/rssin/android/FeedsActivity.java b/app/src/main/java/org/rssin/android/FeedsActivity.java index 32f256a..87edab0 100755 --- a/app/src/main/java/org/rssin/android/FeedsActivity.java +++ b/app/src/main/java/org/rssin/android/FeedsActivity.java @@ -45,7 +45,7 @@ public class FeedsActivity extends ActionBarActivity { Intent intent = getIntent(); String ac = intent.getAction(); - if (ac.equals(Intent.ACTION_VIEW)) { + if (ac != null && ac.equals(Intent.ACTION_VIEW)) { //open with startUri = intent.getData().toString(); openAddDialog(); diff --git a/app/src/main/java/org/rssin/android/FilterSettingsActivity.java b/app/src/main/java/org/rssin/android/FilterSettingsActivity.java index 3041859..a38c7bc 100755 --- a/app/src/main/java/org/rssin/android/FilterSettingsActivity.java +++ b/app/src/main/java/org/rssin/android/FilterSettingsActivity.java @@ -187,6 +187,7 @@ public class FilterSettingsActivity extends ActionBarActivity { final EditText input = new EditText(this); input.setText(filter.getTitle()); + input.setSingleLine(true); input.setFocusable(true); input.requestFocus(); diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerAdapter.java b/app/src/main/java/org/rssin/android/NavigationDrawerAdapter.java index 2a24342..8f0a068 100755 --- a/app/src/main/java/org/rssin/android/NavigationDrawerAdapter.java +++ b/app/src/main/java/org/rssin/android/NavigationDrawerAdapter.java @@ -57,12 +57,13 @@ class NavigationDrawerAdapter implements ListAdapter { @Override public boolean areAllItemsEnabled() { - return true; + return false; } @Override public boolean isEnabled(int position) { - return true; + // Position 0 is always "Start" + return position != 0; } private List observers = new ArrayList<>(); diff --git a/app/src/main/res/drawable-hdpi/ic_action_action_delete.png b/app/src/main/res/drawable-hdpi/ic_action_action_delete.png new file mode 100755 index 0000000..9449c35 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_action_delete.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_action_settings.png b/app/src/main/res/drawable-hdpi/ic_action_action_settings.png new file mode 100755 index 0000000..116e9a0 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_action_settings.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_editor_border_color.png b/app/src/main/res/drawable-hdpi/ic_action_editor_border_color.png new file mode 100755 index 0000000..b044320 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_editor_border_color.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_action_delete.png b/app/src/main/res/drawable-mdpi/ic_action_action_delete.png new file mode 100755 index 0000000..eb03dce Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_action_delete.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_action_settings.png b/app/src/main/res/drawable-mdpi/ic_action_action_settings.png new file mode 100755 index 0000000..1a8017b Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_action_settings.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_editor_border_color.png b/app/src/main/res/drawable-mdpi/ic_action_editor_border_color.png new file mode 100755 index 0000000..6216372 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_editor_border_color.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_action_delete.png b/app/src/main/res/drawable-xhdpi/ic_action_action_delete.png new file mode 100755 index 0000000..a0b397e Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_action_delete.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_action_settings.png b/app/src/main/res/drawable-xhdpi/ic_action_action_settings.png new file mode 100755 index 0000000..b764d9c Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_action_settings.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_editor_border_color.png b/app/src/main/res/drawable-xhdpi/ic_action_editor_border_color.png new file mode 100755 index 0000000..a754a2d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_editor_border_color.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_action_delete.png b/app/src/main/res/drawable-xxhdpi/ic_action_action_delete.png new file mode 100755 index 0000000..c1fbf46 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_action_delete.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_action_settings.png b/app/src/main/res/drawable-xxhdpi/ic_action_action_settings.png new file mode 100755 index 0000000..a68f6f9 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_action_settings.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_editor_border_color.png b/app/src/main/res/drawable-xxhdpi/ic_action_editor_border_color.png new file mode 100755 index 0000000..ef5e602 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_editor_border_color.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_action_delete.png b/app/src/main/res/drawable-xxxhdpi/ic_action_action_delete.png new file mode 100755 index 0000000..d152354 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_action_action_delete.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_action_settings.png b/app/src/main/res/drawable-xxxhdpi/ic_action_action_settings.png new file mode 100755 index 0000000..f18ff96 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_action_action_settings.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_editor_border_color.png b/app/src/main/res/drawable-xxxhdpi/ic_action_editor_border_color.png new file mode 100755 index 0000000..a57ae9b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_action_editor_border_color.png differ diff --git a/app/src/main/res/menu/global.xml b/app/src/main/res/menu/global.xml index 86959a3..c4ae1a3 100755 --- a/app/src/main/res/menu/global.xml +++ b/app/src/main/res/menu/global.xml @@ -1,5 +1,5 @@ + android:orderInCategory="100" app:showAsAction="ifRoom" android:icon="@drawable/ic_action_action_settings" /> \ No newline at end of file diff --git a/app/src/main/res/menu/home_screen.xml b/app/src/main/res/menu/home_screen.xml index a894d92..bf901df 100755 --- a/app/src/main/res/menu/home_screen.xml +++ b/app/src/main/res/menu/home_screen.xml @@ -3,5 +3,5 @@ xmlns:tools="http://schemas.android.com/tools" tools:context="org.rssin.android.HomeScreenActivity"> + android:orderInCategory="100" app:showAsAction="ifRoom" android:icon="@drawable/ic_action_action_settings" /> diff --git a/app/src/main/res/menu/menu_article.xml b/app/src/main/res/menu/menu_article.xml index 064831b..80ef7a7 100755 --- a/app/src/main/res/menu/menu_article.xml +++ b/app/src/main/res/menu/menu_article.xml @@ -19,7 +19,7 @@ diff --git a/app/src/main/res/menu/menu_filter.xml b/app/src/main/res/menu/menu_filter.xml index 86cfe5d..5822314 100755 --- a/app/src/main/res/menu/menu_filter.xml +++ b/app/src/main/res/menu/menu_filter.xml @@ -2,5 +2,5 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="org.rssin.android.HomeScreenActivity"> + android:orderInCategory="100" app:showAsAction="ifRoom" android:icon="@drawable/ic_action_action_settings" /> diff --git a/app/src/main/res/menu/menu_filter_settings.xml b/app/src/main/res/menu/menu_filter_settings.xml old mode 100644 new mode 100755 index 655ee84..a914ad8 --- a/app/src/main/res/menu/menu_filter_settings.xml +++ b/app/src/main/res/menu/menu_filter_settings.xml @@ -8,11 +8,13 @@ + app:showAsAction="ifRoom" + android:icon="@drawable/ic_action_editor_border_color"/> + app:showAsAction="ifRoom" + android:icon="@drawable/ic_action_action_delete"/> diff --git a/app/src/main/res/menu/menu_unified_inbox.xml b/app/src/main/res/menu/menu_unified_inbox.xml deleted file mode 100644 index 021ceb5..0000000 --- a/app/src/main/res/menu/menu_unified_inbox.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 591a878..df130b3 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -74,4 +74,5 @@ URL: Title New title: + Share -- cgit v1.2.3 From ed6446af455fe0749fabd0b39f1e2c1b25623e06 Mon Sep 17 00:00:00 2001 From: Size43 Date: Wed, 10 Jun 2015 13:00:11 +0200 Subject: Aligned (EDIT) to the right --- README.md | 3 +-- .../org/rssin/android/NavigationDrawerAdapter.java | 24 ++++++++++++++-------- .../res/layout/separator_navigation_drawer.xml | 16 +++++++++++++-- app/src/main/res/values/strings.xml | 5 +++-- 4 files changed, 34 insertions(+), 14 deletions(-) (limited to 'app/src/main/res') diff --git a/README.md b/README.md index c6fc667..b31a843 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,12 @@ Copyright © 2015 Randy Wanga, Jos Craaijo, Joep Bernards, Camil Staps. All (see also the @todo markings throughout the source code) ## High priority -* Test deleting feeds -* Titles & alignment "edit" ## Normal priority * Background sync & notifications * Add tutorial (e.g.: at first startup, walk user through creating first filter) * Swipe left & right for (dis)like +* Extract feed title from feed ## Low priority * Readability plugin to view whole article diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerAdapter.java b/app/src/main/java/org/rssin/android/NavigationDrawerAdapter.java index 8f0a068..973f7ab 100755 --- a/app/src/main/java/org/rssin/android/NavigationDrawerAdapter.java +++ b/app/src/main/java/org/rssin/android/NavigationDrawerAdapter.java @@ -33,16 +33,16 @@ class NavigationDrawerAdapter implements ListAdapter { public void updateMenu(Context context) throws IOException { menuItems.clear(); - menuItems.add(new MenuSection(context.getString(R.string.navigation_drawer_start))); + menuItems.add(new MenuSection(context.getString(R.string.navigation_drawer_start), "")); menuItems.add(new MenuUnifiedInbox(context)); - menuItems.add(new ManageFiltersSection(context.getString(R.string.navigation_drawer_edit_filters))); + menuItems.add(new ManageFiltersSection(context.getString(R.string.navigation_drawer_edit_filters), context.getString(R.string.navigation_drawer_edit_text))); for(Filter f : FiltersList.getInstance(context).getFilters()) { menuItems.add(new MenuFilterItem(f)); } - menuItems.add(new ManageFeedsSection(context.getString(R.string.navigation_drawer_edit_feeds))); + menuItems.add(new ManageFeedsSection(context.getString(R.string.navigation_drawer_edit_feeds), context.getString(R.string.navigation_drawer_edit_text))); for(Feed f : FeedsList.getInstance(context).getFeeds()) { @@ -117,6 +117,7 @@ class NavigationDrawerAdapter implements ListAdapter { if (type == ITEM_VIEW_TYPE_SEPARATOR) { final MenuSection section = (MenuSection) getItem(position); ((TextView) convertView.findViewById(R.id.separator_navigation_drawer_text)).setText(section.getText()); + ((TextView) convertView.findViewById(R.id.separator_navigation_drawer_edit)).setText(section.getRightText()); } else { final MenuItem video = (MenuItem) getItem(position); ((TextView) convertView.findViewById(R.id.item_navigation_drawer_text)).setText(video.getText()); @@ -261,22 +262,29 @@ class NavigationDrawerAdapter implements ListAdapter { class MenuSection extends MenuItem { - public MenuSection(String text) + private String rightText; + + public MenuSection(String text, String rightText) { super(text); + this.rightText = rightText; } @Override public int getItemViewType() { return ITEM_VIEW_TYPE_SEPARATOR; } + + public String getRightText() { + return rightText; + } } class ManageFiltersSection extends MenuSection { - public ManageFiltersSection(String text) + public ManageFiltersSection(String text, String rightText) { - super(text); + super(text, rightText); } @Override @@ -292,9 +300,9 @@ class NavigationDrawerAdapter implements ListAdapter { class ManageFeedsSection extends MenuSection { - public ManageFeedsSection(String text) + public ManageFeedsSection(String text, String rightText) { - super(text); + super(text, rightText); } @Override diff --git a/app/src/main/res/layout/separator_navigation_drawer.xml b/app/src/main/res/layout/separator_navigation_drawer.xml index 81a9d0a..a3031a0 100755 --- a/app/src/main/res/layout/separator_navigation_drawer.xml +++ b/app/src/main/res/layout/separator_navigation_drawer.xml @@ -10,7 +10,7 @@ android:layout_marginTop="0dp" android:background="#252525" > - - + + + All feeds START - FILTERS (EDIT) - FEEDS (EDIT) + FILTERS + FEEDS Feedback saved. Add feed URL: Title New title: Share + (EDIT) -- cgit v1.2.3 From 797d7a62c782e4cc141c0c434047dd3fa2fdeff5 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Wed, 10 Jun 2015 13:13:35 +0200 Subject: IT WORKS --- .../java/org/rssin/android/FeedSorterProvider.java | 13 +++-- .../java/org/rssin/android/FeedSorterTrainer.java | 1 + app/src/main/java/org/rssin/android/FeedsList.java | 26 ++++++++- .../main/java/org/rssin/android/FiltersList.java | 2 +- .../org/rssin/android/InternalStorageProvider.java | 33 ++++++----- .../android/NavigationDrawerAllFeedsFragment.java | 25 ++++---- .../android/NavigationDrawerFeedFragment.java | 21 ++++--- .../android/NavigationDrawerFilterFragment.java | 22 +++++--- .../android/SharedPreferencesStorageProvider.java | 13 ----- .../main/java/org/rssin/android/VolleyFetcher.java | 14 ++++- .../java/org/rssin/listener/RealtimeListener.java | 2 +- .../main/java/org/rssin/neurons/FeedSorter.java | 42 ++------------ .../java/org/rssin/neurons/MultiNeuralNetwork.java | 8 --- .../main/java/org/rssin/neurons/NeuralNetwork.java | 10 ---- app/src/main/java/org/rssin/neurons/Neuron.java | 9 --- .../java/org/rssin/rssin/FeedLoaderAndSorter.java | 61 ++++++++++++++++---- .../org/rssin/rssin/SortedFeedItemContainer.java | 14 ++--- app/src/main/res/values/feeds.xml | 66 ---------------------- 18 files changed, 171 insertions(+), 211 deletions(-) (limited to 'app/src/main/res') diff --git a/app/src/main/java/org/rssin/android/FeedSorterProvider.java b/app/src/main/java/org/rssin/android/FeedSorterProvider.java index 0f0748d..fcdeca2 100755 --- a/app/src/main/java/org/rssin/android/FeedSorterProvider.java +++ b/app/src/main/java/org/rssin/android/FeedSorterProvider.java @@ -15,11 +15,11 @@ public class FeedSorterProvider { private static FeedSorterProvider instance; private FeedSorter sorter = null; private final String storageKey = "FeedSorter"; - private InternalStorageProvider storageProvider; + private final StorageProvider storageProvider; private FeedSorterProvider(Context context) { - storageProvider = InternalStorageProvider.getInstance(context); + storageProvider = SharedPreferencesStorageProvider.getInstance(context); } public synchronized static FeedSorterProvider getInstance() @@ -43,8 +43,9 @@ public class FeedSorterProvider { { try { sorter = (FeedSorter) storageProvider.fetch(storageKey, FeedSorter.class); - } catch (IOException e) { + } catch (Exception e) { sorter = new FeedSorter(); + Log.v("FST", "Saving new empty sorterProvider", e); this.save(); } } @@ -52,7 +53,7 @@ public class FeedSorterProvider { return sorter; } - public synchronized void save() + public void save() { FeedSorterStorer storer = new FeedSorterStorer(storageKey, storageProvider, sorter); new Thread(storer).start(); @@ -72,7 +73,9 @@ public class FeedSorterProvider { @Override public void run() { try { - storageProvider.store(storageKey, feedSorter); + synchronized (feedSorter) { + storageProvider.store(storageKey, feedSorter); + } } catch (Exception e) { Log.e("Filter", "Failed to store FeedSorter", e); } diff --git a/app/src/main/java/org/rssin/android/FeedSorterTrainer.java b/app/src/main/java/org/rssin/android/FeedSorterTrainer.java index 1f88a3e..9704fc7 100755 --- a/app/src/main/java/org/rssin/android/FeedSorterTrainer.java +++ b/app/src/main/java/org/rssin/android/FeedSorterTrainer.java @@ -24,6 +24,7 @@ public class FeedSorterTrainer implements Runnable { } } + Log.v("FST", "Saving sorterProvider"); sorterProvider.save(); } } diff --git a/app/src/main/java/org/rssin/android/FeedsList.java b/app/src/main/java/org/rssin/android/FeedsList.java index 72a56d1..1036ad3 100644 --- a/app/src/main/java/org/rssin/android/FeedsList.java +++ b/app/src/main/java/org/rssin/android/FeedsList.java @@ -1,8 +1,11 @@ package org.rssin.android; import android.content.Context; +import android.preference.PreferenceManager; +import android.util.Log; import org.rssin.rssin.Feed; +import org.rssin.rssin.R; import java.io.IOException; import java.util.Collections; @@ -16,18 +19,39 @@ class FeedsList { private static FeedsList instance; - private final List feeds; + private List feeds; private final DefaultStorageProvider storageProvider; + public static final boolean USE_DEFAULT_LIST = true; + /** * Fetch from storage provider * @param context needed to get the storageprovider * @throws IOException if data is corrupted, and deserializing fails */ + @SuppressWarnings("all") protected FeedsList(Context context) throws IOException { storageProvider = DefaultStorageProvider.getInstance(context); feeds = storageProvider.allFeeds(); sort(); + + if (USE_DEFAULT_LIST && + feeds.isEmpty() && + !PreferenceManager.getDefaultSharedPreferences(context).getBoolean("firstload", false)) { + String[] feedsList = context.getResources().getStringArray(R.array.default_feeds); + for (String url : feedsList) { + try { + Feed f = new Feed(url); + f.store(storageProvider); + } catch (Exception e) { + Log.w("SPSP", "Couldn't add " + url, e); + } + } + PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean("firstload", true).apply(); + + feeds = storageProvider.allFeeds(); + sort(); + } } public static FeedsList getInstance(Context context) throws IOException { diff --git a/app/src/main/java/org/rssin/android/FiltersList.java b/app/src/main/java/org/rssin/android/FiltersList.java index 6b53186..b555e5e 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 */ -public class FiltersList { +class FiltersList { private static FiltersList instance; diff --git a/app/src/main/java/org/rssin/android/InternalStorageProvider.java b/app/src/main/java/org/rssin/android/InternalStorageProvider.java index c5a7bc1..b6787b4 100644 --- a/app/src/main/java/org/rssin/android/InternalStorageProvider.java +++ b/app/src/main/java/org/rssin/android/InternalStorageProvider.java @@ -1,6 +1,7 @@ package org.rssin.android; import android.content.Context; +import android.util.Log; import org.rssin.neurons.FeedSorter; import org.rssin.rssin.Filter; @@ -8,6 +9,7 @@ import org.rssin.storage.FilterStorageProvider; import org.rssin.storage.Storable; import org.rssin.storage.StorageProvider; +import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; @@ -21,14 +23,15 @@ import java.util.List; * A way to store data in internal storage * @author Camil Staps */ -class InternalStorageProvider implements StorageProvider, FilterStorageProvider { +class InternalStorageProvider implements StorageProvider, FilterStorageProvider { protected static final String PREFIX = "storage_", PREFIX_FILTER = "f_", PREFIX_FEEDSORTER = "fs_"; private static InternalStorageProvider instance; private final Context context; - private InternalStorageProvider(Context context) { + // @todo redo singleton + public InternalStorageProvider(Context context) { this.context = context; } @@ -43,7 +46,7 @@ class InternalStorageProvider implements StorageProvider, Filt } @Override - public synchronized void store(String key, Storable element) throws FileNotFoundException, IOException { + public synchronized void store(String key, FeedSorter element) throws FileNotFoundException, IOException { FileOutputStream fos = context.openFileOutput(getFilename(key, element), Context.MODE_PRIVATE); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(element); @@ -52,7 +55,7 @@ class InternalStorageProvider implements StorageProvider, Filt } @Override - public Storable fetch(String key, Class className) throws ClassCastException, FileNotFoundException, IOException { + public FeedSorter fetch(String key, Class className) throws ClassCastException, FileNotFoundException, IOException { return fetchFromFilename(getFilename(key, className)); } @@ -61,11 +64,11 @@ class InternalStorageProvider implements StorageProvider, Filt throw new UnsupportedOperationException("Not implemented yet."); } - public Storable fetchFromFilename(String fileName) throws ClassCastException, FileNotFoundException, IOException { + public FeedSorter fetchFromFilename(String fileName) throws ClassCastException, FileNotFoundException, IOException { FileInputStream fis = context.openFileInput(fileName); ObjectInputStream ois = new ObjectInputStream(fis); try { - return (Storable) ois.readObject(); + return (FeedSorter) ois.readObject(); } catch (ClassNotFoundException e) { return null; } @@ -114,11 +117,11 @@ class InternalStorageProvider implements StorageProvider, Filt @Override public List allFilters() { List filters = new ArrayList<>(); - for (String fileName : context.fileList()) { - try { - filters.add((Filter) fetchFromFilename(fileName)); - } catch (ClassCastException | IOException e) {} - } +// for (String fileName : context.fileList()) { +// try { +// filters.add((Filter) fetchFromFilename(fileName)); +// } catch (ClassCastException | IOException e) {} +// } return filters; } @@ -129,11 +132,11 @@ class InternalStorageProvider implements StorageProvider, Filt @Override public Filter getFilter(String key) { - try { - return (Filter) fetch(key, Filter.class); - } catch (ClassCastException | IOException e) { +// try { +// return (Filter) fetch(key, Filter.class); +// } catch (ClassCastException | IOException e) { return null; - } +// } } @Override diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerAllFeedsFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerAllFeedsFragment.java index b7a0d73..e32b7e6 100755 --- a/app/src/main/java/org/rssin/android/NavigationDrawerAllFeedsFragment.java +++ b/app/src/main/java/org/rssin/android/NavigationDrawerAllFeedsFragment.java @@ -10,13 +10,12 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import com.android.volley.VolleyError; - -import org.rssin.listener.FallibleListener; +import org.rssin.listener.RealtimeListener; import org.rssin.rssin.FeedLoaderAndSorter; import org.rssin.rssin.R; import org.rssin.rssin.SortedFeedItemContainer; +import java.util.ArrayList; import java.util.List; /** @@ -42,24 +41,30 @@ public class NavigationDrawerAllFeedsFragment extends Fragment { RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(context); mRecyclerView.setLayoutManager(mLayoutManager); + final FeedItemAdapter feedItemAdapter = new FeedItemAdapter(new ArrayList()); + mRecyclerView.setAdapter(feedItemAdapter); + mRecyclerView.setHasFixedSize(true); + /** - * @todo Load feeds in separate thread so that the UI is immediately available - * * @todo Now, feed items are only returned after *all* feeds have been loaded. With many * filters that may take a while, so it would be preferable to return intermediate * results. We could do this for example with {@link org.rssin.listener.RealtimeListener} */ FeedLoaderAndSorter loaderAndSorter = new FeedLoaderAndSorter(FeedsList.getInstance().getFeeds()); - loaderAndSorter.getFilteredFeedItems(context, new VolleyFetcher(context), new FallibleListener, VolleyError>() { + loaderAndSorter.getFilteredFeedItems(context, VolleyFetcher.getInstance(context), new RealtimeListener, Object>() { + @Override + public void finish() { + // @todo finish + } + @Override public void onReceive(List data) { - FeedItemAdapter feedItemAdapter = new FeedItemAdapter(data); - mRecyclerView.setAdapter(feedItemAdapter); - mRecyclerView.setHasFixedSize(true); + feedItemAdapter.feedItems = data; + feedItemAdapter.notifyDataSetChanged(); } @Override - public void onError(VolleyError error) { + public void onError(Object error) { Frontend.error(context, R.string.error_net_load); } }); diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerFeedFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerFeedFragment.java index 0f33aca..66b808b 100755 --- a/app/src/main/java/org/rssin/android/NavigationDrawerFeedFragment.java +++ b/app/src/main/java/org/rssin/android/NavigationDrawerFeedFragment.java @@ -13,6 +13,7 @@ import android.view.ViewGroup; import com.android.volley.VolleyError; import org.rssin.listener.FallibleListener; +import org.rssin.listener.RealtimeListener; import org.rssin.rssin.Feed; import org.rssin.rssin.FeedLoaderAndSorter; import org.rssin.rssin.R; @@ -67,24 +68,30 @@ public class NavigationDrawerFeedFragment extends Fragment { List singleFeedList = new ArrayList(); singleFeedList.add(feed); + final FeedItemAdapter feedItemAdapter = new FeedItemAdapter(new ArrayList()); + mRecyclerView.setAdapter(feedItemAdapter); + mRecyclerView.setHasFixedSize(true); + /** - * @todo Load feeds in separate thread so that the UI is immediately available - * * @todo Now, feed items are only returned after *all* feeds have been loaded. With many * filters that may take a while, so it would be preferable to return intermediate * results. We could do this for example with {@link org.rssin.listener.RealtimeListener} */ FeedLoaderAndSorter loaderAndSorter = new FeedLoaderAndSorter(singleFeedList); - loaderAndSorter.getFilteredFeedItems(context, new VolleyFetcher(context), new FallibleListener, VolleyError>() { + loaderAndSorter.getFilteredFeedItems(context, VolleyFetcher.getInstance(context), new RealtimeListener, Object>() { + @Override + public void finish() { + // @todo finish + } + @Override public void onReceive(List data) { - FeedItemAdapter feedItemAdapter = new FeedItemAdapter(data); - mRecyclerView.setAdapter(feedItemAdapter); - mRecyclerView.setHasFixedSize(true); + feedItemAdapter.feedItems = data; + feedItemAdapter.notifyDataSetChanged(); } @Override - public void onError(VolleyError error) { + public void onError(Object error) { Frontend.error(context, R.string.error_net_load); } }); diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerFilterFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerFilterFragment.java index 74be14a..ececd81 100755 --- a/app/src/main/java/org/rssin/android/NavigationDrawerFilterFragment.java +++ b/app/src/main/java/org/rssin/android/NavigationDrawerFilterFragment.java @@ -13,12 +13,14 @@ import android.view.ViewGroup; import com.android.volley.VolleyError; import org.rssin.listener.FallibleListener; +import org.rssin.listener.RealtimeListener; import org.rssin.rssin.FeedLoaderAndSorter; import org.rssin.rssin.Filter; import org.rssin.rssin.R; import org.rssin.rssin.SortedFeedItemContainer; import java.io.IOException; +import java.util.ArrayList; import java.util.List; /** @@ -66,24 +68,30 @@ public class NavigationDrawerFilterFragment extends Fragment { filter.ensureFeeds(DefaultStorageProvider.getInstance(context)); + final FeedItemAdapter feedItemAdapter = new FeedItemAdapter(new ArrayList()); + mRecyclerView.setAdapter(feedItemAdapter); + mRecyclerView.setHasFixedSize(true); + /** - * @todo Load feeds in separate thread so that the UI is immediately available - * * @todo Now, feed items are only returned after *all* feeds have been loaded. With many * filters that may take a while, so it would be preferable to return intermediate * results. We could do this for example with {@link org.rssin.listener.RealtimeListener} */ FeedLoaderAndSorter loaderAndSorter = new FeedLoaderAndSorter(filter.getFeeds()); - loaderAndSorter.getFilteredFeedItems(context, new VolleyFetcher(context), new FallibleListener, VolleyError>() { + loaderAndSorter.getFilteredFeedItems(context, VolleyFetcher.getInstance(context), new RealtimeListener, Object>() { + @Override + public void finish() { + // @todo finish + } + @Override public void onReceive(List data) { - FeedItemAdapter feedItemAdapter = new FeedItemAdapter(data); - mRecyclerView.setAdapter(feedItemAdapter); - mRecyclerView.setHasFixedSize(true); + feedItemAdapter.feedItems = data; + feedItemAdapter.notifyDataSetChanged(); } @Override - public void onError(VolleyError error) { + public void onError(Object error) { Frontend.error(context, R.string.error_net_load); } }); diff --git a/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java b/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java index dbfcc9a..ffcf0e1 100755 --- a/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java +++ b/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java @@ -168,19 +168,6 @@ class SharedPreferencesStorageProvider implements StorageProvider, FilterStorage @Override public List allFeeds() { Set names = context.getSharedPreferences(ADMIN_PREF_KEY, Context.MODE_PRIVATE).getStringSet("feeds", new HashSet()); - if (names.isEmpty() && !context.getSharedPreferences(ADMIN_PREF_KEY, Context.MODE_PRIVATE).getBoolean("firstload", false)) { - String[] feedsList = context.getResources().getStringArray(R.array.default_feeds); - /*for (String url : feedsList) { - try { - Feed f = new Feed(url); - f.store(this); - } catch (Exception e) { - Log.w("SPSP", "Couldn't add " + url, e); - } - }*/ - context.getSharedPreferences(ADMIN_PREF_KEY, Context.MODE_PRIVATE).edit().putBoolean("firstload", true).apply(); - names = context.getSharedPreferences(ADMIN_PREF_KEY, Context.MODE_PRIVATE).getStringSet("feeds", new HashSet()); - } List feeds = new ArrayList<>(); for (String name : names) { Feed feed = getFeed(name); diff --git a/app/src/main/java/org/rssin/android/VolleyFetcher.java b/app/src/main/java/org/rssin/android/VolleyFetcher.java index af6895e..9aa7c03 100644 --- a/app/src/main/java/org/rssin/android/VolleyFetcher.java +++ b/app/src/main/java/org/rssin/android/VolleyFetcher.java @@ -19,14 +19,22 @@ import org.rssin.listener.Listener; */ class VolleyFetcher implements Fetcher { - private final Context context; + private static VolleyFetcher instance; + private final RequestQueue requestQueue; - public VolleyFetcher(Context context) { - this.context = context; + private VolleyFetcher(Context context) { requestQueue = Volley.newRequestQueue(context); } + public static VolleyFetcher getInstance(Context context) { + if (instance == null) { + instance = new VolleyFetcher(context); + } + + return instance; + } + @Override public void fetch(Request request) { fetch(request, null); diff --git a/app/src/main/java/org/rssin/listener/RealtimeListener.java b/app/src/main/java/org/rssin/listener/RealtimeListener.java index 4a2ac3e..cb63b33 100644 --- a/app/src/main/java/org/rssin/listener/RealtimeListener.java +++ b/app/src/main/java/org/rssin/listener/RealtimeListener.java @@ -4,6 +4,6 @@ package org.rssin.listener; * The RealtimeListener lets you call onReceive() multiple times. * When all data has been sent, call finish(). */ -public interface RealtimeListener extends Listener { +public interface RealtimeListener extends FallibleListener { void finish(); } diff --git a/app/src/main/java/org/rssin/neurons/FeedSorter.java b/app/src/main/java/org/rssin/neurons/FeedSorter.java index 0af57ae..d2605f1 100755 --- a/app/src/main/java/org/rssin/neurons/FeedSorter.java +++ b/app/src/main/java/org/rssin/neurons/FeedSorter.java @@ -24,7 +24,7 @@ public class FeedSorter implements Storable { private static final long serialVersionUID = 0; private final SentenceSplitter splitter = new SentenceSplitter(); - private MultiNeuralNetwork nn = new MultiNeuralNetwork(25, 50); + private MultiNeuralNetwork nn = new MultiNeuralNetwork(10, 50); private List trainingCases = new ArrayList<>(); private int[] isNthMonthInput = new int[12]; @@ -34,36 +34,6 @@ public class FeedSorter implements Storable { private Hashtable wordInputs = new Hashtable<>(); private Hashtable authorInputs = new Hashtable<>(); - private synchronized void writeObject(java.io.ObjectOutputStream stream) throws IOException { - stream.writeObject(nn); - SerializationTools.writeList(trainingCases, stream); - SerializationTools.writeArray(isNthMonthInput, stream); - SerializationTools.writeArray(isNthWeekDayInput, stream); - stream.writeInt(isMorning); - stream.writeInt(isAfternoon); - stream.writeInt(isEvening); - stream.writeInt(isNight); - stream.writeInt(biasInput); - stream.writeObject(categoryInputs); - stream.writeObject(wordInputs); - stream.writeObject(authorInputs); - } - - private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException { - nn = (MultiNeuralNetwork) stream.readObject(); - trainingCases = SerializationTools.readList(stream); - isNthMonthInput = SerializationTools.readArrayInt(stream); - isNthWeekDayInput = SerializationTools.readArrayInt(stream); - isMorning = stream.readInt(); - isAfternoon = stream.readInt(); - isEvening = stream.readInt(); - isNight = stream.readInt(); - biasInput = stream.readInt(); - categoryInputs = (Hashtable) stream.readObject(); - wordInputs = (Hashtable) stream.readObject(); - authorInputs = (Hashtable) stream.readObject(); - } - public FeedSorter() { biasInput = nn.addInput(); for (int i = 0; i < 12; i++) { @@ -189,16 +159,16 @@ public class FeedSorter implements Storable { * @param items The list of items. * @return A new, sorted, list of items. */ - public List sortItems(List items) { + public synchronized void sortItems(List items) { final int SECONDS_IN_DAY = 24 * 60 * 60; for (SortedFeedItemContainer item : items) { - PredictionInterface prediction = getPrediction(item.getFeeditem()); - item.setScore((long) (item.getFeeditem().getPubDate().getTime() / 1000 + prediction.getOutput() * SECONDS_IN_DAY)); + if (!item.hasScore()) { + PredictionInterface prediction = getPrediction(item.getFeeditem()); + item.setScore((long) (item.getFeeditem().getPubDate().getTime() / 1000 + prediction.getOutput() * SECONDS_IN_DAY)); + } } Collections.sort(items); - - return items; } } diff --git a/app/src/main/java/org/rssin/neurons/MultiNeuralNetwork.java b/app/src/main/java/org/rssin/neurons/MultiNeuralNetwork.java index 9ba40e0..420f43d 100755 --- a/app/src/main/java/org/rssin/neurons/MultiNeuralNetwork.java +++ b/app/src/main/java/org/rssin/neurons/MultiNeuralNetwork.java @@ -13,14 +13,6 @@ class MultiNeuralNetwork implements Serializable { private static final long serialVersionUID = 0; private NeuralNetwork[] networks; - private synchronized void writeObject(java.io.ObjectOutputStream stream) throws IOException { - SerializationTools.writeArray(networks, stream); - } - - private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException { - networks = SerializationTools.readArray(stream, NeuralNetwork.class); - } - public MultiNeuralNetwork(int numNetworks, int numHiddenNodes) { networks = new NeuralNetwork[numNetworks]; for (int i = 0; i < networks.length; i++) { diff --git a/app/src/main/java/org/rssin/neurons/NeuralNetwork.java b/app/src/main/java/org/rssin/neurons/NeuralNetwork.java index 972f9de..e050145 100755 --- a/app/src/main/java/org/rssin/neurons/NeuralNetwork.java +++ b/app/src/main/java/org/rssin/neurons/NeuralNetwork.java @@ -15,16 +15,6 @@ class NeuralNetwork implements Serializable { private Neuron[] hiddenNodes; private Neuron outputNode; - private synchronized void writeObject(java.io.ObjectOutputStream stream) throws IOException { - SerializationTools.writeArray(hiddenNodes, stream); - stream.writeObject(outputNode); - } - - private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException { - hiddenNodes = SerializationTools.readArray(stream, Neuron.class); - outputNode = (Neuron) stream.readObject(); - } - NeuralNetwork(int numHiddenNodes) { if (numHiddenNodes < 1) { throw new IllegalArgumentException("numHiddenNodes must be > 0"); diff --git a/app/src/main/java/org/rssin/neurons/Neuron.java b/app/src/main/java/org/rssin/neurons/Neuron.java index da0e4ca..e29e218 100755 --- a/app/src/main/java/org/rssin/neurons/Neuron.java +++ b/app/src/main/java/org/rssin/neurons/Neuron.java @@ -17,15 +17,6 @@ class Neuron implements Serializable { private List weights = new ArrayList<>(); - private synchronized void writeObject(java.io.ObjectOutputStream stream) throws IOException { - SerializationTools.writeList(weights, stream); - } - - private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException { - weights = SerializationTools.readList(stream); - } - - public Neuron() { } diff --git a/app/src/main/java/org/rssin/rssin/FeedLoaderAndSorter.java b/app/src/main/java/org/rssin/rssin/FeedLoaderAndSorter.java index a317a27..5e9a05a 100755 --- a/app/src/main/java/org/rssin/rssin/FeedLoaderAndSorter.java +++ b/app/src/main/java/org/rssin/rssin/FeedLoaderAndSorter.java @@ -30,25 +30,68 @@ public class FeedLoaderAndSorter { * @param fetcher HTTP Fetcher * @param listener Listener for when the fetcher finishes */ - public void getFilteredFeedItems(Context context, Fetcher fetcher, final Listener> listener) - { + public void getFilteredFeedItems( + Context context, + Fetcher fetcher, + final RealtimeListener, Object> listener) { final List resultingItems = new ArrayList<>(); final Counter counter = new Counter(feeds.size()); final FeedSorter sorter = FeedSorterProvider.getInstance(context).getFeedSorter(); for (Feed feed : feeds) { + Loader loader = new Loader( + feed, + fetcher, + listener, + resultingItems, + counter, + sorter + ); + Thread thread = new Thread(loader); + thread.start(); + } + } + + private static class Loader implements Runnable { + + final private Feed feed; + final private Fetcher fetcher; + final private RealtimeListener,Object> listener; + final private List resultingItems; + final private Counter counter; + final private FeedSorter feedSorter; + + public Loader( + Feed feed, + Fetcher fetcher, + RealtimeListener,Object> listener, + List resultingItems, + Counter counter, + FeedSorter feedSorter) { + this.feed = feed; + this.fetcher = fetcher; + this.listener = listener; + this.resultingItems = resultingItems; + this.counter = counter; + this.feedSorter = feedSorter; + } + + @Override + public void run() { final FeedLoader loader = new FeedLoader(feed.getURL()); loader.fetchXML(fetcher, new FallibleListener() { @Override public void onReceive(Object data) { - for (FeedItem item : loader.getFeed().getPosts()) { - resultingItems.add(new SortedFeedItemContainer(item)); + List feedItems = loader.getFeed().getPosts(); + synchronized (resultingItems) { + for (FeedItem item : feedItems) { + resultingItems.add(new SortedFeedItemContainer(item)); + } + feedSorter.sortItems(resultingItems); } - List sorted = sorter.sortItems(resultingItems); - if (counter.decr().isZero() || listener.getClass() == RealtimeListener.class) { - listener.onReceive(sorted); + listener.onReceive(resultingItems); if (counter.decr().isZero() && listener.getClass() == RealtimeListener.class) { ((RealtimeListener) listener).finish(); } @@ -57,9 +100,7 @@ public class FeedLoaderAndSorter { @Override public void onError(Object error) { - try { - ((FallibleListener) listener).onError(error); - } catch (ClassCastException e) {} + listener.onError(error); } }); } diff --git a/app/src/main/java/org/rssin/rssin/SortedFeedItemContainer.java b/app/src/main/java/org/rssin/rssin/SortedFeedItemContainer.java index 2a69bfa..384f43c 100755 --- a/app/src/main/java/org/rssin/rssin/SortedFeedItemContainer.java +++ b/app/src/main/java/org/rssin/rssin/SortedFeedItemContainer.java @@ -3,8 +3,6 @@ package org.rssin.rssin; import android.content.Context; import org.rssin.android.FeedSorterProvider; -import org.rssin.android.FiltersList; -import org.rssin.neurons.FeedSorter; import org.rssin.neurons.Feedback; import org.rssin.rss.FeedItem; @@ -15,24 +13,22 @@ import java.io.Serializable; */ public class SortedFeedItemContainer implements Comparable, Serializable { private FeedItem feeditem; - private long score; + private long score = -1; public SortedFeedItemContainer(FeedItem feeditem) { this.feeditem = feeditem; - this.setScore(-1); } public FeedItem getFeeditem() { return feeditem; } - public long getScore() { - if(score == -1) - { - throw new UnsupportedOperationException("score not set"); - } + public boolean hasScore() { + return score != 0; + } + public long getScore() { return score; } diff --git a/app/src/main/res/values/feeds.xml b/app/src/main/res/values/feeds.xml index e4ae386..384739b 100644 --- a/app/src/main/res/values/feeds.xml +++ b/app/src/main/res/values/feeds.xml @@ -1,86 +1,20 @@ - http://feeds.bbci.co.uk/news/business/rss.xml - http://feeds.bbci.co.uk/news/entertainment_and_arts/rss.xml - http://feeds.bbci.co.uk/news/health/rss.xml http://feeds.bbci.co.uk/news/politics/rss.xml http://feeds.bbci.co.uk/news/science_and_environment/rss.xml http://feeds.bbci.co.uk/news/technology/rss.xml - http://feeds.bbci.co.uk/news/uk/rss.xml http://feeds.bbci.co.uk/news/world/rss.xml http://feeds.bbci.co.uk/sport/0/rss.xml - http://feeds.foxnews.com/foxnews/internal/travel/mixed - http://feeds.foxnews.com/foxnews/opinion http://feeds.foxnews.com/foxnews/politics http://feeds.foxnews.com/foxnews/science - http://feeds.foxnews.com/foxnews/section/lifestyle http://feeds.foxnews.com/foxnews/sports http://feeds.foxnews.com/foxnews/tech - http://feeds.mashable.com/mashable/business - http://feeds.mashable.com/mashable/entertainment - http://feeds.mashable.com/mashable/socialmedia - http://feeds.mashable.com/mashable/tech - http://feeds.reuters.com/news/artsculture - http://feeds.reuters.com/news/economy - http://feeds.reuters.com/news/reutersmedia - http://feeds.reuters.com/news/wealth - http://feeds.reuters.com/reuters/businessNews - http://feeds.reuters.com/reuters/entertainment http://feeds.reuters.com/reuters/environment http://feeds.reuters.com/reuters/financialsNews - http://feeds.reuters.com/reuters/healthNews - http://feeds.reuters.com/reuters/hotStocksNews - http://feeds.reuters.com/reuters/lifestyle - http://feeds.reuters.com/reuters/oddlyEnoughNews - http://feeds.reuters.com/Reuters/PoliticsNews - http://feeds.reuters.com/reuters/scienceNews - http://feeds.reuters.com/reuters/sportsNews - http://feeds.reuters.com/reuters/technologyNews - http://feeds.reuters.com/reuters/technologysectorNews - http://feeds.reuters.com/reuters/UShealthcareNews http://feeds.reuters.com/reuters/worldNews - http://rss.cnn.com/rss/edition_entertainment.rss - http://rss.cnn.com/rss/edition_space.rss - http://rss.cnn.com/rss/edition_sport.rss - http://rss.cnn.com/rss/edition_technology.rss - http://rss.cnn.com/rss/money_news_international.rss - http://rss.cnn.com/rss/si_topstories.rss - http://rss.nytimes.com/services/xml/rss/nyt/Books.xml - http://rss.nytimes.com/services/xml/rss/nyt/Business.xml - http://rss.nytimes.com/services/xml/rss/nyt/Dance.xml - http://rss.nytimes.com/services/xml/rss/nyt/Economy.xml http://rss.nytimes.com/services/xml/rss/nyt/Environment.xml - http://rss.nytimes.com/services/xml/rss/nyt/FashionandStyle.xml - http://rss.nytimes.com/services/xml/rss/nyt/MediaandAdvertising.xml - http://rss.nytimes.com/services/xml/rss/nyt/Movies.xml http://rss.nytimes.com/services/xml/rss/nyt/Music.xml - http://rss.nytimes.com/services/xml/rss/nyt/Science.xml - http://rss.nytimes.com/services/xml/rss/nyt/Sports.xml - http://rss.nytimes.com/services/xml/rss/nyt/Technology.xml http://rss.nytimes.com/services/xml/rss/nyt/Travel.xml - http://www.cnet.com/rss/news/ - http://www.dailymail.co.uk/health/index.rss - http://www.dailymail.co.uk/money/index.rss - http://www.dailymail.co.uk/sciencetech/index.rss - http://www.dailymail.co.uk/sport/index.rss - http://www.dailymail.co.uk/tvshowbiz/index.rss - http://www.thesundaily.my/rss/business - http://www.thesundaily.my/rss/lifestyle/food - http://www.thesundaily.my/rss/lifestyle/health - http://www.thesundaily.my/rss/lifestyle/tech - http://www.thesundaily.my/rss/lifestyle/travel - http://www.thesundaily.my/rss/media-marketing - http://www.thesundaily.my/rss/opinion - http://www.thesundaily.my/rss/showbiz - http://www.thesundaily.my/rss/sports - http://www.thesundaily.my/rss/style - http://www.washingtontimes.com/rss/headlines/culture/autos/ - http://www.washingtontimes.com/rss/headlines/culture/entertainment/ - http://www.washingtontimes.com/rss/headlines/culture/health/ - http://www.washingtontimes.com/rss/headlines/culture/travel/ - http://www.washingtontimes.com/rss/headlines/news/politics/ - http://www.washingtontimes.com/rss/headlines/opinion/ - http://www.washingtontimes.com/rss/headlines/sports/ \ No newline at end of file -- cgit v1.2.3