From 0cf0c338f4205e2a4a3cb522362b20025848868e Mon Sep 17 00:00:00 2001 From: Size43 Date: Tue, 9 Jun 2015 15:22:22 +0200 Subject: Single feedsorter for all filters --- .../java/org/rssin/android/ArticleActivity.java | 6 +- .../java/org/rssin/android/FeedItemAdapter.java | 5 +- .../java/org/rssin/android/FeedSorterProvider.java | 81 ++++++++ .../java/org/rssin/android/FeedSorterTrainer.java | 14 +- .../java/org/rssin/android/FilterActivity.java | 98 --------- .../java/org/rssin/android/FiltersActivity.java | 228 --------------------- .../java/org/rssin/android/HomeScreenActivity.java | 26 +-- .../android/NavigationDrawerAllFeedsFragment.java | 53 ++--- .../android/NavigationDrawerFeedFragment.java | 56 +++-- .../android/NavigationDrawerFilterFragment.java | 6 +- .../NavigationDrawerManageFiltersFragment.java | 5 - .../android/SharedPreferencesStorageProvider.java | 14 +- .../java/org/rssin/rssin/FeedLoaderAndSorter.java | 19 +- app/src/main/java/org/rssin/rssin/Filter.java | 76 ------- .../org/rssin/rssin/SortedFeedItemContainer.java | 20 +- .../java/org/rssin/rssin/UnifiedFilterLoader.java | 77 ------- .../java/org/rssin/rssin/dummy/DummyContent.java | 55 ----- 17 files changed, 167 insertions(+), 672 deletions(-) create mode 100755 app/src/main/java/org/rssin/android/FeedSorterProvider.java delete mode 100755 app/src/main/java/org/rssin/android/FilterActivity.java delete mode 100755 app/src/main/java/org/rssin/android/FiltersActivity.java delete mode 100755 app/src/main/java/org/rssin/rssin/UnifiedFilterLoader.java delete mode 100755 app/src/main/java/org/rssin/rssin/dummy/DummyContent.java (limited to 'app/src/main/java') diff --git a/app/src/main/java/org/rssin/android/ArticleActivity.java b/app/src/main/java/org/rssin/android/ArticleActivity.java index a6bf4d8..165ac54 100755 --- a/app/src/main/java/org/rssin/android/ArticleActivity.java +++ b/app/src/main/java/org/rssin/android/ArticleActivity.java @@ -49,7 +49,7 @@ public class ArticleActivity extends ActionBarActivity { date.setText(R.string.article_published_on_unknown); } - new Thread(new FeedSorterTrainer(container.getSorter())).start(); + new Thread(new FeedSorterTrainer(FeedSorterProvider.getInstance(this))).start(); } catch (NullPointerException e) { Frontend.error(this, R.string.error_load_article, e); finish(); @@ -73,12 +73,12 @@ public class ArticleActivity extends ActionBarActivity { //noinspection SimplifiableIfStatement if (id == R.id.article_action_dislike) { Toast.makeText(this, "Feedback saved.", Toast.LENGTH_SHORT).show(); - container.feedback(Dislike); + container.feedback(this, Dislike); return true; } else if(id == R.id.article_action_like) { Toast.makeText(this, "Feedback saved.", Toast.LENGTH_SHORT).show(); - container.feedback(Like); + container.feedback(this, Like); return true; } diff --git a/app/src/main/java/org/rssin/android/FeedItemAdapter.java b/app/src/main/java/org/rssin/android/FeedItemAdapter.java index 7a606ef..6b092c4 100755 --- a/app/src/main/java/org/rssin/android/FeedItemAdapter.java +++ b/app/src/main/java/org/rssin/android/FeedItemAdapter.java @@ -48,10 +48,9 @@ class FeedItemAdapter extends RecyclerView.Adapter, VolleyError>() { - @Override - public void onReceive(List data) { - - FeedItemAdapter feedItemAdapter = new FeedItemAdapter(data); - mRecyclerView.setAdapter(feedItemAdapter); - mRecyclerView.setHasFixedSize(true); - } - - @Override - public void onError(VolleyError error) { - Frontend.error(getBaseContext(), R.string.error_net_load); - } - }); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.menu_filter, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - int id = item.getItemId(); - - if (id == R.id.action_settings) { - Intent intent = new Intent(getApplicationContext(), FilterSettingsActivity.class); - intent.putExtra("filter", filter.hashCode()); - startActivity(intent); - return true; - } - - return super.onOptionsItemSelected(item); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - try { - filter.storeFeedSorter(InternalStorageProvider.getInstance(this)); - } catch (Exception e) { - Frontend.warning(this, R.string.error_save_feedsorter, e); - } - } -} diff --git a/app/src/main/java/org/rssin/android/FiltersActivity.java b/app/src/main/java/org/rssin/android/FiltersActivity.java deleted file mode 100755 index a8e295c..0000000 --- a/app/src/main/java/org/rssin/android/FiltersActivity.java +++ /dev/null @@ -1,228 +0,0 @@ -package org.rssin.android; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.pm.ActivityInfo; -import android.support.v7.app.ActionBarActivity; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.view.WindowManager; -import android.widget.AdapterView; -import android.widget.EditText; -import android.widget.ListView; -import android.widget.TextView; - -import org.rssin.rssin.Filter; -import org.rssin.rssin.R; - -import java.io.IOException; -import java.util.List; - -/** - * List of filters - * - * Short tap opens the list with current articles that the filter returns - * Long tap opens filter settings - * - * @author Camil Staps - */ -public class FiltersActivity extends ActionBarActivity { - - private FiltersList filtersList; - private ListView filtersView; - private FilterAdapter filterAdapter; - - private AdapterView.OnItemClickListener onFilterClickListener; - private AdapterView.OnItemLongClickListener onFilterLongClickListener; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.fragment_filters); - - filtersView = (ListView) findViewById(R.id.filters_list); - - try { - filtersList = FiltersList.getInstance(this); - } catch (IOException ex) { - Frontend.error(this, R.string.error_load_filters, ex); - finish(); - } - - filterAdapter = new FilterAdapter(this, R.layout.item_filter, filtersList.getFilters()); - filtersView.setAdapter(filterAdapter); - - setupListeners(); - } - - @Override - protected void onResume() { - super.onResume(); - - filterAdapter.notifyDataSetChanged(); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.menu_filters, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - int id = item.getItemId(); - - if (id == R.id.filters_action_add) { - openAddDialog(); - return true; - } - - return super.onOptionsItemSelected(item); - } - - /** - * Setup listeners for the list items - */ - private void setupListeners() { - onFilterClickListener = new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - Filter item = (Filter) parent.getItemAtPosition(position); - openFilter(item); - } - }; - onFilterLongClickListener = new AdapterView.OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { - Filter item = (Filter) parent.getItemAtPosition(position); - openFilterSettings(item); - return true; - } - }; - - filtersView.setOnItemClickListener(onFilterClickListener); - filtersView.setOnItemLongClickListener(onFilterLongClickListener); - } - - /** - * Open dialog to create new filter - * For the moment, we temporarily disable rotating because we can't get it working otherwise. - * @todo make rotating possible - */ - public void openAddDialog() { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); - - AlertDialog.Builder alert = new AlertDialog.Builder(this); - - alert.setTitle("Add filter"); - alert.setMessage("Title:"); - - final EditText input = new EditText(this); - input.setFocusable(true); - input.requestFocus(); - - AlertDialog dialog = 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 f = new Filter(value); - filtersList.getFilters().add(f); - filtersList.save(); - openFilterSettings(f); - } catch (Exception e) { - Frontend.error(getBaseContext(), R.string.error_save_filters, e); - } - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); - } - }) - .setNegativeButton(getResources().getString(R.string.button_cancel), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); - } - }) - .setOnCancelListener(new DialogInterface.OnCancelListener() { - @Override - public void onCancel(DialogInterface dialog) { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); - } - }) - .create(); - - dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); - dialog.show(); - } - - public void openFilterSettings(Filter f) { - f.ensureFeeds(DefaultStorageProvider.getInstance(this)); - Intent intent = new Intent(getApplicationContext(), FilterSettingsActivity.class); - intent.putExtra("filter", f.hashCode()); - startActivity(intent); - } - - public void openFilter(Filter f) { - f.ensureFeeds(DefaultStorageProvider.getInstance(this)); - Intent intent = new Intent(getApplicationContext(), FilterActivity.class); - intent.putExtra("filter", f.hashCode()); - startActivity(intent); - } - - /** - * Custom ArrayAdapter to display filters with our own menu item - */ - private static class FilterAdapter extends SortedArrayAdapter { - - Context context; - int layoutResourceId; - - public FilterAdapter(Context context, int resource, List objects) { - super(context, resource, objects); - this.context = context; - layoutResourceId = resource; - items = objects; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View row = convertView; - FilterHolder holder = null; - - if (row == null) { - LayoutInflater inflater = ((Activity) context).getLayoutInflater(); - row = inflater.inflate(layoutResourceId, parent, false); - - holder = new FilterHolder(); - holder.title = (TextView) row.findViewById(R.id.filter_item_title); - holder.feeds = (TextView) row.findViewById(R.id.filter_item_feeds); - - row.setTag(holder); - } else { - holder = (FilterHolder) row.getTag(); - } - - Filter filter = items.get(position); - holder.title.setText(filter.getTitle()); - holder.feeds.setText(filter.getFeeds().size() + " " + context.getString(R.string.feeds)); - - return row; - } - - /** - * TextViews holder - */ - private static class FilterHolder { - TextView title; - TextView feeds; - } - } - -} diff --git a/app/src/main/java/org/rssin/android/HomeScreenActivity.java b/app/src/main/java/org/rssin/android/HomeScreenActivity.java index bbae149..797476a 100755 --- a/app/src/main/java/org/rssin/android/HomeScreenActivity.java +++ b/app/src/main/java/org/rssin/android/HomeScreenActivity.java @@ -1,33 +1,15 @@ package org.rssin.android; -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.support.v7.app.ActionBarActivity; -import android.support.v7.app.ActionBar; +import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; -import android.os.Bundle; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBar; +import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.support.v4.widget.DrawerLayout; -import com.android.volley.VolleyError; - -import org.rssin.listener.FallibleListener; -import org.rssin.rssin.Feed; -import org.rssin.rssin.Filter; import org.rssin.rssin.R; -import org.rssin.rssin.SortedFeedItemContainer; -import org.rssin.rssin.UnifiedFilterLoader; - -import java.io.IOException; -import java.util.List; public class HomeScreenActivity extends ActionBarActivity diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerAllFeedsFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerAllFeedsFragment.java index 15edbed..b7a0d73 100755 --- a/app/src/main/java/org/rssin/android/NavigationDrawerAllFeedsFragment.java +++ b/app/src/main/java/org/rssin/android/NavigationDrawerAllFeedsFragment.java @@ -13,12 +13,10 @@ import android.view.ViewGroup; import com.android.volley.VolleyError; import org.rssin.listener.FallibleListener; -import org.rssin.rssin.Filter; +import org.rssin.rssin.FeedLoaderAndSorter; import org.rssin.rssin.R; import org.rssin.rssin.SortedFeedItemContainer; -import org.rssin.rssin.UnifiedFilterLoader; -import java.io.IOException; import java.util.List; /** @@ -44,38 +42,27 @@ public class NavigationDrawerAllFeedsFragment extends Fragment { RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(context); mRecyclerView.setLayoutManager(mLayoutManager); - try { - FiltersList filtersList = FiltersList.getInstance(context); - - for(Filter filter : filtersList.getFilters()) { - filter.ensureFeedSorter(DefaultStorageProvider.getInstance(context)); - filter.ensureFeeds(DefaultStorageProvider.getInstance(context)); + /** + * @todo Load feeds in separate thread so that the UI is immediately available + * + * @todo Now, feed items are only returned after *all* feeds have been loaded. With many + * filters that may take a while, so it would be preferable to return intermediate + * results. We could do this for example with {@link org.rssin.listener.RealtimeListener} + */ + FeedLoaderAndSorter loaderAndSorter = new FeedLoaderAndSorter(FeedsList.getInstance().getFeeds()); + loaderAndSorter.getFilteredFeedItems(context, new VolleyFetcher(context), new FallibleListener, VolleyError>() { + @Override + public void onReceive(List data) { + FeedItemAdapter feedItemAdapter = new FeedItemAdapter(data); + mRecyclerView.setAdapter(feedItemAdapter); + mRecyclerView.setHasFixedSize(true); } - /** - * @todo Load feeds in separate thread so that the UI is immediately available - * - * @todo Now, feed items are only returned after *all* feeds have been loaded. With many - * filters that may take a while, so it would be preferable to return intermediate - * results. We could do this for example with {@link org.rssin.listener.RealtimeListener} - */ - UnifiedFilterLoader loaderAndSorter = new UnifiedFilterLoader(filtersList.getFilters()); - loaderAndSorter.getFilteredFeedItems(new VolleyFetcher(context), new FallibleListener, VolleyError>() { - @Override - public void onReceive(List data) { - FeedItemAdapter feedItemAdapter = new FeedItemAdapter(data); - mRecyclerView.setAdapter(feedItemAdapter); - mRecyclerView.setHasFixedSize(true); - } - - @Override - public void onError(VolleyError error) { - Frontend.error(context, R.string.error_net_load); - } - }); - } catch (IOException e) { - Frontend.error(context, R.string.error_load_filters, e); - } + @Override + public void onError(VolleyError error) { + Frontend.error(context, R.string.error_net_load); + } + }); return rootView; } diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerFeedFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerFeedFragment.java index 901d854..0f33aca 100755 --- a/app/src/main/java/org/rssin/android/NavigationDrawerFeedFragment.java +++ b/app/src/main/java/org/rssin/android/NavigationDrawerFeedFragment.java @@ -14,13 +14,13 @@ import com.android.volley.VolleyError; import org.rssin.listener.FallibleListener; import org.rssin.rssin.Feed; -import org.rssin.rssin.Filter; +import org.rssin.rssin.FeedLoaderAndSorter; import org.rssin.rssin.R; import org.rssin.rssin.SortedFeedItemContainer; -import org.rssin.rssin.UnifiedFilterLoader; import java.io.IOException; import java.util.List; +import java.util.ArrayList; /** * @author Jos. @@ -64,38 +64,30 @@ public class NavigationDrawerFeedFragment extends Fragment { feed = (Feed) args.get(ARG_FEED_NAME); - try { - FiltersList filtersList = FiltersList.getInstance(context); - - for(Filter filter : filtersList.getFilters()) { - filter.ensureFeedSorter(DefaultStorageProvider.getInstance(context)); - filter.ensureFeeds(DefaultStorageProvider.getInstance(context)); + List singleFeedList = new ArrayList(); + singleFeedList.add(feed); + + /** + * @todo Load feeds in separate thread so that the UI is immediately available + * + * @todo Now, feed items are only returned after *all* feeds have been loaded. With many + * filters that may take a while, so it would be preferable to return intermediate + * results. We could do this for example with {@link org.rssin.listener.RealtimeListener} + */ + FeedLoaderAndSorter loaderAndSorter = new FeedLoaderAndSorter(singleFeedList); + loaderAndSorter.getFilteredFeedItems(context, new VolleyFetcher(context), new FallibleListener, VolleyError>() { + @Override + public void onReceive(List data) { + FeedItemAdapter feedItemAdapter = new FeedItemAdapter(data); + mRecyclerView.setAdapter(feedItemAdapter); + mRecyclerView.setHasFixedSize(true); } - /** - * @todo Load feeds in separate thread so that the UI is immediately available - * - * @todo Now, feed items are only returned after *all* feeds have been loaded. With many - * filters that may take a while, so it would be preferable to return intermediate - * results. We could do this for example with {@link org.rssin.listener.RealtimeListener} - */ - UnifiedFilterLoader loaderAndSorter = new UnifiedFilterLoader(filtersList.getFilters()); - loaderAndSorter.getFilteredFeedItems(new VolleyFetcher(context), new FallibleListener, VolleyError>() { - @Override - public void onReceive(List data) { - FeedItemAdapter feedItemAdapter = new FeedItemAdapter(data); - mRecyclerView.setAdapter(feedItemAdapter); - mRecyclerView.setHasFixedSize(true); - } - - @Override - public void onError(VolleyError error) { - Frontend.error(context, R.string.error_net_load); - } - }); - } catch (IOException e) { - Frontend.error(context, R.string.error_load_filters, e); - } + @Override + public void onError(VolleyError error) { + Frontend.error(context, R.string.error_net_load); + } + }); return rootView; } diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerFilterFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerFilterFragment.java index ab9d458..74be14a 100755 --- a/app/src/main/java/org/rssin/android/NavigationDrawerFilterFragment.java +++ b/app/src/main/java/org/rssin/android/NavigationDrawerFilterFragment.java @@ -17,7 +17,6 @@ import org.rssin.rssin.FeedLoaderAndSorter; import org.rssin.rssin.Filter; import org.rssin.rssin.R; import org.rssin.rssin.SortedFeedItemContainer; -import org.rssin.rssin.UnifiedFilterLoader; import java.io.IOException; import java.util.List; @@ -65,7 +64,6 @@ public class NavigationDrawerFilterFragment extends Fragment { e.printStackTrace(); } - filter.ensureFeedSorter(DefaultStorageProvider.getInstance(context)); filter.ensureFeeds(DefaultStorageProvider.getInstance(context)); /** @@ -75,8 +73,8 @@ public class NavigationDrawerFilterFragment extends Fragment { * filters that may take a while, so it would be preferable to return intermediate * results. We could do this for example with {@link org.rssin.listener.RealtimeListener} */ - FeedLoaderAndSorter loaderAndSorter = new FeedLoaderAndSorter(filter); - loaderAndSorter.getFilteredFeedItems(new VolleyFetcher(context), new FallibleListener, VolleyError>() { + FeedLoaderAndSorter loaderAndSorter = new FeedLoaderAndSorter(filter.getFeeds()); + loaderAndSorter.getFilteredFeedItems(context, new VolleyFetcher(context), new FallibleListener, VolleyError>() { @Override public void onReceive(List data) { FeedItemAdapter feedItemAdapter = new FeedItemAdapter(data); diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerManageFiltersFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerManageFiltersFragment.java index d82aaaa..405d7be 100755 --- a/app/src/main/java/org/rssin/android/NavigationDrawerManageFiltersFragment.java +++ b/app/src/main/java/org/rssin/android/NavigationDrawerManageFiltersFragment.java @@ -21,13 +21,8 @@ import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; -import com.android.volley.VolleyError; - -import org.rssin.listener.FallibleListener; import org.rssin.rssin.Filter; import org.rssin.rssin.R; -import org.rssin.rssin.SortedFeedItemContainer; -import org.rssin.rssin.UnifiedFilterLoader; import java.io.IOException; import java.util.List; diff --git a/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java b/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java index 2818a08..dbfcc9a 100755 --- a/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java +++ b/app/src/main/java/org/rssin/android/SharedPreferencesStorageProvider.java @@ -86,7 +86,11 @@ class SharedPreferencesStorageProvider implements StorageProvider, FilterStorage if (serialized == null) { throw new IOException("No sharedPreference with key " + key.toString() + " and class " + className.getName()); } - ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(Base64.decode(serialized.getBytes(), Base64.DEFAULT))); + + byte[] bytes = serialized.getBytes(); + byte[] decoded = Base64.decode(bytes, Base64.DEFAULT); + + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(decoded)); Object obj = ois.readObject(); return (Storable) className.cast(obj); } @@ -97,10 +101,6 @@ class SharedPreferencesStorageProvider implements StorageProvider, FilterStorage .edit() .remove(className.getName()) .apply(); - - if (className == Feed.class) { - removeFeed(key); - } } @Override @@ -170,14 +170,14 @@ class SharedPreferencesStorageProvider implements StorageProvider, FilterStorage Set names = context.getSharedPreferences(ADMIN_PREF_KEY, Context.MODE_PRIVATE).getStringSet("feeds", new HashSet()); if (names.isEmpty() && !context.getSharedPreferences(ADMIN_PREF_KEY, Context.MODE_PRIVATE).getBoolean("firstload", false)) { String[] feedsList = context.getResources().getStringArray(R.array.default_feeds); - for (String url : feedsList) { + /*for (String url : feedsList) { try { Feed f = new Feed(url); f.store(this); } catch (Exception e) { Log.w("SPSP", "Couldn't add " + url, e); } - } + }*/ context.getSharedPreferences(ADMIN_PREF_KEY, Context.MODE_PRIVATE).edit().putBoolean("firstload", true).apply(); names = context.getSharedPreferences(ADMIN_PREF_KEY, Context.MODE_PRIVATE).getStringSet("feeds", new HashSet()); } diff --git a/app/src/main/java/org/rssin/rssin/FeedLoaderAndSorter.java b/app/src/main/java/org/rssin/rssin/FeedLoaderAndSorter.java index 3211325..a317a27 100755 --- a/app/src/main/java/org/rssin/rssin/FeedLoaderAndSorter.java +++ b/app/src/main/java/org/rssin/rssin/FeedLoaderAndSorter.java @@ -1,5 +1,8 @@ package org.rssin.rssin; +import android.content.Context; + +import org.rssin.android.FeedSorterProvider; import org.rssin.http.Fetcher; import org.rssin.listener.FallibleListener; import org.rssin.listener.Listener; @@ -16,10 +19,10 @@ import java.util.List; * @todo javadoc */ public class FeedLoaderAndSorter { - private Filter filter; + private final List feeds; - public FeedLoaderAndSorter(Filter filter) { - this.filter = filter; + public FeedLoaderAndSorter(List feeds) { + this.feeds = feeds; } /** @@ -27,19 +30,19 @@ public class FeedLoaderAndSorter { * @param fetcher HTTP Fetcher * @param listener Listener for when the fetcher finishes */ - public void getFilteredFeedItems(Fetcher fetcher, final Listener> listener) + public void getFilteredFeedItems(Context context, Fetcher fetcher, final Listener> listener) { final List resultingItems = new ArrayList<>(); - final Counter counter = new Counter(filter.getFeeds().size()); - final FeedSorter sorter = filter.getFeedSorter(); + final Counter counter = new Counter(feeds.size()); + final FeedSorter sorter = FeedSorterProvider.getInstance(context).getFeedSorter(); - for (Feed feed : filter.getFeeds()) { + for (Feed feed : feeds) { final FeedLoader loader = new FeedLoader(feed.getURL()); loader.fetchXML(fetcher, new FallibleListener() { @Override public void onReceive(Object data) { for (FeedItem item : loader.getFeed().getPosts()) { - resultingItems.add(new SortedFeedItemContainer(item, filter)); + resultingItems.add(new SortedFeedItemContainer(item)); } List sorted = sorter.sortItems(resultingItems); diff --git a/app/src/main/java/org/rssin/rssin/Filter.java b/app/src/main/java/org/rssin/rssin/Filter.java index e7e0158..283bde0 100755 --- a/app/src/main/java/org/rssin/rssin/Filter.java +++ b/app/src/main/java/org/rssin/rssin/Filter.java @@ -43,17 +43,6 @@ public class Filter implements Storable, Comparable, Jsonable { */ private Object storageKey; - /** - * The FeedSorter for this filter - * Since this object is fairly large, serialisation takes too long to save it with the filter - * itself, and serialise the FeedSorter every time we update our filter's settings. Therefore, - * We define this attribute to be transient, and require the programmer to call - * {@link this#ensureFeedSorter(StorageProvider)} before using this attribute. - * - * @see this#ensureFeedSorter(StorageProvider) - */ - private transient FeedSorter feedSorter; - public Filter() { feedHashCodes = new ArrayList<>(); feeds = new ArrayList<>(); @@ -90,40 +79,10 @@ public class Filter implements Storable, Comparable, Jsonable { this.title = title.trim(); } - /** - * Be sure to call {@link this#ensureFeedSorter(StorageProvider)} before calling this getter. - * @return - */ - public FeedSorter getFeedSorter() { - return feedSorter; - } - public Object getStorageKey() { return storageKey; } - /** - * Ensure that there is a feedSorter linked to this object - * Because the feedSorter attribute is transient (if not, serialisation for changing settings - * takes too long), we need to manually ensure we get the FeedSorter as well every time we need - * it. It is the programmer's responsibility to call this method. - * @param storageProvider - */ - public synchronized void ensureFeedSorter(StorageProvider storageProvider) { - if (storageKey == null) { - storageKey = storageProvider.uniqueKey(); - } - - try { - feedSorter = (FeedSorter) storageProvider.fetch(storageKey, FeedSorter.class); - } catch (Exception e) { - feedSorter = new FeedSorter(); - try { - storageProvider.store(storageKey, feedSorter); - } catch (Exception e1) {} - } - } - public synchronized void ensureFeeds(FeedStorageProvider storageProvider) { List all_feeds = storageProvider.allFeeds(); feeds = new ArrayList<>(); @@ -161,18 +120,6 @@ public class Filter implements Storable, Comparable, Jsonable { storageProvider.removeFilter(storageKey); } - /** - * Save the FeedSorter of this Filter - * This is done in a separate thread because it takes too long to do in a main thread. This - * also means that you cannot rely on the FeedSorter being saved when this method returns. - * @param storageProvider - * @throws Exception - */ - public synchronized void storeFeedSorter(StorageProvider storageProvider) { - Thread thread = new Thread(new FeedSorterStorer(storageKey, storageProvider, feedSorter)); - thread.start(); - } - @Override public int compareTo(@Nullable Filter another) { return another == null ? -1 : title.compareTo(another.title); @@ -193,27 +140,4 @@ public class Filter implements Storable, Comparable, Jsonable { feedHashCodes = JsonSerializer.integersListFromJson(json.getJSONArray("feedHashCodes")); storageKey = json.getString("storageKey"); } - - private class FeedSorterStorer implements Runnable { - private final Object storageKey; - private final StorageProvider storageProvider; - private final FeedSorter feedSorter; - - public FeedSorterStorer(Object storageKey, StorageProvider storageProvider, FeedSorter feedSorter) { - this.storageKey = storageKey; - this.storageProvider = storageProvider; - this.feedSorter = feedSorter; - } - - @Override - public void run() { - ensureFeedSorter(storageProvider); - try { - storageProvider.store(storageKey, feedSorter); - } catch (Exception e) { - Log.e("Filter", "Failed to store FeedSorter", e); - } - } - } - } diff --git a/app/src/main/java/org/rssin/rssin/SortedFeedItemContainer.java b/app/src/main/java/org/rssin/rssin/SortedFeedItemContainer.java index 913a120..2a69bfa 100755 --- a/app/src/main/java/org/rssin/rssin/SortedFeedItemContainer.java +++ b/app/src/main/java/org/rssin/rssin/SortedFeedItemContainer.java @@ -1,5 +1,8 @@ package org.rssin.rssin; +import android.content.Context; + +import org.rssin.android.FeedSorterProvider; import org.rssin.android.FiltersList; import org.rssin.neurons.FeedSorter; import org.rssin.neurons.Feedback; @@ -12,13 +15,11 @@ import java.io.Serializable; */ public class SortedFeedItemContainer implements Comparable, Serializable { private FeedItem feeditem; - private int filterHashCode; private long score; - public SortedFeedItemContainer(FeedItem feeditem, Filter filter) + public SortedFeedItemContainer(FeedItem feeditem) { this.feeditem = feeditem; - this.filterHashCode = filter.hashCode(); this.setScore(-1); } @@ -26,13 +27,6 @@ public class SortedFeedItemContainer implements Comparable filters; - public UnifiedFilterLoader(List filters) - { - this.filters = filters; - } - - /** - * Loads the feed(s), filters it, sorts it, and returns the result. - * @param fetcher HTTP Fetcher - * @param listener Listener for when the fetcher finishes - */ - public void getFilteredFeedItems(Fetcher fetcher, final Listener> listener) { - // HashSet to make sure that there are no duplicates when merging multiple filters, since different filters - // may contain the same feed. - final HashSet resultingItems = new HashSet<>(); - final Counter counter = new Counter(filters.size()); - - for (Filter filter : filters) { - // Load the sorted FeedItems from the filters, and combine them. - FeedLoaderAndSorter loaderAndSorter = new FeedLoaderAndSorter(filter); - loaderAndSorter.getFilteredFeedItems(fetcher, new Listener>() { - @Override - public void onReceive(List data) { - resultingItems.addAll(data); - - if (counter.decr().isZero() || listener.getClass() == RealtimeListener.class) { - ArrayList newItems = new ArrayList(resultingItems); - - // Do another sort to make sure the items are still in the correct order. - // this uses the score set by the FeedSorter class, which is called - // in the Filter class. The Unified inbox does not have a separate network. - Collections.sort(newItems); - - listener.onReceive(newItems); - if (counter.decr().isZero() && listener.getClass() == RealtimeListener.class) { - ((RealtimeListener) listener).finish(); - } - } - } - }); - } - } - - private static class Counter { - int count; - - Counter (int initial) { - count = initial; - } - - public Counter decr() { - count--; - return this; - } - - public boolean isZero() { - return count == 0; - } - } -} diff --git a/app/src/main/java/org/rssin/rssin/dummy/DummyContent.java b/app/src/main/java/org/rssin/rssin/dummy/DummyContent.java deleted file mode 100755 index 059f859..0000000 --- a/app/src/main/java/org/rssin/rssin/dummy/DummyContent.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.rssin.rssin.dummy; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Helper class for providing sample content for user interfaces created by - * Android template wizards. - *

- * TODO: Replace all uses of this class before publishing your app. - */ -public class DummyContent { - - /** - * An array of sample (dummy) items. - */ - public static List ITEMS = new ArrayList(); - - /** - * A map of sample (dummy) items, by ID. - */ - public static Map ITEM_MAP = new HashMap(); - - static { - // Add 3 sample items. - addItem(new DummyItem("1", "Item 1")); - addItem(new DummyItem("2", "Item 2")); - addItem(new DummyItem("3", "Item 3")); - } - - private static void addItem(DummyItem item) { - ITEMS.add(item); - ITEM_MAP.put(item.id, item); - } - - /** - * A dummy item representing a piece of content. - */ - public static class DummyItem { - public String id; - public String content; - - public DummyItem(String id, String content) { - this.id = id; - this.content = content; - } - - @Override - public String toString() { - return content; - } - } -} -- cgit v1.2.3 From 27f75bb3d622efab0ca3f76ee67d8a7fb5cfd972 Mon Sep 17 00:00:00 2001 From: Halzyn Date: Tue, 9 Jun 2015 15:31:22 +0200 Subject: Icons, prettier hamburger menu --- .../org/rssin/android/NavigationDrawerAdapter.java | 53 ++++++++++++++++++--- .../rssin/android/NavigationDrawerFragment.java | 2 +- .../main/res/drawable-hdpi/ic_add_white_24dp.png | Bin 0 -> 127 bytes .../main/res/drawable-hdpi/ic_menu_white_24dp.png | Bin 0 -> 92 bytes .../main/res/drawable-hdpi/ic_share_white_24dp.png | Bin 0 -> 397 bytes .../main/res/drawable-mdpi/ic_add_white_24dp.png | Bin 0 -> 88 bytes .../main/res/drawable-mdpi/ic_menu_white_24dp.png | Bin 0 -> 83 bytes .../main/res/drawable-mdpi/ic_share_white_24dp.png | Bin 0 -> 268 bytes .../main/res/drawable-xhdpi/ic_add_white_24dp.png | Bin 0 -> 97 bytes .../main/res/drawable-xhdpi/ic_menu_white_24dp.png | Bin 0 -> 93 bytes .../res/drawable-xhdpi/ic_share_white_24dp.png | Bin 0 -> 496 bytes .../main/res/drawable-xxhdpi/ic_add_white_24dp.png | Bin 0 -> 97 bytes .../res/drawable-xxhdpi/ic_menu_white_24dp.png | Bin 0 -> 95 bytes .../res/drawable-xxhdpi/ic_share_white_24dp.png | Bin 0 -> 698 bytes .../res/drawable-xxxhdpi/ic_add_white_24dp.png | Bin 0 -> 102 bytes .../res/drawable-xxxhdpi/ic_menu_white_24dp.png | Bin 0 -> 99 bytes .../res/drawable-xxxhdpi/ic_share_white_24dp.png | Bin 0 -> 938 bytes .../main/res/layout/fragment_navigation_drawer.xml | 7 +-- app/src/main/res/layout/item_navigation_drawer.xml | 3 +- .../res/layout/separator_navigation_drawer.xml | 3 +- app/src/main/res/menu/menu_article.xml | 7 +++ app/src/main/res/menu/menu_feeds.xml | 1 + app/src/main/res/menu/menu_filters.xml | 1 + 23 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_add_white_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_menu_white_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_share_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_add_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_menu_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_share_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_add_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_menu_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_share_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_menu_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_menu_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png (limited to 'app/src/main/java') diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerAdapter.java b/app/src/main/java/org/rssin/android/NavigationDrawerAdapter.java index 39a472c..90ce041 100755 --- a/app/src/main/java/org/rssin/android/NavigationDrawerAdapter.java +++ b/app/src/main/java/org/rssin/android/NavigationDrawerAdapter.java @@ -35,23 +35,20 @@ class NavigationDrawerAdapter implements ListAdapter { menuItems.clear(); menuItems.add(new MenuSection("START")); menuItems.add(new MenuUnifiedInbox()); - menuItems.add(new MenuSection("FILTERS")); + menuItems.add(new ManageFiltersSection("FILTERS (EDIT)")); for(Filter f : FiltersList.getInstance(context).getFilters()) { menuItems.add(new MenuFilterItem(f)); } - menuItems.add(new FilterListMenuItem()); - - menuItems.add(new MenuSection("FEEDS")); + menuItems.add(new ManageFeedsSection("FEEDS (EDIT)")); for(Feed f : FeedsList.getInstance(context).getFeeds()) { menuItems.add(new MenuFeedItem(f)); } - menuItems.add(new FeedListMenuItem()); for(DataSetObserver observer : observers) { @@ -61,12 +58,12 @@ class NavigationDrawerAdapter implements ListAdapter { @Override public boolean areAllItemsEnabled() { - return false; + return true; } @Override public boolean isEnabled(int position) { - return getItemViewType(position) != ITEM_VIEW_TYPE_SEPARATOR; + return true; } private List observers = new ArrayList<>(); @@ -320,4 +317,46 @@ class NavigationDrawerAdapter implements ListAdapter { return ITEM_VIEW_TYPE_SEPARATOR; } } + + class ManageFiltersSection extends MenuSection + { + public ManageFiltersSection(String text) + { + super(text); + } + + @Override + public Fragment getFragment() { + return NavigationDrawerManageFiltersFragment.newInstance(); + } + + @Override + public int getPreferredMenuId() { + return R.menu.menu_filters; + } + } + + class ManageFeedsSection extends MenuSection + { + public ManageFeedsSection(String text) + { + super(text); + } + + @Override + public void invokeActionSettings(Context context) + { + + } + + @Override + public Fragment getFragment() { + return NavigationDrawerManageFeedsFragment.newInstance(); + } + + @Override + public int getPreferredMenuId() { + return R.menu.menu_feeds; + } + } } diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerFragment.java index 5289de2..3fc286e 100755 --- a/app/src/main/java/org/rssin/android/NavigationDrawerFragment.java +++ b/app/src/main/java/org/rssin/android/NavigationDrawerFragment.java @@ -144,7 +144,7 @@ public class NavigationDrawerFragment extends Fragment { mDrawerToggle = new ActionBarDrawerToggle( getActivity(), /* host Activity */ mDrawerLayout, /* DrawerLayout object */ - R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ + R.drawable.ic_menu_white_24dp, /* nav drawer image to replace 'Up' caret */ R.string.navigation_drawer_open, /* "open drawer" description for accessibility */ R.string.navigation_drawer_close /* "close drawer" description for accessibility */ ) { diff --git a/app/src/main/res/drawable-hdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_add_white_24dp.png new file mode 100644 index 0000000..694179b Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_add_white_24dp.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_menu_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_menu_white_24dp.png new file mode 100644 index 0000000..238cfd6 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_menu_white_24dp.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_share_white_24dp.png new file mode 100644 index 0000000..b09a692 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_share_white_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_add_white_24dp.png new file mode 100644 index 0000000..3856041 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_add_white_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_menu_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_menu_white_24dp.png new file mode 100644 index 0000000..d3cec05 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_menu_white_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_share_white_24dp.png new file mode 100644 index 0000000..e944fd7 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_share_white_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_add_white_24dp.png new file mode 100644 index 0000000..67bb598 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_add_white_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_menu_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_menu_white_24dp.png new file mode 100644 index 0000000..193185f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_menu_white_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_share_white_24dp.png new file mode 100644 index 0000000..22a8783 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_share_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png new file mode 100644 index 0000000..0fdced8 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_menu_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_menu_white_24dp.png new file mode 100644 index 0000000..9cb0348 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_menu_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png new file mode 100644 index 0000000..a35b3cd Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png new file mode 100644 index 0000000..d64c22e Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_menu_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_menu_white_24dp.png new file mode 100644 index 0000000..623d147 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_menu_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png new file mode 100644 index 0000000..e351c7b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png differ diff --git a/app/src/main/res/layout/fragment_navigation_drawer.xml b/app/src/main/res/layout/fragment_navigation_drawer.xml index 6b9ec1d..caa58c8 100755 --- a/app/src/main/res/layout/fragment_navigation_drawer.xml +++ b/app/src/main/res/layout/fragment_navigation_drawer.xml @@ -1,7 +1,8 @@ \ No newline at end of file + android:background="#121212" + tools:context="org.rssin.android.NavigationDrawerFragment" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_navigation_drawer.xml b/app/src/main/res/layout/item_navigation_drawer.xml index 32a8837..6555bb3 100755 --- a/app/src/main/res/layout/item_navigation_drawer.xml +++ b/app/src/main/res/layout/item_navigation_drawer.xml @@ -8,7 +8,7 @@ android:orientation="vertical" android:layout_marginTop="0dp" - android:background="?android:attr/activatedBackgroundIndicator" + android:background="#121212" > diff --git a/app/src/main/res/layout/separator_navigation_drawer.xml b/app/src/main/res/layout/separator_navigation_drawer.xml index 856093c..81a9d0a 100755 --- a/app/src/main/res/layout/separator_navigation_drawer.xml +++ b/app/src/main/res/layout/separator_navigation_drawer.xml @@ -7,7 +7,7 @@ android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:orientation="vertical" android:layout_marginTop="0dp" -android:background="?android:attr/activatedBackgroundIndicator" +android:background="#252525" > diff --git a/app/src/main/res/menu/menu_article.xml b/app/src/main/res/menu/menu_article.xml index c0f4281..064831b 100755 --- a/app/src/main/res/menu/menu_article.xml +++ b/app/src/main/res/menu/menu_article.xml @@ -16,4 +16,11 @@ android:orderInCategory="100" android:icon="@drawable/ic_action_action_thumb_down" app:showAsAction="ifRoom" /> + + diff --git a/app/src/main/res/menu/menu_feeds.xml b/app/src/main/res/menu/menu_feeds.xml index 20a4fea..b3c3044 100644 --- a/app/src/main/res/menu/menu_feeds.xml +++ b/app/src/main/res/menu/menu_feeds.xml @@ -7,6 +7,7 @@ diff --git a/app/src/main/res/menu/menu_filters.xml b/app/src/main/res/menu/menu_filters.xml index 5973bd0..b91df52 100644 --- a/app/src/main/res/menu/menu_filters.xml +++ b/app/src/main/res/menu/menu_filters.xml @@ -8,6 +8,7 @@ -- cgit v1.2.3 From 7e88b03233b7f148a2dae87e2b0152656a1c5b51 Mon Sep 17 00:00:00 2001 From: Size43 Date: Tue, 9 Jun 2015 15:43:35 +0200 Subject: App name changed to RSSin --- app/src/main/java/org/rssin/android/FeedSorterProvider.java | 6 +++--- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'app/src/main/java') diff --git a/app/src/main/java/org/rssin/android/FeedSorterProvider.java b/app/src/main/java/org/rssin/android/FeedSorterProvider.java index 3e8dec5..0f0748d 100755 --- a/app/src/main/java/org/rssin/android/FeedSorterProvider.java +++ b/app/src/main/java/org/rssin/android/FeedSorterProvider.java @@ -22,12 +22,12 @@ public class FeedSorterProvider { storageProvider = InternalStorageProvider.getInstance(context); } - public static FeedSorterProvider getInstance() + public synchronized static FeedSorterProvider getInstance() { return instance; } - public static FeedSorterProvider getInstance(Context context) + public synchronized static FeedSorterProvider getInstance(Context context) { if(instance == null) { @@ -37,7 +37,7 @@ public class FeedSorterProvider { return instance; } - public FeedSorter getFeedSorter() + public synchronized FeedSorter getFeedSorter() { if(sorter == null) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 550bc2a..1a279c7 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -50,7 +50,7 @@ Dislike Like - HomeScreenActivity + RSSin Section 1 Section 2 -- cgit v1.2.3 From 205fdeff4ccb55e0baa893b044d68931ca9111e4 Mon Sep 17 00:00:00 2001 From: Halzyn Date: Tue, 9 Jun 2015 15:44:34 +0200 Subject: Card view now shows date --- app/src/main/java/org/rssin/android/FeedItemAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/src/main/java') diff --git a/app/src/main/java/org/rssin/android/FeedItemAdapter.java b/app/src/main/java/org/rssin/android/FeedItemAdapter.java index 6b092c4..7210254 100755 --- a/app/src/main/java/org/rssin/android/FeedItemAdapter.java +++ b/app/src/main/java/org/rssin/android/FeedItemAdapter.java @@ -50,7 +50,7 @@ class FeedItemAdapter extends RecyclerView.Adapter 100755 app/src/main/java/org/rssin/rss/FeedLoader.java (limited to 'app/src/main/java') diff --git a/app/src/main/java/org/rssin/rss/FeedLoader.java b/app/src/main/java/org/rssin/rss/FeedLoader.java old mode 100644 new mode 100755 index 3220826..4cdf80f --- a/app/src/main/java/org/rssin/rss/FeedLoader.java +++ b/app/src/main/java/org/rssin/rss/FeedLoader.java @@ -1,6 +1,9 @@ package org.rssin.rss; +import android.util.Log; + import java.io.ByteArrayInputStream; +import java.io.IOException; import java.net.URL; import java.util.Date; import java.util.LinkedList; @@ -186,30 +189,37 @@ public class FeedLoader { int event; boolean imageloop = true; event = myParser.getEventType(); - while (imageloop) { - String name = myParser.getName(); - switch (event) { - case XmlPullParser.START_TAG: - break; - case XmlPullParser.TEXT: - text = myParser.getText(); - break; - case XmlPullParser.END_TAG: - switch (name) { - case "url": - getFeed().setImageurl(text); - break; - case "title": - getFeed().setImagetitle(text); - break; - case "link": - getFeed().setImagelink(text); - break; - case "image": - imageloop = false; - break; - } + try { + while (imageloop) { + String name = myParser.getName(); + switch (event) { + case XmlPullParser.START_TAG: + break; + case XmlPullParser.TEXT: + text = myParser.getText(); + break; + case XmlPullParser.END_TAG: + switch (name) { + case "url": + getFeed().setImageurl(text); + break; + case "title": + getFeed().setImagetitle(text); + break; + case "link": + getFeed().setImagelink(text); + break; + case "image": + imageloop = false; + break; + } + } + + event = myParser.next(); } + }catch(IOException e) + { + e.printStackTrace(); } } -- cgit v1.2.3