aboutsummaryrefslogtreecommitdiff
path: root/app/src
diff options
context:
space:
mode:
authorCamil Staps2015-06-04 14:57:30 +0200
committerCamil Staps2015-06-04 14:57:30 +0200
commit7b7d6e3f0c7abd24b1174875c40e15b6dd1dbde1 (patch)
tree1862341076f5c408dd7d5d41eced10dc9f106476 /app/src
parentMerge branch 'app' of github:camilstaps/RSSin into app (diff)
parentAdded hamburger menu, working filters and unified inbox. Open old UI by going... (diff)
Merge branch 'master' into app
Diffstat (limited to 'app/src')
-rwxr-xr-xapp/src/main/AndroidManifest.xml14
-rwxr-xr-xapp/src/main/java/org/rssin/android/ArticleActivity.java3
-rwxr-xr-xapp/src/main/java/org/rssin/android/HomeScreenActivity.java115
-rwxr-xr-xapp/src/main/java/org/rssin/android/NavigationDrawerAdapter.java237
-rwxr-xr-xapp/src/main/java/org/rssin/android/NavigationDrawerAllFeedsFragment.java87
-rwxr-xr-xapp/src/main/java/org/rssin/android/NavigationDrawerFeedFragment.java107
-rwxr-xr-xapp/src/main/java/org/rssin/android/NavigationDrawerFilterFragment.java100
-rwxr-xr-xapp/src/main/java/org/rssin/android/NavigationDrawerFragment.java293
-rwxr-xr-xapp/src/main/java/org/rssin/rssin/SortedFeedItemContainer.java2
-rwxr-xr-xapp/src/main/java/org/rssin/rssin/dummy/DummyContent.java55
-rwxr-xr-xapp/src/main/res/drawable-hdpi/drawer_shadow.9.pngbin0 -> 161 bytes
-rwxr-xr-xapp/src/main/res/drawable-hdpi/ic_drawer.pngbin0 -> 2829 bytes
-rwxr-xr-xapp/src/main/res/drawable-mdpi/drawer_shadow.9.pngbin0 -> 142 bytes
-rwxr-xr-xapp/src/main/res/drawable-mdpi/ic_drawer.pngbin0 -> 2820 bytes
-rwxr-xr-xapp/src/main/res/drawable-xhdpi/drawer_shadow.9.pngbin0 -> 174 bytes
-rwxr-xr-xapp/src/main/res/drawable-xhdpi/ic_drawer.pngbin0 -> 2836 bytes
-rwxr-xr-xapp/src/main/res/drawable-xxhdpi/drawer_shadow.9.pngbin0 -> 208 bytes
-rwxr-xr-xapp/src/main/res/drawable-xxhdpi/ic_drawer.pngbin0 -> 202 bytes
-rwxr-xr-xapp/src/main/res/layout/activity_home_screen.xml24
-rwxr-xr-xapp/src/main/res/layout/fragment_home_screen.xml13
-rwxr-xr-xapp/src/main/res/layout/fragment_navigation_drawer.xml7
-rwxr-xr-xapp/src/main/res/layout/item_navigation_drawer.xml29
-rwxr-xr-xapp/src/main/res/layout/separator_navigation_drawer.xml39
-rwxr-xr-xapp/src/main/res/menu/global.xml5
-rwxr-xr-xapp/src/main/res/menu/home_screen.xml7
-rwxr-xr-xapp/src/main/res/values-large/refs.xml4
-rwxr-xr-xapp/src/main/res/values-sw600dp/refs.xml4
-rwxr-xr-x[-rw-r--r--]app/src/main/res/values/dimens.xml4
-rwxr-xr-xapp/src/main/res/values/refs.xml4
-rwxr-xr-xapp/src/main/res/values/strings.xml11
30 files changed, 1157 insertions, 7 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 58a53b3..d572cc5 100755
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -12,11 +12,6 @@
<activity
android:name="org.rssin.android.UnifiedInboxActivity"
android:label="@string/title_activity_unifiedinbox" >
- <intent-filter android:label="@string/app_name" >
- <action android:name="android.intent.action.MAIN" />
-
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
</activity>
<activity
android:name="org.rssin.android.SettingsActivity"
@@ -57,6 +52,15 @@
android:name="org.rssin.android.ArticleActivity"
android:label="@string/title_activity_article" >
</activity>
+ <activity
+ android:name="org.rssin.android.HomeScreenActivity"
+ 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>
</application>
</manifest>
diff --git a/app/src/main/java/org/rssin/android/ArticleActivity.java b/app/src/main/java/org/rssin/android/ArticleActivity.java
index 7d9fa2b..a6bf4d8 100755
--- a/app/src/main/java/org/rssin/android/ArticleActivity.java
+++ b/app/src/main/java/org/rssin/android/ArticleActivity.java
@@ -7,6 +7,7 @@ import android.text.Html;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
+import android.widget.Toast;
import org.rssin.rssin.SortedFeedItemContainer;
import org.rssin.rss.FeedItem;
@@ -71,10 +72,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);
return true;
} else if(id == R.id.article_action_like)
{
+ Toast.makeText(this, "Feedback saved.", Toast.LENGTH_SHORT).show();
container.feedback(Like);
return true;
}
diff --git a/app/src/main/java/org/rssin/android/HomeScreenActivity.java b/app/src/main/java/org/rssin/android/HomeScreenActivity.java
new file mode 100755
index 0000000..082d810
--- /dev/null
+++ b/app/src/main/java/org/rssin/android/HomeScreenActivity.java
@@ -0,0 +1,115 @@
+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.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.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
+ implements NavigationDrawerFragment.NavigationDrawerCallbacks {
+
+ /**
+ * Fragment managing the behaviors, interactions and presentation of the navigation drawer.
+ */
+ private NavigationDrawerFragment mNavigationDrawerFragment;
+
+ /**
+ * Used to store the last screen title. For use in {@link #restoreActionBar()}.
+ */
+ private CharSequence mTitle;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_home_screen);
+
+ mNavigationDrawerFragment = (NavigationDrawerFragment)
+ getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
+
+ // Set up the drawer.
+ mNavigationDrawerFragment.setUp(
+ R.id.navigation_drawer,
+ (DrawerLayout) findViewById(R.id.drawer_layout));
+
+ NavigationDrawerAllFeedsFragment initialFragment = NavigationDrawerAllFeedsFragment.newInstance();
+ FragmentManager fragmentManager = getSupportFragmentManager();
+ fragmentManager.beginTransaction()
+ .replace(R.id.container, initialFragment)
+ .commit();
+ mTitle = "All feeds";
+ }
+
+ @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))
+ .commit();
+ mTitle = mNavigationDrawerFragment.getAdapter().getText(position);
+ }
+ }
+
+ public void restoreActionBar() {
+ ActionBar actionBar = getSupportActionBar();
+ actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
+ actionBar.setDisplayShowTitleEnabled(true);
+ actionBar.setTitle(mTitle);
+ }
+
+ @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);
+ restoreActionBar();
+ return true;
+ }
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // 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);
+ }
+
+ 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
new file mode 100755
index 0000000..f7a1265
--- /dev/null
+++ b/app/src/main/java/org/rssin/android/NavigationDrawerAdapter.java
@@ -0,0 +1,237 @@
+package org.rssin.android;
+
+import android.content.Context;
+import android.database.DataSetObserver;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ListAdapter;
+import android.widget.TextView;
+
+import org.rssin.rssin.Feed;
+import org.rssin.rssin.Filter;
+import org.rssin.rssin.R;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * @author Jos.
+ */
+class NavigationDrawerAdapter implements ListAdapter {
+ private static final int ITEM_VIEW_TYPE_NORMAL = 0;
+ private static final int ITEM_VIEW_TYPE_SEPARATOR = 1;
+ private static final int ITEM_VIEW_TYPE_COUNT = 2;
+ private final List<MenuItem> menuItems = new ArrayList<>();
+
+ public NavigationDrawerAdapter(Context context) throws IOException {
+ menuItems.add(new MenuSection("START"));
+ menuItems.add(new MenuUnifiedInbox());
+ menuItems.add(new MenuSection("FILTERS"));
+
+ for(Filter f : FiltersList.getInstance(context).getFilters())
+ {
+ menuItems.add(new MenuFilterItem(f));
+ }
+
+ menuItems.add(new MenuSection("FEEDS"));
+
+ for(Feed f : FeedsList.getInstance(context).getFeeds())
+ {
+ menuItems.add(new MenuFeedItem(f));
+ }
+ }
+
+ @Override
+ public boolean areAllItemsEnabled() {
+ return false;
+ }
+
+ @Override
+ public boolean isEnabled(int position) {
+ return getItemViewType(position) != ITEM_VIEW_TYPE_SEPARATOR;
+ }
+
+ @Override
+ public void registerDataSetObserver(DataSetObserver observer) {
+
+ }
+
+ @Override
+ public void unregisterDataSetObserver(DataSetObserver observer) {
+
+ }
+
+ @Override
+ public int getCount() {
+ return menuItems.size();
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return menuItems.get(position);
+ }
+
+ public String getText(int position)
+ {
+ return menuItems.get(position).getText();
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public boolean hasStableIds() {
+ return false;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ final int type = getItemViewType(position);
+
+ // First, let's create a new convertView if needed. You can also
+ // create a ViewHolder to speed up changes if you want ;)
+ if (convertView == null) {
+ convertView = LayoutInflater.from(parent.getContext()).inflate(
+ type == ITEM_VIEW_TYPE_SEPARATOR ? R.layout.separator_navigation_drawer : R.layout.item_navigation_drawer, parent, false);
+ }
+
+ // We can now fill the list item view with the appropriate data.
+ if (type == ITEM_VIEW_TYPE_SEPARATOR) {
+ final MenuSection section = (MenuSection) getItem(position);
+ ((TextView) convertView.findViewById(R.id.separator_navigation_drawer_text)).setText(section.getText());
+ } else {
+ final MenuItem video = (MenuItem) getItem(position);
+ ((TextView) convertView.findViewById(R.id.item_navigation_drawer_text)).setText(video.getText());
+ }
+
+ return convertView;
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ return menuItems.get(position).getItemViewType();
+ }
+
+ @Override
+ public int getViewTypeCount() {
+ return ITEM_VIEW_TYPE_COUNT;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return false;
+ }
+
+ public Fragment getFragment(int position) {
+ return menuItems.get(position).getFragment();
+ }
+
+ public MenuItem getTypedItem(int position) {
+ return menuItems.get(position);
+ }
+
+ class MenuItem
+ {
+ protected String text;
+ public MenuItem(String text)
+ {
+ this.text = text;
+ }
+
+ public void invokeActionSettings()
+ {
+
+ }
+
+ public int getItemViewType()
+ {
+ return ITEM_VIEW_TYPE_NORMAL;
+ }
+
+ public Fragment getFragment()
+ {
+ return null;
+ }
+
+ public String getText()
+ {
+ return text;
+ }
+ }
+
+ class MenuUnifiedInbox extends MenuItem
+ {
+ public MenuUnifiedInbox()
+ {
+ super("All feeds");
+ }
+
+ @Override
+ public int getItemViewType() {
+ return ITEM_VIEW_TYPE_NORMAL;
+ }
+
+ @Override
+ public Fragment getFragment() {
+ return NavigationDrawerAllFeedsFragment.newInstance();
+ }
+ }
+
+ class MenuFeedItem extends MenuItem
+ {
+ private Feed feed;
+ public MenuFeedItem(Feed feed)
+ {
+ super(feed.getTitle());
+ this.feed = feed;
+ }
+
+ @Override
+ public int getItemViewType() {
+ return ITEM_VIEW_TYPE_NORMAL;
+ }
+
+ @Override
+ public Fragment getFragment() {
+ return NavigationDrawerFeedFragment.newInstance(feed);
+ }
+ }
+
+ class MenuFilterItem extends MenuItem
+ {
+ private Filter filter;
+ public MenuFilterItem(Filter filter)
+ {
+ super(filter.getTitle());
+ this.filter = filter;
+ }
+
+ @Override
+ public int getItemViewType() {
+ return ITEM_VIEW_TYPE_NORMAL;
+ }
+
+ @Override
+ public Fragment getFragment() {
+ return NavigationDrawerFilterFragment.newInstance(filter);
+ }
+ }
+
+ class MenuSection extends MenuItem
+ {
+ public MenuSection(String text)
+ {
+ super(text);
+ }
+
+ @Override
+ public int getItemViewType() {
+ return ITEM_VIEW_TYPE_SEPARATOR;
+ }
+ }
+}
diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerAllFeedsFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerAllFeedsFragment.java
new file mode 100755
index 0000000..15edbed
--- /dev/null
+++ b/app/src/main/java/org/rssin/android/NavigationDrawerAllFeedsFragment.java
@@ -0,0 +1,87 @@
+package org.rssin.android;
+
+import android.app.Activity;
+import android.content.Context;
+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.View;
+import android.view.ViewGroup;
+
+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 NavigationDrawerAllFeedsFragment extends Fragment {
+ /**
+ * Returns a new instance of this fragment for the given section
+ * number.
+ */
+ public static NavigationDrawerAllFeedsFragment newInstance() {
+ NavigationDrawerAllFeedsFragment fragment = new NavigationDrawerAllFeedsFragment();
+ return fragment;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ final View rootView = inflater.inflate(R.layout.fragment_home_screen, container, false);
+ final RecyclerView mRecyclerView = (RecyclerView) rootView.findViewById(R.id.unified_inbox_feeditems);
+ final Context context = mRecyclerView.getContext();
+ 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}
+ */
+ UnifiedFilterLoader loaderAndSorter = new UnifiedFilterLoader(filtersList.getFilters());
+ loaderAndSorter.getFilteredFeedItems(new VolleyFetcher(context), 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(context, R.string.error_net_load);
+ }
+ });
+ } catch (IOException e) {
+ Frontend.error(context, R.string.error_load_filters, e);
+ }
+
+ return rootView;
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ }
+} \ No newline at end of file
diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerFeedFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerFeedFragment.java
new file mode 100755
index 0000000..fd85fc7
--- /dev/null
+++ b/app/src/main/java/org/rssin/android/NavigationDrawerFeedFragment.java
@@ -0,0 +1,107 @@
+package org.rssin.android;
+
+import android.app.Activity;
+import android.content.Context;
+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.View;
+import android.view.ViewGroup;
+
+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;
+
+/**
+ * @author Jos.
+ */
+
+public class NavigationDrawerFeedFragment extends Fragment {
+ /**
+ * The fragment argument representing the section number for this
+ * fragment.
+ */
+ private static final String ARG_FEED_NAME = "feed_id";
+
+ private Feed feed;
+
+ /**
+ * Returns a new instance of this fragment for the given section
+ * number.
+ */
+ public static NavigationDrawerFeedFragment newInstance(Feed feed) {
+ NavigationDrawerFeedFragment fragment = new NavigationDrawerFeedFragment();
+ Bundle args = new Bundle();
+ args.putInt(ARG_FEED_NAME, feed.hashCode());
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ public NavigationDrawerFeedFragment() {
+
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState)
+ {
+ final Bundle args = getArguments();
+ final View rootView = inflater.inflate(R.layout.fragment_home_screen, container, false);
+ final RecyclerView mRecyclerView = (RecyclerView) rootView.findViewById(R.id.unified_inbox_feeditems);
+ final Context context = mRecyclerView.getContext();
+ RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(context);
+ mRecyclerView.setLayoutManager(mLayoutManager);
+
+ 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));
+ }
+
+ /**
+ * @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<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(context, R.string.error_net_load);
+ }
+ });
+ } catch (IOException e) {
+ Frontend.error(context, R.string.error_load_filters, e);
+ }
+
+ return rootView;
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ }
+}
diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerFilterFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerFilterFragment.java
new file mode 100755
index 0000000..ab9d458
--- /dev/null
+++ b/app/src/main/java/org/rssin/android/NavigationDrawerFilterFragment.java
@@ -0,0 +1,100 @@
+package org.rssin.android;
+
+import android.app.Activity;
+import android.content.Context;
+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.View;
+import android.view.ViewGroup;
+
+import com.android.volley.VolleyError;
+
+import org.rssin.listener.FallibleListener;
+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;
+
+/**
+ * @author Jos.
+ */
+
+public class NavigationDrawerFilterFragment extends Fragment {
+ /**
+ * The fragment argument representing the section number for this
+ * fragment.
+ */
+ private static final String ARG_FILTER_NAME = "filter_id";
+
+ private Filter filter;
+
+ /**
+ * Returns a new instance of this fragment for the given section
+ * number.
+ */
+ public static NavigationDrawerFilterFragment newInstance(Filter filter) {
+ NavigationDrawerFilterFragment fragment = new NavigationDrawerFilterFragment();
+ Bundle args = new Bundle();
+ args.putInt(ARG_FILTER_NAME, filter.hashCode());
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState)
+ {
+ final Bundle args = getArguments();
+ final View rootView = inflater.inflate(R.layout.fragment_home_screen, container, false);
+ final RecyclerView mRecyclerView = (RecyclerView) rootView.findViewById(R.id.unified_inbox_feeditems);
+ final Context context = mRecyclerView.getContext();
+ RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(context);
+ mRecyclerView.setLayoutManager(mLayoutManager);
+
+
+ try {
+ filter = FiltersList.getInstance(mRecyclerView.getContext()).getFilterFromHashCode(args.getInt(ARG_FILTER_NAME));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ 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(filter);
+ loaderAndSorter.getFilteredFeedItems(new VolleyFetcher(context), 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(context, R.string.error_net_load);
+ }
+ });
+
+ return rootView;
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ }
+}
diff --git a/app/src/main/java/org/rssin/android/NavigationDrawerFragment.java b/app/src/main/java/org/rssin/android/NavigationDrawerFragment.java
new file mode 100755
index 0000000..537e0f8
--- /dev/null
+++ b/app/src/main/java/org/rssin/android/NavigationDrawerFragment.java
@@ -0,0 +1,293 @@
+package org.rssin.android;
+
+import android.database.DataSetObserver;
+import android.support.v7.app.ActionBarActivity;
+import android.app.Activity;
+import android.support.v7.app.ActionBar;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.ActionBarDrawerToggle;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.widget.DrawerLayout;
+import android.content.SharedPreferences;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import org.rssin.rssin.R;
+
+import java.io.IOException;
+
+/**
+ * Fragment used for managing interactions for and presentation of a navigation drawer.
+ * See the <a href="https://developer.android.com/design/patterns/navigation-drawer.html#Interaction">
+ * design guidelines</a> for a complete explanation of the behaviors implemented here.
+ */
+public class NavigationDrawerFragment extends Fragment {
+
+ /**
+ * Remember the position of the selected item.
+ */
+ private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position";
+
+ /**
+ * Per the design guidelines, you should show the drawer on launch until the user manually
+ * expands it. This shared preference tracks this.
+ */
+ private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned";
+
+ /**
+ * A pointer to the current callbacks instance (the Activity).
+ */
+ private NavigationDrawerCallbacks mCallbacks;
+
+ /**
+ * Helper component that ties the action bar to the navigation drawer.
+ */
+ private ActionBarDrawerToggle mDrawerToggle;
+
+ private DrawerLayout mDrawerLayout;
+ private ListView mDrawerListView;
+ private View mFragmentContainerView;
+
+ private int mCurrentSelectedPosition = 1;
+ private boolean mFromSavedInstanceState;
+ private boolean mUserLearnedDrawer;
+ private NavigationDrawerAdapter adapter;
+
+ public NavigationDrawerFragment() {
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Read in the flag indicating whether or not the user has demonstrated awareness of the
+ // drawer. See PREF_USER_LEARNED_DRAWER for details.
+ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
+ mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false);
+
+ if (savedInstanceState != null) {
+ mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION);
+ mFromSavedInstanceState = true;
+ }
+
+ // Select either the default item (0) or the last selected item.
+ selectItem(mCurrentSelectedPosition);
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ // Indicate that this fragment would like to influence the set of actions in the action bar.
+ setHasOptionsMenu(true);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ mDrawerListView = (ListView) inflater.inflate(
+ R.layout.fragment_navigation_drawer, container, false);
+ mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ selectItem(position);
+ }
+ });
+
+ try {
+ adapter = new NavigationDrawerAdapter(mDrawerListView.getContext());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ mDrawerListView.setAdapter(adapter);
+ mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
+ return mDrawerListView;
+ }
+
+ public boolean isDrawerOpen() {
+ return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(mFragmentContainerView);
+ }
+
+ /**
+ * Users of this fragment must call this method to set up the navigation drawer interactions.
+ *
+ * @param fragmentId The android:id of this fragment in its activity's layout.
+ * @param drawerLayout The DrawerLayout containing this fragment's UI.
+ */
+ public void setUp(int fragmentId, DrawerLayout drawerLayout) {
+ mFragmentContainerView = getActivity().findViewById(fragmentId);
+ mDrawerLayout = drawerLayout;
+
+ // set a custom shadow that overlays the main content when the drawer opens
+ mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
+ // set up the drawer's list view with items and click listener
+
+ ActionBar actionBar = getActionBar();
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setHomeButtonEnabled(true);
+
+ // ActionBarDrawerToggle ties together the the proper interactions
+ // between the navigation drawer and the action bar app icon.
+ mDrawerToggle = new ActionBarDrawerToggle(
+ getActivity(), /* host Activity */
+ mDrawerLayout, /* DrawerLayout object */
+ R.drawable.ic_drawer, /* 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 */
+ ) {
+ @Override
+ public void onDrawerClosed(View drawerView) {
+ super.onDrawerClosed(drawerView);
+ if (!isAdded()) {
+ return;
+ }
+
+ getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu()
+ }
+
+ @Override
+ public void onDrawerOpened(View drawerView) {
+ super.onDrawerOpened(drawerView);
+ if (!isAdded()) {
+ return;
+ }
+
+ if (!mUserLearnedDrawer) {
+ // The user manually opened the drawer; store this flag to prevent auto-showing
+ // the navigation drawer automatically in the future.
+ mUserLearnedDrawer = true;
+ SharedPreferences sp = PreferenceManager
+ .getDefaultSharedPreferences(getActivity());
+ sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply();
+ }
+
+ getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu()
+ }
+ };
+
+ // If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer,
+ // per the navigation drawer design guidelines.
+ if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
+ mDrawerLayout.openDrawer(mFragmentContainerView);
+ }
+
+ // Defer code dependent on restoration of previous instance state.
+ mDrawerLayout.post(new Runnable() {
+ @Override
+ public void run() {
+ mDrawerToggle.syncState();
+ }
+ });
+
+ mDrawerLayout.setDrawerListener(mDrawerToggle);
+ }
+
+ private void selectItem(int position) {
+ mCurrentSelectedPosition = position;
+ if (mDrawerListView != null) {
+ mDrawerListView.setItemChecked(position, true);
+ }
+ if (mDrawerLayout != null) {
+ mDrawerLayout.closeDrawer(mFragmentContainerView);
+ }
+ if (mCallbacks != null) {
+ mCallbacks.onNavigationDrawerItemSelected(position);
+ }
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ try {
+ mCallbacks = (NavigationDrawerCallbacks) activity;
+ } catch (ClassCastException e) {
+ throw new ClassCastException("Activity must implement NavigationDrawerCallbacks.");
+ }
+ }
+
+ @Override
+ public void onDetach() {
+ super.onDetach();
+ mCallbacks = null;
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition);
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ // Forward the new configuration the drawer toggle component.
+ mDrawerToggle.onConfigurationChanged(newConfig);
+ }
+
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ // If the drawer is open, show the global app actions in the action bar. See also
+ // showGlobalContextActionBar, which controls the top-left area of the action bar.
+ if (mDrawerLayout != null && isDrawerOpen()) {
+ inflater.inflate(R.menu.global, menu);
+ showGlobalContextActionBar();
+ }
+ super.onCreateOptionsMenu(menu, inflater);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (mDrawerToggle.onOptionsItemSelected(item)) {
+ return true;
+ }
+
+ if (item.getItemId() == R.id.action_settings) {
+ adapter.getTypedItem(mCurrentSelectedPosition).invokeActionSettings();
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ /**
+ * 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.
+ */
+ private void showGlobalContextActionBar() {
+ ActionBar actionBar = getActionBar();
+ actionBar.setDisplayShowTitleEnabled(true);
+ actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
+ actionBar.setTitle(R.string.app_name);
+ }
+
+ private ActionBar getActionBar() {
+ return ((ActionBarActivity) getActivity()).getSupportActionBar();
+ }
+
+ public NavigationDrawerAdapter getAdapter() {
+ return adapter;
+ }
+
+ /**
+ * Callbacks interface that all activities using this fragment must implement.
+ */
+ public static interface NavigationDrawerCallbacks {
+ /**
+ * Called when an item in the navigation drawer is selected.
+ */
+ void onNavigationDrawerItemSelected(int position);
+ }
+}
diff --git a/app/src/main/java/org/rssin/rssin/SortedFeedItemContainer.java b/app/src/main/java/org/rssin/rssin/SortedFeedItemContainer.java
index d46cf3b..913a120 100755
--- a/app/src/main/java/org/rssin/rssin/SortedFeedItemContainer.java
+++ b/app/src/main/java/org/rssin/rssin/SortedFeedItemContainer.java
@@ -53,6 +53,6 @@ public class SortedFeedItemContainer implements Comparable<SortedFeedItemContain
@Override
public int compareTo(SortedFeedItemContainer another) {
- return (int)(another.getScore() - this.getScore());
+ return (int)(this.getScore() - another.getScore());
}
}
diff --git a/app/src/main/java/org/rssin/rssin/dummy/DummyContent.java b/app/src/main/java/org/rssin/rssin/dummy/DummyContent.java
new file mode 100755
index 0000000..059f859
--- /dev/null
+++ b/app/src/main/java/org/rssin/rssin/dummy/DummyContent.java
@@ -0,0 +1,55 @@
+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.
+ * <p/>
+ * TODO: Replace all uses of this class before publishing your app.
+ */
+public class DummyContent {
+
+ /**
+ * An array of sample (dummy) items.
+ */
+ public static List<DummyItem> ITEMS = new ArrayList<DummyItem>();
+
+ /**
+ * A map of sample (dummy) items, by ID.
+ */
+ public static Map<String, DummyItem> ITEM_MAP = new HashMap<String, DummyItem>();
+
+ 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;
+ }
+ }
+}
diff --git a/app/src/main/res/drawable-hdpi/drawer_shadow.9.png b/app/src/main/res/drawable-hdpi/drawer_shadow.9.png
new file mode 100755
index 0000000..236bff5
--- /dev/null
+++ b/app/src/main/res/drawable-hdpi/drawer_shadow.9.png
Binary files differ
diff --git a/app/src/main/res/drawable-hdpi/ic_drawer.png b/app/src/main/res/drawable-hdpi/ic_drawer.png
new file mode 100755
index 0000000..c59f601
--- /dev/null
+++ b/app/src/main/res/drawable-hdpi/ic_drawer.png
Binary files differ
diff --git a/app/src/main/res/drawable-mdpi/drawer_shadow.9.png b/app/src/main/res/drawable-mdpi/drawer_shadow.9.png
new file mode 100755
index 0000000..ffe3a28
--- /dev/null
+++ b/app/src/main/res/drawable-mdpi/drawer_shadow.9.png
Binary files differ
diff --git a/app/src/main/res/drawable-mdpi/ic_drawer.png b/app/src/main/res/drawable-mdpi/ic_drawer.png
new file mode 100755
index 0000000..1ed2c56
--- /dev/null
+++ b/app/src/main/res/drawable-mdpi/ic_drawer.png
Binary files differ
diff --git a/app/src/main/res/drawable-xhdpi/drawer_shadow.9.png b/app/src/main/res/drawable-xhdpi/drawer_shadow.9.png
new file mode 100755
index 0000000..fabe9d9
--- /dev/null
+++ b/app/src/main/res/drawable-xhdpi/drawer_shadow.9.png
Binary files differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_drawer.png b/app/src/main/res/drawable-xhdpi/ic_drawer.png
new file mode 100755
index 0000000..a5fa74d
--- /dev/null
+++ b/app/src/main/res/drawable-xhdpi/ic_drawer.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxhdpi/drawer_shadow.9.png b/app/src/main/res/drawable-xxhdpi/drawer_shadow.9.png
new file mode 100755
index 0000000..b91e9d7
--- /dev/null
+++ b/app/src/main/res/drawable-xxhdpi/drawer_shadow.9.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_drawer.png b/app/src/main/res/drawable-xxhdpi/ic_drawer.png
new file mode 100755
index 0000000..9c4685d
--- /dev/null
+++ b/app/src/main/res/drawable-xxhdpi/ic_drawer.png
Binary files differ
diff --git a/app/src/main/res/layout/activity_home_screen.xml b/app/src/main/res/layout/activity_home_screen.xml
new file mode 100755
index 0000000..f6fcc0c
--- /dev/null
+++ b/app/src/main/res/layout/activity_home_screen.xml
@@ -0,0 +1,24 @@
+<!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. -->
+<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout"
+ android:layout_width="match_parent" android:layout_height="match_parent"
+ tools:context="org.rssin.android.HomeScreenActivity">
+
+ <!-- As the main content view, the view below consumes the entire
+ space available using match_parent in both dimensions. -->
+ <FrameLayout android:id="@+id/container" android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <!-- android:layout_gravity="start" tells DrawerLayout to treat
+ this as a sliding drawer on the left side for left-to-right
+ languages and on the right side for right-to-left languages.
+ If you're not building against API 17 or higher, use
+ android:layout_gravity="left" instead. -->
+ <!-- The drawer is given a fixed width in dp and extends the full height of
+ the container. -->
+ <fragment android:id="@+id/navigation_drawer"
+ android:layout_width="@dimen/navigation_drawer_width" android:layout_height="match_parent"
+ android:layout_gravity="start" android:name="org.rssin.android.NavigationDrawerFragment"
+ tools:layout="@layout/fragment_navigation_drawer" />
+
+</android.support.v4.widget.DrawerLayout>
diff --git a/app/src/main/res/layout/fragment_home_screen.xml b/app/src/main/res/layout/fragment_home_screen.xml
new file mode 100755
index 0000000..e33a34e
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home_screen.xml
@@ -0,0 +1,13 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ 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">
+
+ <android.support.v7.widget.RecyclerView
+ android:id="@+id/unified_inbox_feeditems"
+ android:scrollbars="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"/>
+
+</RelativeLayout>
diff --git a/app/src/main/res/layout/fragment_navigation_drawer.xml b/app/src/main/res/layout/fragment_navigation_drawer.xml
new file mode 100755
index 0000000..6b9ec1d
--- /dev/null
+++ b/app/src/main/res/layout/fragment_navigation_drawer.xml
@@ -0,0 +1,7 @@
+<ListView xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:choiceMode="singleChoice"
+ android:divider="@android:color/transparent" android:dividerHeight="0dp"
+ android:background="#cccc" 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
new file mode 100755
index 0000000..32a8837
--- /dev/null
+++ b/app/src/main/res/layout/item_navigation_drawer.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/itemLayout"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentLeft="true"
+ android:orientation="vertical"
+
+ android:layout_marginTop="0dp"
+ android:background="?android:attr/activatedBackgroundIndicator"
+ >
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="55dp"
+ >
+
+ <TextView
+ android:id="@+id/item_navigation_drawer_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ />
+ </LinearLayout>
+
+</LinearLayout> \ No newline at end of file
diff --git a/app/src/main/res/layout/separator_navigation_drawer.xml b/app/src/main/res/layout/separator_navigation_drawer.xml
new file mode 100755
index 0000000..856093c
--- /dev/null
+++ b/app/src/main/res/layout/separator_navigation_drawer.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+xmlns:android="http://schemas.android.com/apk/res/android"
+android:id="@+id/itemLayout"
+android:layout_width="fill_parent"
+android:layout_height="wrap_content"
+android:layout_alignParentLeft="true"
+android:orientation="vertical"
+android:layout_marginTop="0dp"
+android:background="?android:attr/activatedBackgroundIndicator"
+ >
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="35dp"
+ >
+
+ <TextView
+ android:id="@+id/separator_navigation_drawer_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="4dp"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ />
+ </LinearLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_marginBottom="0dp"
+ android:layout_marginTop="1dp"
+ android:layout_marginLeft="0dp"
+ android:layout_marginRight="0dp"
+ android:background="#DADADC"
+
+ ></View>
+
+</LinearLayout> \ No newline at end of file
diff --git a/app/src/main/res/menu/global.xml b/app/src/main/res/menu/global.xml
new file mode 100755
index 0000000..fc41e98
--- /dev/null
+++ b/app/src/main/res/menu/global.xml
@@ -0,0 +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>
diff --git a/app/src/main/res/menu/home_screen.xml b/app/src/main/res/menu/home_screen.xml
new file mode 100755
index 0000000..3358601
--- /dev/null
+++ b/app/src/main/res/menu/home_screen.xml
@@ -0,0 +1,7 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ 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" />
+</menu>
diff --git a/app/src/main/res/values-large/refs.xml b/app/src/main/res/values-large/refs.xml
new file mode 100755
index 0000000..d152eb1
--- /dev/null
+++ b/app/src/main/res/values-large/refs.xml
@@ -0,0 +1,4 @@
+<resources>
+
+
+</resources> \ No newline at end of file
diff --git a/app/src/main/res/values-sw600dp/refs.xml b/app/src/main/res/values-sw600dp/refs.xml
new file mode 100755
index 0000000..d152eb1
--- /dev/null
+++ b/app/src/main/res/values-sw600dp/refs.xml
@@ -0,0 +1,4 @@
+<resources>
+
+
+</resources> \ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 0121f92..512350a 100644..100755
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -9,4 +9,8 @@
<dimen name="font_size_large">20sp</dimen>
<dimen name="font_size_normal">16sp</dimen>
<dimen name="font_size_small">14sp</dimen>
+
+ <!-- Per the design guidelines, navigation drawers should be between 240dp and 320dp:
+ https://developer.android.com/design/patterns/navigation-drawer.html -->
+ <dimen name="navigation_drawer_width">240dp</dimen>
</resources>
diff --git a/app/src/main/res/values/refs.xml b/app/src/main/res/values/refs.xml
new file mode 100755
index 0000000..d152eb1
--- /dev/null
+++ b/app/src/main/res/values/refs.xml
@@ -0,0 +1,4 @@
+<resources>
+
+
+</resources> \ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5b051c8..83cda21 100755
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -48,10 +48,19 @@
<string name="article_action_dislike">Dislike</string>
<string name="article_action_like">Like</string>
+ <string name="title_activity_home_screen">HomeScreenActivity</string>
+
+ <string name="title_section1">Section 1</string>
+ <string name="title_section2">Section 2</string>
+ <string name="title_section3">Section 3</string>
+
+ <string name="navigation_drawer_open">Open navigation drawer</string>
+ <string name="navigation_drawer_close">Close navigation drawer</string>
+
+ <string name="action_example">Example action</string>
<string name="article_author">Written by:</string>
<string name="article_author_unknown">Unknown author</string>
<string name="article_published_on">Published on:</string>
<string name="article_published_on_unknown"/>
-
</resources>