diff options
author | Camil Staps | 2015-05-21 15:04:06 +0200 |
---|---|---|
committer | Camil Staps | 2015-05-21 15:04:06 +0200 |
commit | 80b9f701b3540e1069ce1c55ef3b056f95844292 (patch) | |
tree | 2d5d7bd7194d7805d4e5f8ca3ef8cde4b5890132 | |
parent | Nicer text sizes; dimensions in dimens.xml (diff) |
Edit filter title; add keywords
-rw-r--r-- | app/src/main/java/org/rssin/android/FilterSettingsActivity.java | 98 | ||||
-rw-r--r-- | app/src/main/java/org/rssin/android/FiltersActivity.java | 11 | ||||
-rw-r--r-- | app/src/main/java/org/rssin/android/FiltersList.java | 22 | ||||
-rw-r--r-- | app/src/main/java/org/rssin/rssin/Feed.java | 5 | ||||
-rwxr-xr-x | app/src/main/java/org/rssin/rssin/Filter.java | 11 | ||||
-rw-r--r-- | app/src/main/res/layout/activity_filter_settings.xml | 19 | ||||
-rw-r--r-- | app/src/main/res/menu/menu_filter_settings.xml | 10 | ||||
-rw-r--r-- | app/src/main/res/values/strings.xml | 11 |
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> |