diff options
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>
|