diff options
author | Camil Staps | 2015-06-03 11:51:55 +0200 |
---|---|---|
committer | Camil Staps | 2015-06-03 11:53:56 +0200 |
commit | 4a57a217d002f75d3cd10b081c5f4cb73d2ea275 (patch) | |
tree | 1403057c36934fe6b7d72eea0cb943c8d5e0d0cb /app/src/main/java | |
parent | Remove Keywords (diff) |
Nicer filter settings
Diffstat (limited to 'app/src/main/java')
4 files changed, 145 insertions, 163 deletions
diff --git a/app/src/main/java/org/rssin/android/FilterSettingsActivity.java b/app/src/main/java/org/rssin/android/FilterSettingsActivity.java index 296d2e5..931a86c 100755 --- a/app/src/main/java/org/rssin/android/FilterSettingsActivity.java +++ b/app/src/main/java/org/rssin/android/FilterSettingsActivity.java @@ -18,9 +18,11 @@ import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.AdapterView; +import android.widget.CheckBox; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ListView; +import android.widget.RelativeLayout; import android.widget.TextView; import org.rssin.rssin.Feed; @@ -55,6 +57,82 @@ public class FilterSettingsActivity extends ActionBarActivity { filter = filtersList.getFilterFromHashCode(filterHashCode); setTitle(); + + try { + setupFeedsList(); + } catch (IOException e) { + Frontend.error(this, R.string.error_load_feeds, e); + } + } + + /** + * Setup the list of feeds + * @throws IOException + */ + protected void setupFeedsList() throws IOException { + final FeedAdapter feedAdapter = new FeedAdapter( + this, + R.layout.item_filter_settings_feed, + FeedsList.getInstance(this).getFeeds(), + filter); + + final ListView feedsListView = (ListView) 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) feed.hashCode()); + } else { + hashCodes.add(feed.hashCode()); + } + try { + filter.store(DefaultStorageProvider.getInstance()); + feedAdapter.notifyDataSetChanged(); + } catch (Exception e) { + Frontend.error(getBaseContext(), R.string.error_save_filters, e); + filter.getFeeds().add(feed); + } + } + }); + + /** + * @todo Allow users to enter links without scheme (http:// ...) + */ + findViewById(R.id.filter_settings_add_feed_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + EditText editText = (EditText) findViewById(R.id.filter_settings_add_feed); + String value = editText.getText().toString(); + try { + URL url = new URL(value); + Feed feed = new Feed(url); + try { + feed.store(DefaultStorageProvider.getInstance()); + FeedsList.getInstance().getFeeds().add(feed); + filter.getFeedHashCodes().add(feed.hashCode()); + + try { + filter.store(DefaultStorageProvider.getInstance()); + feed.store(DefaultStorageProvider.getInstance()); + feedAdapter.notifyDataSetChanged(); + editText.setText(""); + } catch (Exception e) { + Frontend.error(getBaseContext(), R.string.error_save_filters, e); + filter.getFeeds().remove(feed); + } + } catch (Exception e) { + Frontend.error(getBaseContext(), R.string.error_save_feeds, e); + FeedsList.getInstance().getFeeds().remove(feed); + } + } catch (MalformedURLException e) { + Frontend.info(getBaseContext(), R.string.error_invalid_url, e); + } + } + }); } @Override @@ -68,9 +146,6 @@ public class FilterSettingsActivity extends ActionBarActivity { int id = item.getItemId(); switch (id) { - case R.id.filter_settings_action_feeds: - openFeedsDialog(); - return true; case R.id.filter_settings_action_title: openTitleDialog(); return true; @@ -98,17 +173,6 @@ public class FilterSettingsActivity extends ActionBarActivity { } /** - * Open dialog to edit feeds - */ - public void openFeedsDialog() { - FeedsDialogFragment f = new FeedsDialogFragment(); - Bundle bundle = new Bundle(); - bundle.putInt("filter", filter.hashCode()); - f.setArguments(bundle); - f.show(getFragmentManager(), ""); - } - - /** * Open dialog to edit title * For the moment, we temporarily disable rotating because we can't get it working otherwise. * @todo make rotating possible @@ -160,148 +224,58 @@ public class FilterSettingsActivity extends ActionBarActivity { } /** - * Custom Dialog to display & edit feeds + * Custom ArrayAdapter to display feeds */ - public static class FeedsDialogFragment extends DialogFragment { - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - final View view = getActivity().getLayoutInflater().inflate(R.layout.fragment_filter_settings_feeds, null); - - final FiltersList filtersList = FiltersList.getInstance(); - final Filter filter = filtersList.getFilterFromHashCode(getArguments().getInt("filter")); - - 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); - - /** - * @todo nicer selected feed layout - * @todo deselecting feeds doesn't work - */ - 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 { - filter.store(DefaultStorageProvider.getInstance()); - feedAdapter.notifyDataSetChanged(); - } catch (Exception e) { - Frontend.error(getActivity(), R.string.error_save_filters, e); - filter.getFeeds().add(feed); - } - } - }); + private static class FeedAdapter extends SortedArrayAdapter<Feed> { + + Context context; + int layoutResourceId; + Filter filter; + + public FeedAdapter(Context context, int resource, List<Feed> objects, Filter filter) { + super(context, resource, objects); + this.context = context; + layoutResourceId = resource; + items = objects; + this.filter = filter; + } - 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); - try { - feed.store(DefaultStorageProvider.getInstance()); - FeedsList.getInstance().getFeeds().add(feed); - filter.getFeedHashCodes().add(feed.hashCode()); - - try { - filter.store(DefaultStorageProvider.getInstance()); - feed.store(DefaultStorageProvider.getInstance()); - feedAdapter.notifyDataSetChanged(); - editText.setText(""); - } catch (Exception e) { - Frontend.error(getActivity(), R.string.error_save_filters, e); - filter.getFeeds().remove(feed); - } - } catch (Exception e) { - Frontend.error(getActivity(), R.string.error_save_feeds, e); - FeedsList.getInstance().getFeeds().remove(feed); - } - } catch (MalformedURLException e) { - Frontend.info(getActivity(), R.string.error_invalid_url, e); - } - } - }); + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View row = convertView; + FeedHolder holder; + + if (row == null) { + LayoutInflater inflater = ((Activity) context).getLayoutInflater(); + row = inflater.inflate(layoutResourceId, parent, false); + + holder = new FeedHolder(); + holder.layout = (RelativeLayout) 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); + holder.checkBox = (CheckBox) row.findViewById(R.id.filter_settings_feed_item_checkbox); + + row.setTag(holder); + } else { + holder = (FeedHolder) row.getTag(); + } - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setMessage(R.string.filter_settings_feeds).setPositiveButton(R.string.button_ok, null); - builder.setView(view); + Feed feed = items.get(position); + holder.title.setText(feed.getTitle()); + holder.url.setText(feed.getURL().toString()); + holder.checkBox.setChecked(filter.getFeedHashCodes().contains(feed.hashCode())); - return builder.create(); - } catch (IOException e) { - dismiss(); - Frontend.error(getActivity(), R.string.error_load_feeds, e); - return null; - } + return row; } /** - * Custom ArrayAdapter to display feeds + * TextViews holder */ - private static class FeedAdapter extends SortedArrayAdapter<Feed> { - - Context context; - int layoutResourceId; - Filter filter; - - public FeedAdapter(Context context, int resource, List<Feed> objects, Filter filter) { - super(context, resource, objects); - this.context = context; - layoutResourceId = resource; - items = objects; - this.filter = filter; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View row = convertView; - FeedHolder holder; - - if (row == null) { - LayoutInflater inflater = ((Activity) context).getLayoutInflater(); - 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); - - row.setTag(holder); - } else { - holder = (FeedHolder) row.getTag(); - } - - 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; - } - - /** - * TextViews holder - */ - private static class FeedHolder { - LinearLayout layout; - TextView title; - TextView url; - } + private static class FeedHolder { + RelativeLayout layout; + TextView title; + TextView url; + CheckBox checkBox; } } diff --git a/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java b/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java index 4cc9386..61f28cd 100644 --- a/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java +++ b/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java @@ -75,12 +75,6 @@ class SharedPreferencesStorageProvider implements StorageProvider, FilterStorage .edit() .putString(element.getClass().getName(), string) .apply(); - - if (element.getClass() == Filter.class) { - storeFilterKey(key); - } else if (element.getClass() == Feed.class) { - storeFeedKey(key); - } } @Override @@ -145,12 +139,7 @@ class SharedPreferencesStorageProvider implements StorageProvider, FilterStorage public void removeFilter(Object key) { SharedPreferences sharedPreferences = context.getSharedPreferences(ADMIN_PREF_KEY, Context.MODE_PRIVATE); Set<String> names = new HashSet<>(sharedPreferences.getStringSet("filters", new HashSet<String>())); - for (String name : names) - Log.d("SPSP", "Old name: " + name); - Log.d("SPSP", "Removing name " + key.toString()); names.remove(key.toString()); - for (String name : names) - Log.d("SPSP", "New name: " + name); sharedPreferences .edit() .putStringSet("filters", names) @@ -161,9 +150,8 @@ class SharedPreferencesStorageProvider implements StorageProvider, FilterStorage /** * Keep track of a new key for a filter in the administration SharedPreferences * @param key - * @throws Exception */ - protected void storeFilterKey(Object key) throws Exception { + protected void storeFilterKey(Object key) { SharedPreferences sharedPreferences = context.getSharedPreferences(ADMIN_PREF_KEY, Context.MODE_PRIVATE); Set<String> names = new HashSet<>(sharedPreferences.getStringSet("filters", new HashSet<String>())); names.add(key.toString()); @@ -187,6 +175,12 @@ class SharedPreferencesStorageProvider implements StorageProvider, FilterStorage } @Override + public void storeFeed(Object key, Feed feed) throws Exception { + store(key, feed); + storeFeedKey(key); + } + + @Override public Feed getFeed(Object key) { try { return (Feed) fetch(key.toString(), Feed.class); diff --git a/app/src/main/java/org/rssin/rssin/Feed.java b/app/src/main/java/org/rssin/rssin/Feed.java index 55d0e5d..ae8b5f2 100755 --- a/app/src/main/java/org/rssin/rssin/Feed.java +++ b/app/src/main/java/org/rssin/rssin/Feed.java @@ -5,6 +5,7 @@ import android.util.Log; import org.json.JSONException; import org.json.JSONObject; import org.rssin.serialization.Jsonable; +import org.rssin.storage.FeedStorageProvider; import org.rssin.storage.Storable; import org.rssin.storage.StorageProvider; @@ -110,12 +111,12 @@ public class Feed implements Storable, Comparable<Feed>, Jsonable { * @param storageProvider * @throws Exception */ - public synchronized void store(StorageProvider storageProvider) throws Exception { + public synchronized void store(FeedStorageProvider storageProvider) throws Exception { if (storageKey == null) { storageKey = storageProvider.uniqueKey(); } - storageProvider.store(storageKey, this); + storageProvider.storeFeed(storageKey, this); } @Override diff --git a/app/src/main/java/org/rssin/storage/FeedStorageProvider.java b/app/src/main/java/org/rssin/storage/FeedStorageProvider.java index eac78ce..13932a6 100644 --- a/app/src/main/java/org/rssin/storage/FeedStorageProvider.java +++ b/app/src/main/java/org/rssin/storage/FeedStorageProvider.java @@ -17,6 +17,13 @@ public interface FeedStorageProvider<K> { List<Feed> allFeeds(); /** + * Save a Filter + * @param key + * @param feed + */ + void storeFeed(K key, Feed feed) throws Exception; + + /** * Get the feed for a specific key * @param key * @return @@ -29,4 +36,10 @@ public interface FeedStorageProvider<K> { */ void removeFeed(K key); + /** + * Get a new, unique, usable key + * @return + */ + K uniqueKey(); + } |