aboutsummaryrefslogtreecommitdiff
path: root/app/src
diff options
context:
space:
mode:
Diffstat (limited to 'app/src')
-rwxr-xr-xapp/src/main/java/org/rssin/android/FilterSettingsActivity.java270
-rw-r--r--app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java20
-rwxr-xr-xapp/src/main/java/org/rssin/rssin/Feed.java5
-rw-r--r--app/src/main/java/org/rssin/storage/FeedStorageProvider.java13
-rw-r--r--app/src/main/res/layout/activity_filter_settings.xml16
-rw-r--r--app/src/main/res/layout/fragment_filter_settings_feeds.xml34
-rw-r--r--app/src/main/res/layout/item_filter_settings_feed.xml40
-rw-r--r--app/src/main/res/menu/menu_filter_settings.xml5
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" />