aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/org
diff options
context:
space:
mode:
authorSize432015-05-21 15:32:44 +0200
committerSize432015-05-21 15:32:44 +0200
commit34ebdfdc2fd7374b947b7fb6d185f60bd0723b03 (patch)
tree11c4241f6534362ac9ca940f6f939ccb7a9aeb68 /app/src/main/java/org
parentReduced LOC + FeedSorter sorts by category, author, title and date/time + red... (diff)
parentFix saving filters; remove keywords (diff)
Merge branch 'master' of https://github.com/camilstaps/RSSin
Diffstat (limited to 'app/src/main/java/org')
-rw-r--r--app/src/main/java/org/rssin/android/FilterSettingsActivity.java117
-rw-r--r--app/src/main/java/org/rssin/android/FiltersActivity.java21
-rw-r--r--app/src/main/java/org/rssin/android/FiltersList.java22
-rw-r--r--app/src/main/java/org/rssin/rssin/Feed.java5
-rwxr-xr-xapp/src/main/java/org/rssin/rssin/Filter.java11
5 files changed, 147 insertions, 29 deletions
diff --git a/app/src/main/java/org/rssin/android/FilterSettingsActivity.java b/app/src/main/java/org/rssin/android/FilterSettingsActivity.java
index ae31943..f498e8e 100644
--- a/app/src/main/java/org/rssin/android/FilterSettingsActivity.java
+++ b/app/src/main/java/org/rssin/android/FilterSettingsActivity.java
@@ -9,38 +9,77 @@ import android.content.DialogInterface;
import android.content.Intent;
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;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.AdapterView;
import android.widget.ArrayAdapter;
+import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
+import android.widget.Toast;
import org.rssin.rssin.Feed;
import org.rssin.rssin.Filter;
import org.rssin.rssin.Keyword;
import org.rssin.rssin.R;
+import java.io.IOException;
import java.util.List;
public class FilterSettingsActivity extends ActionBarActivity {
+ private FiltersList filtersList;
private Filter filter;
+ private KeywordAdapter keywordAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_filter_settings);
+ try {
+ filtersList = FiltersList.getInstance(this);
+ } catch (IOException e) {
+ Toast.makeText(this, getResources().getString(R.string.error_load_filters), Toast.LENGTH_SHORT).show();
+ }
+
Intent intent = getIntent();
- filter = (Filter) intent.getSerializableExtra("filter");
+ int filterHashCode = intent.getIntExtra("filter", -1);
+
+ // @todo Check on -1? Shouldn't happen anyway.
+ for (Filter f : filtersList.getFilters()) {
+ if (f.hashCode() == filterHashCode) {
+ filter = f;
+ break;
+ }
+ }
- setTitle(getTitle() + ": " + filter.getTitle());
+ setTitle();
- final KeywordAdapter fAdapter = new KeywordAdapter(this, R.layout.item_filter_settings_keyword, filter.getKeywords());
- ((ListView) findViewById(R.id.filter_settings_feeds_list)).setAdapter(fAdapter);
+ keywordAdapter = new KeywordAdapter(this, R.layout.item_filter_settings_keyword, filter.getKeywords());
+ ListView keywordsListView = (ListView) findViewById(R.id.filter_settings_feeds_list);
+ keywordsListView.setAdapter(keywordAdapter);
+ keywordsListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
+ @Override
+ public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
+ Keyword keyword = keywordAdapter.getItem(position);
+ try {
+ filter.getKeywords().remove(keyword);
+ filtersList.save();
+ keywordAdapter.notifyDataSetChanged();
+ return true;
+ } catch (IOException e) {
+ filter.getKeywords().add(keyword);
+ keywordAdapter.notifyDataSetChanged();
+ Toast.makeText(getBaseContext(), getResources().getString(R.string.error_save_filters), Toast.LENGTH_SHORT).show();
+ return false;
+ }
+ }
+ });
}
@Override
@@ -53,15 +92,27 @@ public class FilterSettingsActivity extends ActionBarActivity {
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
- if (id == R.id.action_feeds) {
+ if (id == R.id.filter_settings_action_feeds) {
openFeedsDialog();
return true;
+ } else if (id == R.id.filter_settings_action_title) {
+ openTitleDialog();
+ return true;
}
return super.onOptionsItemSelected(item);
}
/**
+ * Set the title according to the filter
+ */
+ public void setTitle() {
+ if (filter != null) {
+ setTitle(getResources().getString(R.string.title_activity_filter_settings) + ": " + filter.getTitle());
+ }
+ }
+
+ /**
* Open dialog to edit feeds
*/
public void openFeedsDialog() {
@@ -73,6 +124,56 @@ public class FilterSettingsActivity extends ActionBarActivity {
}
/**
+ * Open dialog to edit title
+ */
+ public void openTitleDialog() {
+ AlertDialog.Builder alert = new AlertDialog.Builder(this);
+
+ alert.setTitle("Title");
+ alert.setMessage("New title:");
+
+ final EditText input = new EditText(this);
+ input.setText(filter.getTitle());
+
+ alert
+ .setView(input)
+ .setPositiveButton(getResources().getString(R.string.button_apply), new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ String value = input.getText().toString();
+ try {
+ filter.setTitle(value);
+ filtersList.save();
+ setTitle();
+ } catch (IOException e) {
+ Toast.makeText(getBaseContext(), getResources().getString(R.string.error_save_filters), Toast.LENGTH_SHORT).show();
+ }
+ }
+ })
+ .setNegativeButton(getResources().getString(R.string.button_cancel), null)
+ .show();
+ }
+
+ /**
+ * Add keyword
+ * @param v ignored, used because this is an onClick method
+ */
+ public void addKeyword(View v) {
+ EditText editText = (EditText) findViewById(R.id.filter_settings_add_keyword);
+ String keyword = editText.getText().toString();
+ editText.setText("");
+
+ Keyword k = new Keyword(keyword);
+ filter.getKeywords().add(k);
+ try {
+ filtersList.save();
+ keywordAdapter.notifyDataSetChanged();
+ } catch (IOException e) {
+ filter.getKeywords().remove(k);
+ keywordAdapter.notifyDataSetChanged();
+ }
+ }
+
+ /**
* Custom Dialog to display & edit feeds
*/
public static class FeedsDialogFragment extends DialogFragment {
@@ -87,12 +188,12 @@ public class FilterSettingsActivity extends ActionBarActivity {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.filter_settings_feeds)
- .setPositiveButton(R.string.filter_settings_edit_feeds_positive, new DialogInterface.OnClickListener() {
+ .setPositiveButton(R.string.button_apply, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
- // FIRE ZE MISSILES!
+ // @todo FIRE ZE MISSILES!
}
})
- .setNegativeButton(R.string.filter_settings_edit_feeds_negative, null);
+ .setNegativeButton(R.string.button_cancel, null);
builder.setView(view);
return builder.create();
diff --git a/app/src/main/java/org/rssin/android/FiltersActivity.java b/app/src/main/java/org/rssin/android/FiltersActivity.java
index 07f20c2..fd569be 100644
--- a/app/src/main/java/org/rssin/android/FiltersActivity.java
+++ b/app/src/main/java/org/rssin/android/FiltersActivity.java
@@ -34,7 +34,7 @@ import java.util.List;
*/
public class FiltersActivity extends ActionBarActivity {
- private FiltersList filters;
+ private FiltersList filtersList;
private ListView filtersView;
private AdapterView.OnItemClickListener onFilterClickListener;
@@ -48,23 +48,22 @@ public class FiltersActivity extends ActionBarActivity {
filtersView = (ListView) findViewById(R.id.filters_list);
try {
- filters = new FiltersList(this);
+ filtersList = FiltersList.getInstance(this);
} catch (IOException ex) {
Toast.makeText(this, "Couldn't load filters.", Toast.LENGTH_SHORT).show();
Log.e("FILTER", "IOException", ex);
- filters = new FiltersList();
+ finish();
}
- putDummyFilter();
+ //putDummyFilter();
- final FilterAdapter adapter = new FilterAdapter(this, R.layout.item_filter, filters.getFilters());
+ final FilterAdapter adapter = new FilterAdapter(this, R.layout.item_filter, filtersList.getFilters());
filtersView.setAdapter(adapter);
try {
- filters.save(this);
+ filtersList.save();
} catch (IOException ex) {
- Toast.makeText(this, "Couldn't save filters.", Toast.LENGTH_SHORT).show();
- Log.e("FILTER", "IOException", ex);
+ Toast.makeText(this, getResources().getString(R.string.error_save_filters), Toast.LENGTH_SHORT).show();
}
setupListeners();
@@ -86,7 +85,7 @@ public class FiltersActivity extends ActionBarActivity {
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Filter item = (Filter) parent.getItemAtPosition(position);
Intent intent = new Intent(getApplicationContext(), FilterSettingsActivity.class);
- intent.putExtra("filter", item);
+ intent.putExtra("filter", item.hashCode());
startActivity(intent);
return true;
}
@@ -150,7 +149,7 @@ public class FiltersActivity extends ActionBarActivity {
* Dummy filter for testing
*/
private void putDummyFilter() {
- filters.getFilters().clear();
+ filtersList.getFilters().clear();
Filter filter = new Filter("Filter test");
filter.getKeywords().add(new Keyword("Test"));
@@ -160,7 +159,7 @@ public class FiltersActivity extends ActionBarActivity {
try {
filter.getFeeds().add(new Feed("http://nu.nl/sport.rss", "Feed test 2"));
} catch (MalformedURLException e) {}
- filters.getFilters().add(filter);
+ filtersList.getFilters().add(filter);
}
}
diff --git a/app/src/main/java/org/rssin/android/FiltersList.java b/app/src/main/java/org/rssin/android/FiltersList.java
index cf85b47..bae8dc6 100644
--- a/app/src/main/java/org/rssin/android/FiltersList.java
+++ b/app/src/main/java/org/rssin/android/FiltersList.java
@@ -21,14 +21,18 @@ import java.util.List;
public class FiltersList {
private static final String PREF_KEY = "filters_list";
+
+ private static FiltersList instance;
+
private final List<Filter> filters;
+ private final Context context;
/**
* Fetch from sharedPreferences
* @param context
* @throws IOException if data is corrupted, and deserializing fails
*/
- public FiltersList(Context context) throws IOException {
+ protected FiltersList(Context context) throws IOException {
String filters = PreferenceManager.getDefaultSharedPreferences(context).getString(PREF_KEY, null);
if (filters == null) {
this.filters = new ArrayList<>();
@@ -42,14 +46,13 @@ public class FiltersList {
}
this.filters = filters_list;
}
+ this.context = context;
}
- public FiltersList(List<Filter> filters) {
- this.filters = filters;
- }
-
- public FiltersList() {
- this.filters = new ArrayList<>();
+ public static FiltersList getInstance(Context context) throws IOException {
+ if (instance == null)
+ instance = new FiltersList(context);
+ return instance;
}
public List<Filter> getFilters() {
@@ -58,16 +61,15 @@ public class FiltersList {
/**
* Save in sharedPreferences
- * @param context
* @throws IOException if serializing failed
*/
- public void save(Context context) throws IOException {
+ public synchronized void save() throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(filters);
oos.close();
String string = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);
- PreferenceManager.getDefaultSharedPreferences(context).edit().putString(PREF_KEY, string).apply();
+ PreferenceManager.getDefaultSharedPreferences(context).edit().putString(PREF_KEY, string).commit();
}
}
diff --git a/app/src/main/java/org/rssin/rssin/Feed.java b/app/src/main/java/org/rssin/rssin/Feed.java
index 0abbd67..a2009ca 100644
--- a/app/src/main/java/org/rssin/rssin/Feed.java
+++ b/app/src/main/java/org/rssin/rssin/Feed.java
@@ -58,4 +58,9 @@ public class Feed implements Serializable {
this.url = new URL(url);
}
+ @Override
+ public String toString() {
+ return title + ": " + url.toString();
+ }
+
}
diff --git a/app/src/main/java/org/rssin/rssin/Filter.java b/app/src/main/java/org/rssin/rssin/Filter.java
index f411ca3..c7915aa 100755
--- a/app/src/main/java/org/rssin/rssin/Filter.java
+++ b/app/src/main/java/org/rssin/rssin/Filter.java
@@ -79,4 +79,15 @@ public class Filter implements Serializable {
public FeedSorter getSorter() {
return sorter;
}
+
+ @Override
+ public int hashCode() {
+ StringBuilder sb = new StringBuilder(title);
+ for (Feed f : feeds)
+ sb.append(f.toString());
+ for (Keyword k : keywords)
+ sb.append(k.toString());
+
+ return sb.toString().hashCode();
+ }
}