From 507456a32bfa3983e4264db3138e23cc3e410758 Mon Sep 17 00:00:00 2001 From: Tunous Date: Wed, 12 Apr 2017 22:40:41 +0200 Subject: [PATCH] Add "Starred repositories" to navigation drawer Closes #388. --- res/menu/home_nav_drawer.xml | 4 +++ res/values/arrays.xml | 2 ++ res/values/strings.xml | 1 + .../activities/RepositoryListActivity.java | 2 +- .../gh4a/activities/home/HomeActivity.java | 5 ++- .../activities/home/RepositoryFactory.java | 31 +++++++++++++---- .../RepositoryListContainerFragment.java | 34 ++++++++++++++----- ...tarredRepositoryListContainerFragment.java | 15 ++++++++ 8 files changed, 76 insertions(+), 18 deletions(-) create mode 100644 src/com/gh4a/fragment/StarredRepositoryListContainerFragment.java diff --git a/res/menu/home_nav_drawer.xml b/res/menu/home_nav_drawer.xml index 4f62a74ba..e01f6a182 100644 --- a/res/menu/home_nav_drawer.xml +++ b/res/menu/home_nav_drawer.xml @@ -41,6 +41,10 @@ android:id="@+id/bookmarks" android:title="@string/bookmarks" android:icon="@drawable/icon_bookmark" /> + @string/my_gists @string/search @string/bookmarks + @string/starred_repositories @string/pub_timeline @string/trend @string/blog @@ -32,6 +33,7 @@ gists search bookmarks + stars timeline trends blog diff --git a/res/values/strings.xml b/res/values/strings.xml index 3dbea9624..af3ce7235 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -103,6 +103,7 @@ Mentioned Participating My repositories + Starred repositories My issues My pull requests My gists diff --git a/src/com/gh4a/activities/RepositoryListActivity.java b/src/com/gh4a/activities/RepositoryListActivity.java index b57b43b2b..a6871df4b 100644 --- a/src/com/gh4a/activities/RepositoryListActivity.java +++ b/src/com/gh4a/activities/RepositoryListActivity.java @@ -63,7 +63,7 @@ protected void onInitExtras(Bundle extras) { mFilterDrawerHelper = RepositoryListContainerFragment.FilterDrawerHelper.create( mUserLogin, mUserIsOrg); - mSortDrawerHelper = new RepositoryListContainerFragment.SortDrawerHelper(); + mSortDrawerHelper = new RepositoryListContainerFragment.SortDrawerHelper(false); } @Override diff --git a/src/com/gh4a/activities/home/HomeActivity.java b/src/com/gh4a/activities/home/HomeActivity.java index 3afd4e4c1..38f2e1d9b 100644 --- a/src/com/gh4a/activities/home/HomeActivity.java +++ b/src/com/gh4a/activities/home/HomeActivity.java @@ -68,6 +68,7 @@ public class HomeActivity extends BasePagerActivity implements START_PAGE_MAPPING.put(R.id.blog, "blog"); START_PAGE_MAPPING.put(R.id.bookmarks, "bookmarks"); START_PAGE_MAPPING.put(R.id.search, "search"); + START_PAGE_MAPPING.put(R.id.starred_repos, "stars"); } private final LoaderCallbacks mUserCallback = new LoaderCallbacks(this) { @@ -237,7 +238,7 @@ private FragmentFactory getFactoryForItem(int id) { case R.id.notifications: return new NotificationListFactory(this); case R.id.my_repos: - return new RepositoryFactory(this, mUserLogin, getPrefs()); + return new RepositoryFactory(this, mUserLogin, getPrefs(), false); case R.id.my_issues: return new IssueListFactory(this, mUserLogin, false); case R.id.my_prs: @@ -248,6 +249,8 @@ private FragmentFactory getFactoryForItem(int id) { return new SearchFactory(this); case R.id.bookmarks: return new BookmarkFactory(this); + case R.id.starred_repos: + return new RepositoryFactory(this, mUserLogin, getPrefs(), true); case R.id.pub_timeline: return new TimelineFactory(this); case R.id.blog: diff --git a/src/com/gh4a/activities/home/RepositoryFactory.java b/src/com/gh4a/activities/home/RepositoryFactory.java index 5bf87ee78..53c9b5c53 100644 --- a/src/com/gh4a/activities/home/RepositoryFactory.java +++ b/src/com/gh4a/activities/home/RepositoryFactory.java @@ -9,10 +9,14 @@ import com.gh4a.R; import com.gh4a.fragment.RepositoryListContainerFragment; +import com.gh4a.fragment.StarredRepositoryListContainerFragment; public class RepositoryFactory extends FragmentFactory { private static final int[] TAB_TITLES = new int[] { - R.string.my_repositories + R.string.my_repositories + }; + private static final int[] STARRED_TAB_TITLES = new int[] { + R.string.starred_repositories }; private final String mUserLogin; @@ -20,40 +24,50 @@ public class RepositoryFactory extends FragmentFactory { private final RepositoryListContainerFragment.SortDrawerHelper mSortDrawerHelper; private RepositoryListContainerFragment mFragment; private final SharedPreferences mPrefs; + private final boolean mOnlyStarred; private static final String STATE_KEY_FRAGMENT = "repoFactoryFragment"; private static final String PREF_KEY_FILTER = "home_repo_list_filter"; private static final String PREF_KEY_SORT_ORDER = "home_repo_list_sort_order"; private static final String PREF_KEY_SORT_DIR = "home_repo_list_sort_dir"; - public RepositoryFactory(HomeActivity activity, String userLogin, SharedPreferences prefs) { + public RepositoryFactory(HomeActivity activity, String userLogin, SharedPreferences prefs, + boolean onlyStarred) { super(activity); mUserLogin = userLogin; + mOnlyStarred = onlyStarred; mFilterDrawerHelper = RepositoryListContainerFragment.FilterDrawerHelper.create(mUserLogin, false); - mSortDrawerHelper = new RepositoryListContainerFragment.SortDrawerHelper(); + mSortDrawerHelper = new RepositoryListContainerFragment.SortDrawerHelper(mOnlyStarred); mPrefs = prefs; } @Override protected @StringRes int getTitleResId() { - return R.string.my_repositories; + return getTabTitleResIds()[0]; } @Override protected int[] getTabTitleResIds() { - return TAB_TITLES; + return mOnlyStarred ? STARRED_TAB_TITLES : TAB_TITLES; } @Override protected int[] getToolDrawerMenuResIds() { int sortMenuResId = mSortDrawerHelper.getMenuResId(); + + if (mOnlyStarred) { + if (sortMenuResId == 0) { + return new int[] {}; + } + return new int[] { sortMenuResId }; + } + int filterMenuResId = mFilterDrawerHelper.getMenuResId(); if (sortMenuResId == 0) { return new int[] { filterMenuResId }; - } else { - return new int[] { sortMenuResId, filterMenuResId }; } + return new int[] { sortMenuResId, filterMenuResId }; } @Override @@ -118,6 +132,9 @@ protected void onRestoreInstanceState(Bundle state) { @Override protected Fragment makeFragment(int position) { + if (mOnlyStarred) { + return StarredRepositoryListContainerFragment.newInstance(mUserLogin, false); + } return RepositoryListContainerFragment.newInstance(mUserLogin, false); } diff --git a/src/com/gh4a/fragment/RepositoryListContainerFragment.java b/src/com/gh4a/fragment/RepositoryListContainerFragment.java index 3ea2f8479..59fe71a5d 100644 --- a/src/com/gh4a/fragment/RepositoryListContainerFragment.java +++ b/src/com/gh4a/fragment/RepositoryListContainerFragment.java @@ -31,18 +31,20 @@ public class RepositoryListContainerFragment extends Fragment implements MenuItemCompat.OnActionExpandListener, SwipeRefreshLayout.ChildScrollDelegate { public static RepositoryListContainerFragment newInstance(String userLogin, boolean isOrg) { RepositoryListContainerFragment f = new RepositoryListContainerFragment(); - Bundle args = new Bundle(); + f.setArguments(createArgs(userLogin, isOrg)); + return f; + } + protected static Bundle createArgs(String userLogin, boolean isOrg) { + Bundle args = new Bundle(); args.putString("user", userLogin); args.putBoolean("is_org", isOrg); - f.setArguments(args); - - return f; + return args; } private String mUserLogin; private boolean mIsOrg; - private String mFilterType = "all"; + private String mFilterType = displayOnlyStarredRepos() ? "starred" : "all"; private String mSortOrder = "full_name"; private String mSortDirection = "asc"; private boolean mSearchVisible; @@ -69,7 +71,8 @@ public void onCreate(Bundle savedInstanceState) { mIsOrg = data.getBoolean("is_org"); if (savedInstanceState != null && savedInstanceState.containsKey(STATE_KEY_FILTER_TYPE)) { - mFilterType = savedInstanceState.getString(STATE_KEY_FILTER_TYPE); + mFilterType = displayOnlyStarredRepos() + ? "starred" : savedInstanceState.getString(STATE_KEY_FILTER_TYPE); mSortOrder = savedInstanceState.getString(STATE_KEY_SORT_ORDER); mSortDirection = savedInstanceState.getString(STATE_KEY_SORT_DIRECTION); mSearchVisible = savedInstanceState.getBoolean(STATE_KEY_SEARCH_VISIBLE); @@ -140,6 +143,10 @@ public void onSaveInstanceState(Bundle outState) { } public void setFilterType(String type) { + if (displayOnlyStarredRepos()) { + return; + } + if (!TextUtils.equals(type, mFilterType)) { mFilterType = type; applyFilterTypeAndSortOrder(); @@ -155,6 +162,10 @@ public void setSortOrder(String sortOrder, String direction) { } } + protected boolean displayOnlyStarredRepos() { + return false; + } + private void validateSortOrder() { if (TextUtils.equals(mFilterType, "starred")) { if (!TextUtils.equals(mSortOrder, "updated") @@ -393,7 +404,8 @@ public String handleSelectionAndGetFilterType(MenuItem item) { } public static class SortDrawerHelper { - private String mFilterType = "all"; + private final boolean mOnlyStarredRepos; + private String mFilterType; private static final SparseArray SORT_LOOKUP = new SparseArray<>(); static { @@ -407,11 +419,15 @@ public static class SortDrawerHelper { SORT_LOOKUP.put(R.id.sort_updated_desc, new String[] { "updated", "desc" }); } - public SortDrawerHelper() { + public SortDrawerHelper(boolean onlyStarredRepos) { + mOnlyStarredRepos = onlyStarredRepos; + mFilterType = mOnlyStarredRepos ? "starred" : "all"; } public void setFilterType(String type) { - mFilterType = type; + if (!mOnlyStarredRepos) { + mFilterType = type; + } } public int getMenuResId() { diff --git a/src/com/gh4a/fragment/StarredRepositoryListContainerFragment.java b/src/com/gh4a/fragment/StarredRepositoryListContainerFragment.java new file mode 100644 index 000000000..9fde9e3bb --- /dev/null +++ b/src/com/gh4a/fragment/StarredRepositoryListContainerFragment.java @@ -0,0 +1,15 @@ +package com.gh4a.fragment; + +public class StarredRepositoryListContainerFragment extends RepositoryListContainerFragment { + public static StarredRepositoryListContainerFragment newInstance(String userLogin, + boolean isOrg) { + StarredRepositoryListContainerFragment f = new StarredRepositoryListContainerFragment(); + f.setArguments(createArgs(userLogin, isOrg)); + return f; + } + + @Override + protected boolean displayOnlyStarredRepos() { + return true; + } +} \ No newline at end of file