aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/main/java/org/rssin/android/FilterSettingsActivity.java98
-rw-r--r--app/src/main/java/org/rssin/android/FiltersActivity.java11
-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
-rw-r--r--app/src/main/res/layout/activity_filter_settings.xml19
-rw-r--r--app/src/main/res/menu/menu_filter_settings.xml10
-rw-r--r--app/src/main/res/values/strings.xml11
8 files changed, 160 insertions, 27 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..3034ea3 100644
--- a/app/src/main/java/org/rssin/android/FilterSettingsActivity.java
+++ b/app/src/main/java/org/rssin/android/FilterSettingsActivity.java
@@ -9,38 +9,58 @@ 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.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, "Something went wrong...", 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) findViewById(R.id.filter_settings_feeds_list)).setAdapter(keywordAdapter);
}
@Override
@@ -53,15 +73,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 +105,58 @@ 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 {
+ filtersList.save();
+ filter.setTitle(value);
+ setTitle();
+ } catch (IOException e) {
+ Toast.makeText(getBaseContext(), getResources().getString(R.string.error_save_filter), 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();
+ Log.d("FSA", "New keyword saved");
+ } catch (IOException e) {
+ Log.e("FSA", "Couldn't save new keyword", e);
+ filter.getKeywords().remove(k);
+ keywordAdapter.notifyDataSetChanged();
+ }
+ }
+
+ /**
* Custom Dialog to display & edit feeds
*/
public static class FeedsDialogFragment extends DialogFragment {
@@ -87,12 +171,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!
}
})
- .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..74490c8 100644
--- a/app/src/main/java/org/rssin/android/FiltersActivity.java
+++ b/app/src/main/java/org/rssin/android/FiltersActivity.java
@@ -11,6 +11,7 @@ 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;
@@ -48,20 +49,20 @@ public class FiltersActivity extends ActionBarActivity {
filtersView = (ListView) findViewById(R.id.filters_list);
try {
- filters = new FiltersList(this);
+ filters = 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());
filtersView.setAdapter(adapter);
try {
- filters.save(this);
+ filters.save();
} catch (IOException ex) {
Toast.makeText(this, "Couldn't save filters.", Toast.LENGTH_SHORT).show();
Log.e("FILTER", "IOException", ex);
@@ -86,7 +87,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;
}
diff --git a/app/src/main/java/org/rssin/android/FiltersList.java b/app/src/main/java/org/rssin/android/FiltersList.java
index cf85b47..3a88f0c 100644
--- a/app/src/main/java/org/rssin/android/FiltersList.java
+++ b/app/src/main/java/org/rssin/android/FiltersList.java
@@ -3,6 +3,7 @@ package org.rssin.android;
import android.content.Context;
import android.preference.PreferenceManager;
import android.util.Base64;
+import android.widget.Toast;
import org.rssin.rssin.Filter;
@@ -21,14 +22,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 +47,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 +62,14 @@ 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();
}
}
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();
+ }
}
diff --git a/app/src/main/res/layout/activity_filter_settings.xml b/app/src/main/res/layout/activity_filter_settings.xml
index 7c8e265..897b02a 100644
--- a/app/src/main/res/layout/activity_filter_settings.xml
+++ b/app/src/main/res/layout/activity_filter_settings.xml
@@ -10,6 +10,25 @@
android:paddingBottom="0dp"
android:orientation="vertical">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <EditText
+ android:id="@+id/filter_settings_add_keyword"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="wrap_content"/>
+
+ <Button
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/filter_settings_add_keyword"
+ android:onClick="addKeyword"/>
+
+ </LinearLayout>
+
<ListView
android:id="@+id/filter_settings_feeds_list"
android:layout_width="match_parent"
diff --git a/app/src/main/res/menu/menu_filter_settings.xml b/app/src/main/res/menu/menu_filter_settings.xml
index 9384597..a6a518b 100644
--- a/app/src/main/res/menu/menu_filter_settings.xml
+++ b/app/src/main/res/menu/menu_filter_settings.xml
@@ -6,8 +6,14 @@
tools:context=".FilterSettingsActivity">
<item
- android:id="@+id/action_feeds"
- android:title="@string/action_feeds"
+ android:id="@+id/filter_settings_action_feeds"
+ android:title="@string/filter_settings_action_feeds"
+ android:orderInCategory="100"
+ app:showAsAction="ifRoom" />
+
+ <item
+ android:id="@+id/filter_settings_action_title"
+ android:title="@string/filter_settinsg_action_title"
android:orderInCategory="100"
app:showAsAction="ifRoom" />
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e5af898..4e9be11 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -4,12 +4,17 @@
<string name="action_settings">Settings</string>
<string name="action_filters">Filters</string>
+ <string name="button_apply">Apply</string>
+ <string name="button_cancel">Cancel</string>
+
<string name="title_activity_filters">Filters</string>
<string name="title_activity_filter_settings">Filter</string>
<string name="filter_settings_edit_keywords">Edit</string>
<string name="filter_settings_feeds">Feeds</string>
- <string name="filter_settings_edit_feeds_positive">Apply</string>
- <string name="filter_settings_edit_feeds_negative">Cancel</string>
- <string name="action_feeds">Feeds</string>
+ <string name="filter_settings_add_keyword">Add</string>
+ <string name="filter_settings_action_feeds">Feeds</string>
+ <string name="filter_settinsg_action_title">Title</string>
+
+ <string name="error_save_filter">Couldn\'t save filter</string>
</resources>