aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java
diff options
context:
space:
mode:
authorCamil Staps2015-05-28 15:36:31 +0200
committerCamil Staps2015-05-28 15:36:31 +0200
commite8c4bdfe6bd2cc5ab6579f042b6807f3bb7c6709 (patch)
tree53ad52af18b64cce39ecd48ded477389ad4ec54e /app/src/main/java
parentCardView (diff)
parentSelect feeds instead of add per filter (diff)
Merge branch 'app'
Diffstat (limited to 'app/src/main/java')
-rw-r--r--app/src/main/java/org/rssin/android/FilterSettingsActivity.java125
-rwxr-xr-xapp/src/main/java/org/rssin/android/FiltersActivity.java5
-rwxr-xr-xapp/src/main/java/org/rssin/android/FiltersList.java1
-rw-r--r--app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java17
-rw-r--r--app/src/main/java/org/rssin/rssin/Feed.java5
-rwxr-xr-xapp/src/main/java/org/rssin/rssin/Filter.java30
6 files changed, 120 insertions, 63 deletions
diff --git a/app/src/main/java/org/rssin/android/FilterSettingsActivity.java b/app/src/main/java/org/rssin/android/FilterSettingsActivity.java
index 4ff4dd7..b896689 100644
--- a/app/src/main/java/org/rssin/android/FilterSettingsActivity.java
+++ b/app/src/main/java/org/rssin/android/FilterSettingsActivity.java
@@ -8,6 +8,7 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
+import android.graphics.Color;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
@@ -19,6 +20,7 @@ import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
+import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
@@ -213,77 +215,93 @@ public class FilterSettingsActivity extends ActionBarActivity {
final FiltersList filtersList = FiltersList.getInstance();
final Filter filter = filtersList.getFilterFromHashCode(getArguments().getInt("filter"));
- final FeedAdapter feedAdapter = new FeedAdapter(getActivity(), R.layout.item_filter_settings_feed, filter.getFeeds());
- ListView feedsListView = (ListView) view.findViewById(R.id.filter_settings_feeds_list);
- feedsListView.setAdapter(feedAdapter);
-
- feedsListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
- @Override
- public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
- Feed feed = feedAdapter.getItem(position);
- filter.getFeeds().remove(feed);
- try {
- filtersList.save();
- feedAdapter.notifyDataSetChanged();
- return true;
- } catch (Exception e) {
- Frontend.error(getActivity(), R.string.error_save_filters, e);
- filter.getFeeds().add(feed);
- return false;
- }
- }
- });
-
- view.findViewById(R.id.filter_settings_add_feed_button).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- EditText editText = (EditText) view.findViewById(R.id.filter_settings_add_feed);
- String value = editText.getText().toString();
- try {
- URL url = new URL(value);
- Feed feed = new Feed(url);
- filter.getFeeds().add(feed);
+ try {
+ final FeedAdapter feedAdapter = new FeedAdapter(
+ getActivity(),
+ R.layout.item_filter_settings_feed,
+ FeedsList.getInstance(getActivity()).getFeeds(),
+ filter);
+ ListView feedsListView = (ListView) view.findViewById(R.id.filter_settings_feeds_list);
+ feedsListView.setAdapter(feedAdapter);
+
+ feedsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ Feed feed = feedAdapter.getItem(position);
+ List<Integer> hashCodes = filter.getFeedHashCodes();
+ if (hashCodes.contains(feed.hashCode())) {
+ hashCodes.remove(Integer.valueOf(feed.hashCode()));
+ } else {
+ hashCodes.add(feed.hashCode());
+ }
try {
- filtersList.save();
+ filter.store(DefaultStorageProvider.getInstance());
feedAdapter.notifyDataSetChanged();
- editText.setText("");
} catch (Exception e) {
Frontend.error(getActivity(), R.string.error_save_filters, e);
- filter.getFeeds().remove(feed);
+ filter.getFeeds().add(feed);
}
- } catch (MalformedURLException e) {
- Frontend.info(getActivity(), R.string.error_invalid_url, e);
}
- }
- });
+ });
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
- builder.setMessage(R.string.filter_settings_feeds)
- .setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- // @todo FIRE ZE MISSILES!
+ view.findViewById(R.id.filter_settings_add_feed_button).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ EditText editText = (EditText) view.findViewById(R.id.filter_settings_add_feed);
+ String value = editText.getText().toString();
+ try {
+ URL url = new URL(value);
+ Feed feed = new Feed(url);
+ FeedsList.getInstance().getFeeds().add(feed);
+ filter.getFeedHashCodes().add(feed.hashCode());
+
+ try {
+ filter.store(DefaultStorageProvider.getInstance());
+ feedAdapter.notifyDataSetChanged();
+ editText.setText("");
+ } catch (Exception e) {
+ Frontend.error(getActivity(), R.string.error_save_filters, e);
+ filter.getFeeds().remove(feed);
+ }
+ } catch (MalformedURLException e) {
+ Frontend.info(getActivity(), R.string.error_invalid_url, e);
}
- });
- builder.setView(view);
-
- return builder.create();
+ }
+ });
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ builder.setMessage(R.string.filter_settings_feeds)
+ .setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ // @todo FIRE ZE MISSILES!
+ }
+ });
+ builder.setView(view);
+
+ return builder.create();
+ } catch (IOException e) {
+ dismiss();
+ Frontend.error(getActivity(), R.string.error_load_feeds, e);
+ return null;
+ }
}
/**
* Custom ArrayAdapter to display feeds
*/
- private static class FeedAdapter extends ArrayAdapter<Feed> {
+ private static class FeedAdapter extends SortedArrayAdapter<Feed> {
Context context;
int layoutResourceId;
- List<Feed> feeds;
+ Filter filter;
- public FeedAdapter(Context context, int resource, List<Feed> objects) {
+ public FeedAdapter(Context context, int resource, List<Feed> objects, Filter filter) {
super(context, resource, objects);
this.context = context;
layoutResourceId = resource;
- feeds = objects;
+ items = objects;
+ this.filter = filter;
}
@Override
@@ -296,6 +314,7 @@ public class FilterSettingsActivity extends ActionBarActivity {
row = inflater.inflate(layoutResourceId, parent, false);
holder = new FeedHolder();
+ holder.layout = (LinearLayout) row.findViewById(R.id.filter_settings_feed_item);
holder.title = (TextView) row.findViewById(R.id.filter_settings_feed_item_title);
holder.url = (TextView) row.findViewById(R.id.filter_settings_feed_item_url);
@@ -304,9 +323,12 @@ public class FilterSettingsActivity extends ActionBarActivity {
holder = (FeedHolder) row.getTag();
}
- Feed feed = feeds.get(position);
+ Feed feed = items.get(position);
holder.title.setText(feed.getTitle());
holder.url.setText(feed.getURL().toString());
+ if (filter.getFeedHashCodes().contains(feed.hashCode())) {
+ holder.layout.setBackgroundColor(Color.RED);
+ }
return row;
}
@@ -315,6 +337,7 @@ public class FilterSettingsActivity extends ActionBarActivity {
* TextViews holder
*/
private static class FeedHolder {
+ LinearLayout layout;
TextView title;
TextView url;
}
diff --git a/app/src/main/java/org/rssin/android/FiltersActivity.java b/app/src/main/java/org/rssin/android/FiltersActivity.java
index f199f1d..74675b9 100755
--- a/app/src/main/java/org/rssin/android/FiltersActivity.java
+++ b/app/src/main/java/org/rssin/android/FiltersActivity.java
@@ -8,6 +8,7 @@ import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
@@ -155,12 +156,14 @@ public class FiltersActivity extends ActionBarActivity {
}
public void openFilterSettings(Filter f) {
+ f.ensureFeeds(DefaultStorageProvider.getInstance(this));
Intent intent = new Intent(getApplicationContext(), FilterSettingsActivity.class);
intent.putExtra("filter", f.hashCode());
startActivity(intent);
}
public void openFilter(Filter f) {
+ f.ensureFeeds(DefaultStorageProvider.getInstance(this));
Intent intent = new Intent(getApplicationContext(), FilterActivity.class);
intent.putExtra("filter", f.hashCode());
startActivity(intent);
@@ -179,6 +182,8 @@ public class FiltersActivity extends ActionBarActivity {
this.context = context;
layoutResourceId = resource;
items = objects;
+
+ Log.d("FilterA", "Number of filters: " + objects.size());
}
@Override
diff --git a/app/src/main/java/org/rssin/android/FiltersList.java b/app/src/main/java/org/rssin/android/FiltersList.java
index 6c1b8c9..b555e5e 100755
--- a/app/src/main/java/org/rssin/android/FiltersList.java
+++ b/app/src/main/java/org/rssin/android/FiltersList.java
@@ -68,6 +68,7 @@ class FiltersList {
public Filter getFilterFromHashCode(int hashcode) {
for (Filter f : filters) {
+ f.ensureFeeds(storageProvider);
if (f.hashCode() == hashcode) {
return f;
}
diff --git a/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java b/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java
index 61bb2e3..161e1c6 100644
--- a/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java
+++ b/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java
@@ -3,7 +3,6 @@ package org.rssin.android;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Base64;
-import android.util.Log;
import org.rssin.rssin.Feed;
import org.rssin.rssin.Filter;
@@ -71,11 +70,9 @@ class SharedPreferencesStorageProvider implements StorageProvider, FilterStorage
oos.close();
String string = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);
- context
- .getSharedPreferences(key.toString(), Context.MODE_PRIVATE)
- .edit()
- .putString(element.getClass().getName(), string)
- .apply();
+ SharedPreferences.Editor editor = context.getSharedPreferences(key.toString(), Context.MODE_PRIVATE).edit();
+ editor.putString(element.getClass().getName(), string);
+ boolean works = editor.commit();
if (element.getClass() == Filter.class) {
storeFilterKey(key);
@@ -103,12 +100,14 @@ class SharedPreferencesStorageProvider implements StorageProvider, FilterStorage
@Override
public Object uniqueKey() {
- return Long.toString(System.currentTimeMillis());
+ return "_" + Long.toString(System.currentTimeMillis());
}
@Override
public List<Filter> allFilters() {
- Set<String> names = context.getSharedPreferences(ADMIN_PREF_KEY, Context.MODE_PRIVATE).getStringSet("filters", new HashSet<String>());
+ Set<String> names = context
+ .getSharedPreferences(ADMIN_PREF_KEY, Context.MODE_PRIVATE)
+ .getStringSet("filters", new HashSet<String>());
List<Filter> filters = new ArrayList<>();
for (String name : names) {
Filter filter = getFilter(name);
@@ -152,8 +151,6 @@ class SharedPreferencesStorageProvider implements StorageProvider, FilterStorage
.edit()
.putStringSet("filters", names)
.apply();
-
- remove(key.toString(), Filter.class);
}
@Override
diff --git a/app/src/main/java/org/rssin/rssin/Feed.java b/app/src/main/java/org/rssin/rssin/Feed.java
index 967c9b3..b5c4e2e 100644
--- a/app/src/main/java/org/rssin/rssin/Feed.java
+++ b/app/src/main/java/org/rssin/rssin/Feed.java
@@ -102,6 +102,11 @@ public class Feed implements Storable, Comparable<Feed> {
}
@Override
+ public int hashCode() {
+ return title.hashCode() ^ url.toString().hashCode();
+ }
+
+ @Override
public int compareTo(Feed another) {
return title.compareTo(another.title);
}
diff --git a/app/src/main/java/org/rssin/rssin/Filter.java b/app/src/main/java/org/rssin/rssin/Filter.java
index ef9fc7a..8fd9c7b 100755
--- a/app/src/main/java/org/rssin/rssin/Filter.java
+++ b/app/src/main/java/org/rssin/rssin/Filter.java
@@ -4,6 +4,7 @@ import android.text.TextUtils;
import android.util.Log;
import org.rssin.neurons.FeedSorter;
+import org.rssin.storage.FeedStorageProvider;
import org.rssin.storage.Storable;
import org.rssin.storage.StorageProvider;
@@ -20,8 +21,10 @@ public class Filter implements Storable, Comparable<Filter> {
/**
* A filter is a list of Feeds with a list of Keywords. A title can be added as well.
+ * The List of Feeds is transient. We only store a list of Feed hashcodes
*/
- private final List<Feed> feeds;
+ private final List<Integer> feedHashCodes;
+ private transient List<Feed> feeds;
private final List<Keyword> keywords;
private String title = "";
@@ -42,28 +45,39 @@ public class Filter implements Storable, Comparable<Filter> {
private transient FeedSorter feedSorter;
public Filter() {
+ feedHashCodes = new ArrayList<>();
feeds = new ArrayList<>();
keywords = new ArrayList<>();
}
public Filter(String title) {
setTitle(title);
+ feedHashCodes = new ArrayList<>();
feeds = new ArrayList<>();
keywords = new ArrayList<>();
}
public Filter(String title, List<Keyword> keywords) {
+ feedHashCodes = new ArrayList<>();
this.feeds = new ArrayList<>();
this.keywords = keywords;
setTitle(title);
}
public Filter(String title, List<Keyword> keywords, List<Feed> feeds) {
+ feedHashCodes = new ArrayList<>();
+ for (Feed feed : feeds) {
+ feedHashCodes.add(feed.hashCode());
+ }
this.feeds = feeds;
this.keywords = keywords;
setTitle(title);
}
+ public List<Integer> getFeedHashCodes() {
+ return feedHashCodes;
+ }
+
public List<Feed> getFeeds() {
return feeds;
}
@@ -127,6 +141,18 @@ public class Filter implements Storable, Comparable<Filter> {
}
}
+ public synchronized void ensureFeeds(FeedStorageProvider storageProvider) {
+ List<Feed> all_feeds = storageProvider.allFeeds();
+ feeds = new ArrayList<>();
+ for (Integer i : feedHashCodes) {
+ for (Feed f : all_feeds) {
+ if (f.hashCode() == i) {
+ feeds.add(f);
+ }
+ }
+ }
+ }
+
@Override
public int hashCode() {
StringBuilder sb = new StringBuilder(title);
@@ -143,7 +169,7 @@ public class Filter implements Storable, Comparable<Filter> {
* @param storageProvider
* @throws Exception
*/
- public synchronized void store(StorageProvider storageProvider) throws Exception {
+ public synchronized void store(StorageProvider<Object,Filter> storageProvider) throws Exception {
if (storageKey == null) {
storageKey = storageProvider.uniqueKey();
}