aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xapp/src/main/AndroidManifest.xml19
-rwxr-xr-x[-rw-r--r--]app/src/main/java/org/rssin/android/FeedsActivity.java2
-rwxr-xr-xapp/src/main/java/org/rssin/android/FiltersActivity.java2
-rwxr-xr-xapp/src/main/java/org/rssin/android/HomeScreenActivity.java18
-rwxr-xr-xapp/src/main/java/org/rssin/android/NavigationDrawerAdapter.java94
-rwxr-xr-xapp/src/main/java/org/rssin/android/NavigationDrawerFeedFragment.java2
-rwxr-xr-xapp/src/main/java/org/rssin/android/NavigationDrawerFragment.java12
-rwxr-xr-xapp/src/main/java/org/rssin/android/NavigationDrawerManageFeedsFragment.java218
-rwxr-xr-xapp/src/main/java/org/rssin/android/NavigationDrawerManageFiltersFragment.java220
-rwxr-xr-xapp/src/main/java/org/rssin/android/UnifiedInboxActivity.java97
-rw-r--r--app/src/main/res/layout/fragment_feeds.xml (renamed from app/src/main/res/layout/activity_feeds.xml)0
-rw-r--r--app/src/main/res/layout/fragment_filters.xml (renamed from app/src/main/res/layout/activity_filters.xml)0
-rwxr-xr-xapp/src/main/res/layout/fragment_home_screen.xml2
-rwxr-xr-xapp/src/main/res/menu/global.xml8
-rwxr-xr-xapp/src/main/res/menu/home_screen.xml2
15 files changed, 563 insertions, 133 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d572cc5..65dc82a 100755
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -10,43 +10,39 @@
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
- android:name="org.rssin.android.UnifiedInboxActivity"
- android:label="@string/title_activity_unifiedinbox" >
- </activity>
- <activity
android:name="org.rssin.android.SettingsActivity"
android:label="@string/title_activity_settings" >
</activity>
<activity
android:name="org.rssin.android.FiltersActivity"
android:label="@string/title_activity_filters"
- android:parentActivityName="org.rssin.android.UnifiedInboxActivity" >
+ android:parentActivityName="org.rssin.android.HomeScreenActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value="org.rssin.android.UnifiedInboxActivity" />
+ android:value="org.rssin.android.HomeScreenActivity" />
</activity>
<activity
android:name="org.rssin.android.FilterSettingsActivity"
android:label="@string/title_activity_filter_settings" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value="org.rssin.android.FiltersActivity" />
+ android:value="org.rssin.android.HomeScreenActivity" />
</activity>
<activity
android:name="org.rssin.android.FilterActivity"
android:label="@string/title_activity_filter"
- android:parentActivityName="org.rssin.android.FiltersActivity" >
+ android:parentActivityName="org.rssin.android.HomeScreenActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value="org.rssin.android.FiltersActivity" />
+ android:value="org.rssin.android.HomeScreenActivity" />
</activity>
<activity
android:name="org.rssin.android.FeedsActivity"
android:label="@string/title_activity_feeds"
- android:parentActivityName="org.rssin.android.UnifiedInboxActivity" >
+ android:parentActivityName="org.rssin.android.HomeScreenActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value="org.rssin.android.UnifiedInboxActivity" />
+ android:value="org.rssin.android.HomeScreenActivity" />
</activity>
<activity
android:name="org.rssin.android.ArticleActivity"
@@ -57,7 +53,6 @@
android:label="@string/title_activity_home_screen" >
<intent-filter android:label="@string/app_name" >
<action android:name="android.intent.action.MAIN" />
-
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
diff --git a/app/src/main/java/org/rssin/android/FeedsActivity.java b/app/src/main/java/org/rssin/android/FeedsActivity.java
index d4b6b6e..bc234d4 100644..100755
--- a/app/src/main/java/org/rssin/android/FeedsActivity.java
+++ b/app/src/main/java/org/rssin/android/FeedsActivity.java
@@ -39,7 +39,7 @@ public class FeedsActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_feeds);
+ setContentView(R.layout.fragment_feeds);
feedsView = (ListView) findViewById(R.id.feeds_list);
diff --git a/app/src/main/java/org/rssin/android/FiltersActivity.java b/app/src/main/java/org/rssin/android/FiltersActivity.java
index 63887fe..a8e295c 100755
--- a/app/src/main/java/org/rssin/android/FiltersActivity.java
+++ b/app/src/main/java/org/rssin/android/FiltersActivity.java
@@ -45,7 +45,7 @@ public class FiltersActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_filters);
+ setContentView(R.layout.fragment_filters);
filtersView = (ListView) findViewById(R.id.filters_list);
diff --git a/app/src/main/java/org/rssin/android/HomeScreenActivity.java b/app/src/main/java/org/rssin/android/HomeScreenActivity.java
index 082d810..bbae149 100755
--- a/app/src/main/java/org/rssin/android/HomeScreenActivity.java
+++ b/app/src/main/java/org/rssin/android/HomeScreenActivity.java
@@ -59,18 +59,20 @@ public class HomeScreenActivity extends ActionBarActivity
NavigationDrawerAllFeedsFragment initialFragment = NavigationDrawerAllFeedsFragment.newInstance();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
- .replace(R.id.container, initialFragment)
+ .replace(R.id.container, currentFragment = initialFragment)
.commit();
mTitle = "All feeds";
}
+ private Fragment currentFragment;
+
@Override
public void onNavigationDrawerItemSelected(int position) {
// update the main content by replacing fragments
if(mNavigationDrawerFragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
- .replace(R.id.container, mNavigationDrawerFragment.getAdapter().getFragment(position))
+ .replace(R.id.container, currentFragment = mNavigationDrawerFragment.getAdapter().getFragment(position))
.commit();
mTitle = mNavigationDrawerFragment.getAdapter().getText(position);
}
@@ -86,10 +88,7 @@ public class HomeScreenActivity extends ActionBarActivity
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (!mNavigationDrawerFragment.isDrawerOpen()) {
- // Only show items in the action bar relevant to this screen
- // if the drawer is not showing. Otherwise, let the drawer
- // decide what to show in the action bar.
- getMenuInflater().inflate(R.menu.home_screen, menu);
+ getMenuInflater().inflate(mNavigationDrawerFragment.getCurrentItem().getPreferredMenuId(), menu);
restoreActionBar();
return true;
}
@@ -103,10 +102,9 @@ public class HomeScreenActivity extends ActionBarActivity
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
- //noinspection SimplifiableIfStatement
- if (id == R.id.action_settings) {
- Intent intent = new Intent(this, UnifiedInboxActivity.class);
- startActivity(intent);
+ if(currentFragment.onOptionsItemSelected(item))
+ {
+ return true;
}
return super.onOptionsItemSelected(item);
diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerAdapter.java b/app/src/main/java/org/rssin/android/NavigationDrawerAdapter.java
index f7a1265..39a472c 100755
--- a/app/src/main/java/org/rssin/android/NavigationDrawerAdapter.java
+++ b/app/src/main/java/org/rssin/android/NavigationDrawerAdapter.java
@@ -1,6 +1,7 @@
package org.rssin.android;
import android.content.Context;
+import android.content.Intent;
import android.database.DataSetObserver;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
@@ -27,6 +28,11 @@ class NavigationDrawerAdapter implements ListAdapter {
private final List<MenuItem> menuItems = new ArrayList<>();
public NavigationDrawerAdapter(Context context) throws IOException {
+ updateMenu(context);
+ }
+
+ public void updateMenu(Context context) throws IOException {
+ menuItems.clear();
menuItems.add(new MenuSection("START"));
menuItems.add(new MenuUnifiedInbox());
menuItems.add(new MenuSection("FILTERS"));
@@ -36,12 +42,21 @@ class NavigationDrawerAdapter implements ListAdapter {
menuItems.add(new MenuFilterItem(f));
}
+ menuItems.add(new FilterListMenuItem());
+
menuItems.add(new MenuSection("FEEDS"));
for(Feed f : FeedsList.getInstance(context).getFeeds())
{
menuItems.add(new MenuFeedItem(f));
}
+
+ menuItems.add(new FeedListMenuItem());
+
+ for(DataSetObserver observer : observers)
+ {
+ observer.onChanged();
+ }
}
@Override
@@ -54,14 +69,15 @@ class NavigationDrawerAdapter implements ListAdapter {
return getItemViewType(position) != ITEM_VIEW_TYPE_SEPARATOR;
}
+ private List<DataSetObserver> observers = new ArrayList<>();
@Override
public void registerDataSetObserver(DataSetObserver observer) {
-
+ observers.add(observer);
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
-
+ observers.remove(observer);
}
@Override
@@ -143,9 +159,9 @@ class NavigationDrawerAdapter implements ListAdapter {
this.text = text;
}
- public void invokeActionSettings()
+ public void invokeActionSettings(Context context)
{
-
+
}
public int getItemViewType()
@@ -162,6 +178,56 @@ class NavigationDrawerAdapter implements ListAdapter {
{
return text;
}
+
+ public int getPreferredMenuId() {
+ return R.menu.global;
+ }
+ }
+
+ class FilterListMenuItem extends MenuItem
+ {
+ public FilterListMenuItem()
+ {
+ super("Manage filters...");
+ }
+
+ @Override
+ public int getItemViewType() {
+ return ITEM_VIEW_TYPE_NORMAL;
+ }
+
+ @Override
+ public Fragment getFragment() {
+ return NavigationDrawerManageFiltersFragment.newInstance();
+ }
+
+ @Override
+ public int getPreferredMenuId() {
+ return R.menu.menu_filters;
+ }
+ }
+
+ class FeedListMenuItem extends MenuItem
+ {
+ public FeedListMenuItem()
+ {
+ super("Manage feeds...");
+ }
+
+ @Override
+ public int getItemViewType() {
+ return ITEM_VIEW_TYPE_NORMAL;
+ }
+
+ @Override
+ public Fragment getFragment() {
+ return NavigationDrawerManageFeedsFragment.newInstance();
+ }
+
+ @Override
+ public int getPreferredMenuId() {
+ return R.menu.menu_feeds;
+ }
}
class MenuUnifiedInbox extends MenuItem
@@ -172,6 +238,12 @@ class NavigationDrawerAdapter implements ListAdapter {
}
@Override
+ public void invokeActionSettings(Context context) {
+ Intent intent = new Intent(context, SettingsActivity.class);
+ context.startActivity(intent);
+ }
+
+ @Override
public int getItemViewType() {
return ITEM_VIEW_TYPE_NORMAL;
}
@@ -192,6 +264,12 @@ class NavigationDrawerAdapter implements ListAdapter {
}
@Override
+ public void invokeActionSettings(Context context) {
+ Intent intent = new Intent(context, FeedsActivity.class);
+ context.startActivity(intent);
+ }
+
+ @Override
public int getItemViewType() {
return ITEM_VIEW_TYPE_NORMAL;
}
@@ -212,6 +290,14 @@ class NavigationDrawerAdapter implements ListAdapter {
}
@Override
+ public void invokeActionSettings(Context context) {
+ filter.ensureFeeds(DefaultStorageProvider.getInstance(context));
+ Intent intent = new Intent(context.getApplicationContext(), FilterSettingsActivity.class);
+ intent.putExtra("filter", filter.hashCode());
+ context.startActivity(intent);
+ }
+
+ @Override
public int getItemViewType() {
return ITEM_VIEW_TYPE_NORMAL;
}
diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerFeedFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerFeedFragment.java
index fd85fc7..901d854 100755
--- a/app/src/main/java/org/rssin/android/NavigationDrawerFeedFragment.java
+++ b/app/src/main/java/org/rssin/android/NavigationDrawerFeedFragment.java
@@ -42,7 +42,7 @@ public class NavigationDrawerFeedFragment extends Fragment {
public static NavigationDrawerFeedFragment newInstance(Feed feed) {
NavigationDrawerFeedFragment fragment = new NavigationDrawerFeedFragment();
Bundle args = new Bundle();
- args.putInt(ARG_FEED_NAME, feed.hashCode());
+ args.putSerializable(ARG_FEED_NAME, feed);
fragment.setArguments(args);
return fragment;
}
diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerFragment.java
index 537e0f8..5289de2 100755
--- a/app/src/main/java/org/rssin/android/NavigationDrawerFragment.java
+++ b/app/src/main/java/org/rssin/android/NavigationDrawerFragment.java
@@ -165,6 +165,12 @@ public class NavigationDrawerFragment extends Fragment {
return;
}
+ try {
+ adapter.updateMenu(drawerView.getContext());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
if (!mUserLearnedDrawer) {
// The user manually opened the drawer; store this flag to prevent auto-showing
// the navigation drawer automatically in the future.
@@ -255,13 +261,17 @@ public class NavigationDrawerFragment extends Fragment {
}
if (item.getItemId() == R.id.action_settings) {
- adapter.getTypedItem(mCurrentSelectedPosition).invokeActionSettings();
+ getCurrentItem().invokeActionSettings(mDrawerLayout.getContext());
return true;
}
return super.onOptionsItemSelected(item);
}
+ public NavigationDrawerAdapter.MenuItem getCurrentItem() {
+ return adapter.getTypedItem(mCurrentSelectedPosition);
+ }
+
/**
* Per the navigation drawer design guidelines, updates the action bar to show the global app
* 'context', rather than just what's in the current screen.
diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerManageFeedsFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerManageFeedsFragment.java
new file mode 100755
index 0000000..9011226
--- /dev/null
+++ b/app/src/main/java/org/rssin/android/NavigationDrawerManageFeedsFragment.java
@@ -0,0 +1,218 @@
+package org.rssin.android;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.pm.ActivityInfo;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.text.InputType;
+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 com.android.volley.VolleyError;
+
+import org.rssin.listener.FallibleListener;
+import org.rssin.rssin.Feed;
+import org.rssin.rssin.FeedLoaderAndSorter;
+import org.rssin.rssin.Filter;
+import org.rssin.rssin.R;
+import org.rssin.rssin.SortedFeedItemContainer;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @author Jos.
+ */
+public class NavigationDrawerManageFeedsFragment extends Fragment {
+ /**
+ * The fragment argument representing the section number for this
+ * fragment.
+ */
+ private static final String ARG_FILTER_NAME = "filter_id";
+
+ private Filter filter;
+ private View rootView;
+
+ /**
+ * Returns a new instance of this fragment for the given section
+ * number.
+ */
+ public static NavigationDrawerManageFeedsFragment newInstance() {
+ NavigationDrawerManageFeedsFragment fragment = new NavigationDrawerManageFeedsFragment();
+ return fragment;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState)
+ {
+ final Bundle args = getArguments();
+ rootView = inflater.inflate(R.layout.fragment_feeds, container, false);
+ final Context context = rootView.getContext();
+
+
+ feedsView = (ListView) rootView.findViewById(R.id.feeds_list);
+
+ try {
+ feedsList = FeedsList.getInstance(context);
+ } catch (IOException e) {
+ Frontend.error(context, R.string.error_load_feeds, e);
+ }
+
+ feedAdapter = new FeedAdapter(context, R.layout.item_feed, feedsList.getFeeds());
+ feedsView.setAdapter(feedAdapter);
+
+ feedsView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
+ @Override
+ public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
+ Feed feed = feedAdapter.getItem(position);
+ DefaultStorageProvider
+ .getInstance(context)
+ .removeFeed(feed.getStorageKey());
+ feedsList.getFeeds().remove(feed);
+ feedAdapter.notifyDataSetChanged();
+ return true;
+ }
+ });
+
+ return rootView;
+ }
+
+
+ private FeedsList feedsList;
+ private ListView feedsView;
+ private FeedAdapter feedAdapter;
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int id = item.getItemId();
+
+ if (id == R.id.feeds_action_add) {
+ openAddDialog();
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ /**
+ * Open dialog to add new feed
+ * 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);
+ final Context context = rootView.getContext();
+
+ AlertDialog.Builder alert = new AlertDialog.Builder(context);
+
+ alert.setTitle("Add feed");
+ alert.setMessage("URL:");
+
+ final EditText input = new EditText(context);
+ input.setFocusable(true);
+ input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI);
+ input.setMaxLines(1);
+ 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 {
+ Feed f = new Feed(value);
+ f.store(DefaultStorageProvider.getInstance(context));
+ feedsList.getFeeds().add(f);
+ feedAdapter.notifyDataSetChanged();
+ } catch (Exception e) {
+ Frontend.error(context, R.string.error_save_feeds, 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();
+ }
+
+ /**
+ * Custom ArrayAdapter to display feeds with our own menu item
+ */
+ private static class FeedAdapter extends SortedArrayAdapter<Feed> {
+
+ Context context;
+ int layoutResourceId;
+
+ public FeedAdapter(Context context, int resource, List<Feed> 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;
+ FeedHolder holder = null;
+
+ if (row == null) {
+ LayoutInflater inflater = ((Activity) context).getLayoutInflater();
+ row = inflater.inflate(layoutResourceId, parent, false);
+
+ holder = new FeedHolder();
+ holder.title = (TextView) row.findViewById(R.id.feed_item_title);
+ holder.url = (TextView) row.findViewById(R.id.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());
+
+ return row;
+ }
+
+ /**
+ * TextViews holder
+ */
+ private static class FeedHolder {
+ TextView title;
+ TextView url;
+ }
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ }
+}
diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerManageFiltersFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerManageFiltersFragment.java
new file mode 100755
index 0000000..d82aaaa
--- /dev/null
+++ b/app/src/main/java/org/rssin/android/NavigationDrawerManageFiltersFragment.java
@@ -0,0 +1,220 @@
+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.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+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 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;
+
+/**
+ * @author Jos.
+ */
+
+public class NavigationDrawerManageFiltersFragment extends Fragment {
+
+ private View rootView;
+ /**
+ * Returns a new instance of this fragment for the given section
+ * number.
+ */
+ public static NavigationDrawerManageFiltersFragment newInstance() {
+ NavigationDrawerManageFiltersFragment fragment = new NavigationDrawerManageFiltersFragment();
+ return fragment;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ rootView = inflater.inflate(R.layout.fragment_filters, container, false);
+ final Context context = rootView.getContext();
+
+ filtersView = (ListView) rootView.findViewById(R.id.filters_list);
+
+ try {
+ filtersList = FiltersList.getInstance(context);
+ } catch (IOException ex) {
+ Frontend.error(context, R.string.error_load_filters, ex);
+ }
+
+ filterAdapter = new FilterAdapter(context, R.layout.item_filter, filtersList.getFilters());
+ filtersView.setAdapter(filterAdapter);
+
+ setupListeners();
+
+ return rootView;
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ }
+
+ private FiltersList filtersList;
+ private ListView filtersView;
+ private FilterAdapter filterAdapter;
+
+ private AdapterView.OnItemClickListener onFilterClickListener;
+ private AdapterView.OnItemLongClickListener onFilterLongClickListener;
+
+
+ @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);
+ openFilterSettings(item);
+ }
+ };
+
+ filtersView.setOnItemClickListener(onFilterClickListener);
+ }
+
+ /**
+ * 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(rootView.getContext());
+
+ alert.setTitle("Add filter");
+ alert.setMessage("Title:");
+
+ final EditText input = new EditText(rootView.getContext());
+ 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();
+ filterAdapter.notifyDataSetChanged();
+ openFilterSettings(f);
+ } catch (Exception e) {
+ Frontend.error(rootView.getContext(), 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(rootView.getContext()));
+ Intent intent = new Intent(rootView.getContext().getApplicationContext(), FilterSettingsActivity.class);
+ intent.putExtra("filter", f.hashCode());
+ startActivity(intent);
+ }
+
+ /**
+ * Custom ArrayAdapter to display filters with our own menu item
+ */
+ private static class FilterAdapter extends SortedArrayAdapter<Filter> {
+
+ Context context;
+ int layoutResourceId;
+
+ public FilterAdapter(Context context, int resource, List<Filter> 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;
+ }
+ }
+} \ No newline at end of file
diff --git a/app/src/main/java/org/rssin/android/UnifiedInboxActivity.java b/app/src/main/java/org/rssin/android/UnifiedInboxActivity.java
deleted file mode 100755
index 5a11621..0000000
--- a/app/src/main/java/org/rssin/android/UnifiedInboxActivity.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package org.rssin.android;
-
-import android.content.Intent;
-import android.support.v7.app.ActionBarActivity;
-import android.os.Bundle;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.view.Menu;
-import android.view.MenuItem;
-
-import com.android.volley.VolleyError;
-
-import org.rssin.listener.FallibleListener;
-import org.rssin.rssin.SortedFeedItemContainer;
-import org.rssin.rssin.Filter;
-import org.rssin.rssin.R;
-import org.rssin.rssin.UnifiedFilterLoader;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * Unified view of all filters
- * @author Camil Staps
- */
-public class UnifiedInboxActivity extends ActionBarActivity {
-
- private FiltersList filtersList;
- private RecyclerView mRecyclerView;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_unified_inbox);
-
- mRecyclerView = (RecyclerView) findViewById(R.id.unified_inbox_feeditems);
- RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this);
- mRecyclerView.setLayoutManager(mLayoutManager);
-
- try {
- filtersList = FiltersList.getInstance(this);
-
- for(Filter filter : filtersList.getFilters()) {
- filter.ensureFeedSorter(InternalStorageProvider.getInstance(this));
- filter.ensureFeeds(DefaultStorageProvider.getInstance(this));
- }
-
- /**
- * @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(this), new FallibleListener<List<SortedFeedItemContainer>, VolleyError>() {
- @Override
- public void onReceive(List<SortedFeedItemContainer> 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);
- }
- });
- } catch (IOException e) {
- Frontend.error(this, R.string.error_load_filters, e);
- }
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.menu_unified_inbox, menu);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- int id = item.getItemId();
-
- if (id == R.id.action_settings) {
- Intent intent = new Intent(this, SettingsActivity.class);
- startActivity(intent);
- } else if (id == R.id.action_filters) {
- Intent intent = new Intent(this, FiltersActivity.class);
- startActivity(intent);
- } else if (id == R.id.action_feeds) {
- Intent intent = new Intent(this, FeedsActivity.class);
- startActivity(intent);
- }
-
- return super.onOptionsItemSelected(item);
- }
-}
diff --git a/app/src/main/res/layout/activity_feeds.xml b/app/src/main/res/layout/fragment_feeds.xml
index f71eb1e..f71eb1e 100644
--- a/app/src/main/res/layout/activity_feeds.xml
+++ b/app/src/main/res/layout/fragment_feeds.xml
diff --git a/app/src/main/res/layout/activity_filters.xml b/app/src/main/res/layout/fragment_filters.xml
index c948344..c948344 100644
--- a/app/src/main/res/layout/activity_filters.xml
+++ b/app/src/main/res/layout/fragment_filters.xml
diff --git a/app/src/main/res/layout/fragment_home_screen.xml b/app/src/main/res/layout/fragment_home_screen.xml
index e33a34e..b8c5e17 100755
--- a/app/src/main/res/layout/fragment_home_screen.xml
+++ b/app/src/main/res/layout/fragment_home_screen.xml
@@ -2,7 +2,7 @@
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="0dp"
- tools:context="org.rssin.android.HomeScreenActivity.AllFeedsaFragment">
+ tools:context="org.rssin.android.HomeScreenActivity.AllFeedsFragment">
<android.support.v7.widget.RecyclerView
android:id="@+id/unified_inbox_feeditems"
diff --git a/app/src/main/res/menu/global.xml b/app/src/main/res/menu/global.xml
index fc41e98..86959a3 100755
--- a/app/src/main/res/menu/global.xml
+++ b/app/src/main/res/menu/global.xml
@@ -1,5 +1,5 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto">
- <item android:id="@+id/action_settings" android:title="@string/action_settings"
- android:orderInCategory="100" app:showAsAction="never" />
-</menu>
+xmlns:app="http://schemas.android.com/apk/res-auto">
+<item android:id="@+id/action_settings" android:title="@string/action_settings"
+ android:orderInCategory="100" app:showAsAction="never" />
+</menu> \ No newline at end of file
diff --git a/app/src/main/res/menu/home_screen.xml b/app/src/main/res/menu/home_screen.xml
index 3358601..a894d92 100755
--- a/app/src/main/res/menu/home_screen.xml
+++ b/app/src/main/res/menu/home_screen.xml
@@ -3,5 +3,5 @@
xmlns:tools="http://schemas.android.com/tools"
tools:context="org.rssin.android.HomeScreenActivity">
<item android:id="@+id/action_settings" android:title="@string/action_settings"
- android:orderInCategory="100" app:showAsAction="never" />
+ android:orderInCategory="100" app:showAsAction="ifRoom" />
</menu>