diff options
author | Camil Staps | 2015-05-28 15:30:36 +0200 |
---|---|---|
committer | Camil Staps | 2015-05-28 15:30:36 +0200 |
commit | 99999c7e862f32ea4976158390d914fd45bb2b01 (patch) | |
tree | 0147ebf47d0c37595d6085485f7ee0fd468c99b7 /app | |
parent | comments, cleanup (diff) |
Select feeds instead of add per filter
Diffstat (limited to 'app')
7 files changed, 121 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(); } diff --git a/app/src/main/res/layout/item_filter_settings_feed.xml b/app/src/main/res/layout/item_filter_settings_feed.xml index ed3d596..4f027eb 100644 --- a/app/src/main/res/layout/item_filter_settings_feed.xml +++ b/app/src/main/res/layout/item_filter_settings_feed.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/filter_settings_feed_item" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" |