diff --git a/src/main/java/org/quantumbadger/redreader/activities/MainActivity.java b/src/main/java/org/quantumbadger/redreader/activities/MainActivity.java index 29d0107fc..b1c6c373e 100644 --- a/src/main/java/org/quantumbadger/redreader/activities/MainActivity.java +++ b/src/main/java/org/quantumbadger/redreader/activities/MainActivity.java @@ -216,9 +216,13 @@ && getIntent().getAction().equals(Intent.ACTION_MAIN)) { doRefresh(RefreshableFragment.MAIN_RELAYOUT, false, null); - if(savedInstanceState == null - && PrefsUtility.pref_behaviour_skiptofrontpage()) { - onSelected(SubredditPostListURL.getFrontPage()); + if(savedInstanceState == null) { + if(PrefsUtility.pref_behaviour_skiptopinned() && + !PrefsUtility.pref_pinned_subreddits_is_empty()) { + onSelected(SubredditPostListURL.getPinned()); + } else if(PrefsUtility.pref_behaviour_skiptofrontpage()) { + onSelected(SubredditPostListURL.getFrontPage()); + } } } @@ -467,7 +471,12 @@ public void onNothingSelected(final AdapterView adapterView) { case MainMenuFragment.MENU_MENU_ACTION_FIND_SUBREDDIT: { startActivity(new Intent(this, SubredditSearchActivity.class)); + break; } + + case MainMenuFragment.MENU_MENU_ACTION_PINNED: + onSelected(SubredditPostListURL.getPinned()); + break; } } diff --git a/src/main/java/org/quantumbadger/redreader/adapters/MainMenuListingManager.java b/src/main/java/org/quantumbadger/redreader/adapters/MainMenuListingManager.java index 098413c61..84f0a6a43 100644 --- a/src/main/java/org/quantumbadger/redreader/adapters/MainMenuListingManager.java +++ b/src/main/java/org/quantumbadger/redreader/adapters/MainMenuListingManager.java @@ -218,6 +218,17 @@ public MainMenuListingManager( false)); } + if(mainMenuShortcutItems.contains(MainMenuFragment.MainMenuShortcutItems.PINNED) && + !PrefsUtility.pref_pinned_subreddits_is_empty()) { + mAdapter.appendToGroup( + GROUP_MAIN_ITEMS, + makeItem( + R.string.mainmenu_pinned, + MainMenuFragment.MENU_MENU_ACTION_PINNED, + null, + false)); + } + if(mainMenuShortcutItems.contains( MainMenuFragment.MainMenuShortcutItems.SUBREDDIT_SEARCH)) { @@ -456,25 +467,17 @@ public MainMenuListingManager( private void setPinnedSubreddits() { final List pinnedSubreddits - = PrefsUtility.pref_pinned_subreddits(); + = PrefsUtility.pref_pinned_subreddits(true); mAdapter.removeAllFromGroup(GROUP_PINNED_SUBREDDITS_ITEMS); mAdapter.removeAllFromGroup(GROUP_PINNED_SUBREDDITS_HEADER); if(!pinnedSubreddits.isEmpty()) { - - final PrefsUtility.PinnedSubredditSort pinnedSubredditsSort - = PrefsUtility.pref_behaviour_pinned_subredditsort(); - mAdapter.appendToGroup( GROUP_PINNED_SUBREDDITS_HEADER, new GroupedRecyclerViewItemListSectionHeaderView( mActivity.getString(R.string.mainmenu_header_subreddits_pinned))); - if(pinnedSubredditsSort == PrefsUtility.PinnedSubredditSort.NAME) { - Collections.sort(pinnedSubreddits); - } - boolean isFirst = true; for(final SubredditCanonicalId sr : pinnedSubreddits) { diff --git a/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java b/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java index c47ce987d..01e18e999 100644 --- a/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java +++ b/src/main/java/org/quantumbadger/redreader/common/PrefsUtility.java @@ -31,6 +31,7 @@ import org.quantumbadger.redreader.R; import org.quantumbadger.redreader.activities.OptionsMenuUtility; import org.quantumbadger.redreader.adapters.MainMenuListingManager; +import org.quantumbadger.redreader.common.collections.CollectionStream; import org.quantumbadger.redreader.common.time.TimeDuration; import org.quantumbadger.redreader.fragments.MainMenuFragment; import org.quantumbadger.redreader.io.WritableHashSet; @@ -45,6 +46,7 @@ import java.io.File; import java.util.ArrayList; +import java.util.Collections; import java.util.EnumMap; import java.util.EnumSet; import java.util.HashMap; @@ -766,6 +768,12 @@ public static boolean pref_behaviour_skiptofrontpage() { false); } + public static boolean pref_behaviour_skiptopinned() { + return getBoolean( + R.string.pref_behaviour_skiptopinned_key, + false); + } + public static boolean pref_behaviour_useinternalbrowser() { return getBoolean( R.string.pref_behaviour_useinternalbrowser_key, @@ -1603,8 +1611,27 @@ public static boolean pref_menus_quick_account_switcher() { // pref_pinned_subreddits /////////////////////////////// - public static List pref_pinned_subreddits() { - return pref_subreddits_list(R.string.pref_pinned_subreddits_key); + public static List pref_pinned_subreddits(final boolean sort) { + final List list + = pref_subreddits_list(R.string.pref_pinned_subreddits_key); + if(sort) { + final PinnedSubredditSort pinnedSubredditsSort = pref_behaviour_pinned_subredditsort(); + if(pinnedSubredditsSort == PinnedSubredditSort.NAME) { + Collections.sort(list); + } + } + return list; + } + + public static String pref_pinned_subreddits_multireddit() { + final List pinnedSubreddits = new CollectionStream<>(pref_pinned_subreddits(true)) + .map(SubredditCanonicalId::getDisplayNameLowercase) + .collect(new ArrayList<>()); + return StringUtils.join(pinnedSubreddits, "+"); + } + + public static boolean pref_pinned_subreddits_is_empty() { + return pref_subreddits_is_empty(R.string.pref_pinned_subreddits_key); } public static void pref_pinned_subreddits_add( @@ -1637,7 +1664,7 @@ public static void pref_pinned_subreddits_remove( public static boolean pref_pinned_subreddits_check(final SubredditCanonicalId id) { - return pref_pinned_subreddits().contains(id); + return pref_pinned_subreddits(false).contains(id); } /////////////////////////////// @@ -1740,6 +1767,11 @@ public static List pref_subreddits_list(final int prefId) return result; } + public static boolean pref_subreddits_is_empty(final int prefId) { + final String value = getString(prefId, ""); + return value.isEmpty(); + } + public static boolean pref_accessibility_separate_body_text_lines() { return getBoolean( R.string.pref_accessibility_separate_body_text_lines_key, diff --git a/src/main/java/org/quantumbadger/redreader/fragments/MainMenuFragment.java b/src/main/java/org/quantumbadger/redreader/fragments/MainMenuFragment.java index 67fc468ca..d8462f965 100644 --- a/src/main/java/org/quantumbadger/redreader/fragments/MainMenuFragment.java +++ b/src/main/java/org/quantumbadger/redreader/fragments/MainMenuFragment.java @@ -70,6 +70,7 @@ public class MainMenuFragment extends RRFragment implements public static final int MENU_MENU_ACTION_POPULAR = 12; public static final int MENU_MENU_ACTION_SENT_MESSAGES = 13; public static final int MENU_MENU_ACTION_FIND_SUBREDDIT = 14; + public static final int MENU_MENU_ACTION_PINNED = 15; @IntDef({ MENU_MENU_ACTION_FRONTPAGE, @@ -86,7 +87,8 @@ public class MainMenuFragment extends RRFragment implements MENU_MENU_ACTION_ALL, MENU_MENU_ACTION_POPULAR, MENU_MENU_ACTION_SENT_MESSAGES, - MENU_MENU_ACTION_FIND_SUBREDDIT}) + MENU_MENU_ACTION_FIND_SUBREDDIT, + MENU_MENU_ACTION_PINNED}) @Retention(RetentionPolicy.SOURCE) public @interface MainMenuAction { } @@ -209,7 +211,7 @@ public enum MainMenuUserItems { } public enum MainMenuShortcutItems { - FRONTPAGE, POPULAR, ALL, SUBREDDIT_SEARCH, CUSTOM + FRONTPAGE, POPULAR, ALL, SUBREDDIT_SEARCH, CUSTOM, PINNED } @Override diff --git a/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java b/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java index ad6f08728..234539499 100644 --- a/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java +++ b/src/main/java/org/quantumbadger/redreader/fragments/PostListingFragment.java @@ -295,6 +295,7 @@ public void onScrolled( case SUBREDDIT_COMBINATION: case ALL_SUBTRACTION: case POPULAR: + case PINNED: setHeader( mPostListingURL.humanReadableName(getActivity(), true), mPostListingURL.humanReadableUrl(), diff --git a/src/main/java/org/quantumbadger/redreader/listingcontrollers/PostListingController.java b/src/main/java/org/quantumbadger/redreader/listingcontrollers/PostListingController.java index 9b3bbc444..f082d796e 100644 --- a/src/main/java/org/quantumbadger/redreader/listingcontrollers/PostListingController.java +++ b/src/main/java/org/quantumbadger/redreader/listingcontrollers/PostListingController.java @@ -158,8 +158,10 @@ public final boolean isSubreddit() { public final boolean isSubredditCombination() { return url.pathType() == RedditURLParser.SUBREDDIT_POST_LISTING_URL - && url.asSubredditPostListURL().type - == SubredditPostListURL.Type.SUBREDDIT_COMBINATION; + && (url.asSubredditPostListURL().type + == SubredditPostListURL.Type.SUBREDDIT_COMBINATION + || url.asSubredditPostListURL().type + == SubredditPostListURL.Type.PINNED); } public final boolean isMultireddit() { @@ -184,7 +186,9 @@ public final SubredditCanonicalId subredditCanonicalName() { && (url.asSubredditPostListURL().type == SubredditPostListURL.Type.SUBREDDIT || url.asSubredditPostListURL().type - == SubredditPostListURL.Type.SUBREDDIT_COMBINATION)) { + == SubredditPostListURL.Type.SUBREDDIT_COMBINATION + || url.asSubredditPostListURL().type + == SubredditPostListURL.Type.PINNED)) { try { return new SubredditCanonicalId(url.asSubredditPostListURL().subreddit); } catch(final InvalidSubredditNameException e) { diff --git a/src/main/java/org/quantumbadger/redreader/reddit/RedditSubredditHistory.java b/src/main/java/org/quantumbadger/redreader/reddit/RedditSubredditHistory.java index 1fc16ea92..417c2e80a 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/RedditSubredditHistory.java +++ b/src/main/java/org/quantumbadger/redreader/reddit/RedditSubredditHistory.java @@ -19,6 +19,7 @@ import org.quantumbadger.redreader.account.RedditAccount; import org.quantumbadger.redreader.common.Constants; +import org.quantumbadger.redreader.common.PrefsUtility; import org.quantumbadger.redreader.reddit.things.SubredditCanonicalId; import java.util.ArrayList; @@ -40,6 +41,7 @@ private static HashSet getForAccount(final RedditAccount a if(result == null) { result = new HashSet<>(Constants.Reddit.DEFAULT_SUBREDDITS); + result.addAll(PrefsUtility.pref_pinned_subreddits(false)); SUBREDDITS.put(account, result); } diff --git a/src/main/java/org/quantumbadger/redreader/reddit/url/SubredditPostListURL.java b/src/main/java/org/quantumbadger/redreader/reddit/url/SubredditPostListURL.java index 164d1d981..0cd1d76ab 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/url/SubredditPostListURL.java +++ b/src/main/java/org/quantumbadger/redreader/reddit/url/SubredditPostListURL.java @@ -24,6 +24,7 @@ import org.quantumbadger.redreader.R; import org.quantumbadger.redreader.common.Constants; import org.quantumbadger.redreader.common.General; +import org.quantumbadger.redreader.common.PrefsUtility; import org.quantumbadger.redreader.common.StringUtils; import org.quantumbadger.redreader.reddit.PostSort; import org.quantumbadger.redreader.reddit.kthings.RedditIdAndType; @@ -47,6 +48,17 @@ public static SubredditPostListURL getAll() { return new SubredditPostListURL(Type.ALL, null, null, null, null, null); } + public static SubredditPostListURL getPinned() { + final String pinned = PrefsUtility.pref_pinned_subreddits_multireddit(); + return new SubredditPostListURL( + Type.PINNED, + pinned, + null, + null, + null, + null); + } + public static RedditURLParser.RedditURL getSubreddit(final String subreddit) throws InvalidSubredditNameException { return getSubreddit(new SubredditCanonicalId(subreddit)); @@ -61,7 +73,7 @@ public static RedditURLParser.RedditURL getSubreddit(final SubredditCanonicalId } public enum Type { - FRONTPAGE, ALL, SUBREDDIT, SUBREDDIT_COMBINATION, ALL_SUBTRACTION, POPULAR + FRONTPAGE, ALL, SUBREDDIT, SUBREDDIT_COMBINATION, ALL_SUBTRACTION, POPULAR, PINNED } @NonNull public final Type type; @@ -128,6 +140,7 @@ public Uri generateJsonUri() { case SUBREDDIT: case SUBREDDIT_COMBINATION: case ALL_SUBTRACTION: + case PINNED: builder.encodedPath("/r/"); builder.appendPath(subreddit); break; @@ -310,9 +323,14 @@ public static SubredditPostListURL parse(final Uri uri) { } else if(subreddit.matches("\\w+(\\+[\\w\\.]+)+")) { + final Type type = + subreddit.equals(PrefsUtility.pref_pinned_subreddits_multireddit()) + ? Type.PINNED + : Type.SUBREDDIT_COMBINATION; + if(pathSegments.length == 2) { return new SubredditPostListURL( - Type.SUBREDDIT_COMBINATION, + type, subreddit, null, limit, @@ -321,7 +339,7 @@ public static SubredditPostListURL parse(final Uri uri) { } else if(order != null) { return new SubredditPostListURL( - Type.SUBREDDIT_COMBINATION, + type, subreddit, order, limit, @@ -420,6 +438,9 @@ public String humanReadableName(final Context context, final boolean shorter) { case ALL_SUBTRACTION: return subreddit; + case PINNED: + return context.getString(R.string.mainmenu_pinned); + default: return super.humanReadableName(context, shorter); } diff --git a/src/main/res/values/arrays.xml b/src/main/res/values/arrays.xml index 922743096..74a22d899 100644 --- a/src/main/res/values/arrays.xml +++ b/src/main/res/values/arrays.xml @@ -841,6 +841,7 @@ @string/mainmenu_all @string/find_location @string/mainmenu_custom_destination + @string/mainmenu_pinned @@ -850,6 +851,7 @@ all subreddit_search custom + pinned @@ -858,6 +860,7 @@ all subreddit_search custom + pinned diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 41afeea77..b1ebb9643 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -150,6 +150,7 @@ Inbox My Profile Subreddits + Pinned Subreddits @@ -1921,4 +1922,7 @@ Reddit login issue There was a problem logging into Reddit. Try again in an different browser? + + Skip to pinned subreddits + pref_behaviour_skiptopinned diff --git a/src/main/res/xml/prefs_behaviour.xml b/src/main/res/xml/prefs_behaviour.xml index b64412042..5513fd403 100644 --- a/src/main/res/xml/prefs_behaviour.xml +++ b/src/main/res/xml/prefs_behaviour.xml @@ -23,6 +23,10 @@ android:key="@string/pref_behaviour_skiptofrontpage_key" android:defaultValue="false"/> + +