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 | |
parent | Remove Keywords (diff) |
Nicer filter settings
Diffstat (limited to 'app/src/main')
8 files changed, 180 insertions, 223 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(); + } diff --git a/app/src/main/res/layout/activity_filter_settings.xml b/app/src/main/res/layout/activity_filter_settings.xml index 6ee5331..f0a773c 100644 --- a/app/src/main/res/layout/activity_filter_settings.xml +++ b/app/src/main/res/layout/activity_filter_settings.xml @@ -4,10 +4,7 @@ tools:context="org.rssin.android.FilterSettingsActivity" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingLeft="0dp" - android:paddingRight="0dp" - android:paddingTop="0dp" - android:paddingBottom="0dp" + android:padding="0dp" android:orientation="vertical"> <LinearLayout @@ -16,23 +13,24 @@ android:orientation="horizontal"> <EditText - android:id="@+id/filter_settings_add_keyword" + android:id="@+id/filter_settings_add_feed" android:layout_width="0dip" android:layout_weight="1" android:layout_height="wrap_content" - android:maxLines="1"/> + android:maxLines="1" + android:inputType="textUri"/> <Button + android:id="@+id/filter_settings_add_feed_button" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@string/filter_settings_add_keyword" - android:onClick="addKeyword"/> + android:text="@string/filter_settings_add_feed"/> </LinearLayout> <ListView android:id="@+id/filter_settings_feeds_list" android:layout_width="match_parent" - android:layout_height="match_parent"></ListView> + android:layout_height="match_parent"/> </LinearLayout> diff --git a/app/src/main/res/layout/fragment_filter_settings_feeds.xml b/app/src/main/res/layout/fragment_filter_settings_feeds.xml deleted file mode 100644 index 9c1e1f4..0000000 --- a/app/src/main/res/layout/fragment_filter_settings_feeds.xml +++ /dev/null @@ -1,34 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal"> - - <EditText - android:id="@+id/filter_settings_add_feed" - android:layout_width="0dip" - android:layout_weight="1" - android:layout_height="wrap_content" - android:maxLines="1" - android:inputType="textUri"/> - - <Button - android:id="@+id/filter_settings_add_feed_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/filter_settings_add_feed"/> - - </LinearLayout> - - <ListView - android:id="@+id/filter_settings_feeds_list" - android:layout_width="match_parent" - android:layout_height="match_parent"/> - -</LinearLayout>
\ No newline at end of file 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 4f027eb..e7e5196 100644 --- a/app/src/main/res/layout/item_filter_settings_feed.xml +++ b/app/src/main/res/layout/item_filter_settings_feed.xml @@ -1,20 +1,36 @@ <?xml version="1.0" encoding="utf-8"?> -<LinearLayout +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/filter_settings_feed_item" - android:orientation="vertical" + android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" - android:padding="10dp"> + android:padding="@dimen/listview_item_padding"> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="vertical"> - <TextView android:id="@+id/filter_settings_feed_item_title" - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:textSize="@dimen/font_size_large"/> + <TextView android:id="@+id/filter_settings_feed_item_title" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:textSize="@dimen/font_size_large"/> - <TextView android:id="@+id/filter_settings_feed_item_url" - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:textSize="@dimen/font_size_normal"/> + <TextView android:id="@+id/filter_settings_feed_item_url" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:textSize="@dimen/font_size_normal"/> -</LinearLayout>
\ No newline at end of file + </LinearLayout> + + <CheckBox + android:id="@+id/filter_settings_feed_item_checkbox" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:focusable="false" + android:clickable="false" + android:layout_alignParentRight="true" + android:layout_alignParentEnd="true"/> + +</RelativeLayout>
\ No newline at end of file diff --git a/app/src/main/res/menu/menu_filter_settings.xml b/app/src/main/res/menu/menu_filter_settings.xml index 848c9df..655ee84 100644 --- a/app/src/main/res/menu/menu_filter_settings.xml +++ b/app/src/main/res/menu/menu_filter_settings.xml @@ -6,11 +6,6 @@ tools:context=".FilterSettingsActivity"> <item - android:id="@+id/filter_settings_action_feeds" - android:title="@string/filter_settings_action_feeds" - app:showAsAction="ifRoom" /> - - <item android:id="@+id/filter_settings_action_title" android:title="@string/filter_settings_action_title" app:showAsAction="ifRoom" /> |