/******************************************************************************* * This file is part of RedReader. * * RedReader is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * RedReader is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with RedReader. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package org.quantumbadger.redreader.common; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.content.res.Resources; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.util.DisplayMetrics; import org.quantumbadger.redreader.R; import org.quantumbadger.redreader.activities.OptionsMenuUtility; import org.quantumbadger.redreader.adapters.MainMenuListingManager; import org.quantumbadger.redreader.fragments.MainMenuFragment; import org.quantumbadger.redreader.io.WritableHashSet; import org.quantumbadger.redreader.reddit.PostSort; import org.quantumbadger.redreader.reddit.prepared.RedditPreparedPost; import org.quantumbadger.redreader.reddit.things.RedditSubreddit; import org.quantumbadger.redreader.reddit.url.PostCommentListingURL; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Set; public final class PrefsUtility { private static <E> Set<E> setFromArray(E[] data) { final HashSet<E> result = new HashSet<>(data.length); Collections.addAll(result, data); return result; } private static String getString(final int id, final String defaultValue, final Context context, final SharedPreferences sharedPreferences) { return sharedPreferences.getString(context.getString(id), defaultValue); } public static Set<String> getStringSet(final int id, final int defaultArrayRes, final Context context, final SharedPreferences sharedPreferences) { return sharedPreferences.getStringSet(context.getString(id), setFromArray(context.getResources().getStringArray(defaultArrayRes))); } private static boolean getBoolean(final int id, final boolean defaultValue, final Context context, final SharedPreferences sharedPreferences) { return sharedPreferences.getBoolean(context.getString(id), defaultValue); } private static long getLong(final int id, final long defaultValue, final Context context, final SharedPreferences sharedPreferences) { return sharedPreferences.getLong(context.getString(id), defaultValue); } public static boolean isReLayoutRequired(final Context context, final String key) { return context.getString(R.string.pref_appearance_twopane_key).equals(key) || context.getString(R.string.pref_appearance_theme_key).equals(key) || context.getString(R.string.pref_menus_mainmenu_useritems_key).equals(key); } public static boolean isRefreshRequired(final Context context, final String key) { return key.startsWith("pref_appearance") || key.equals(context.getString(R.string.pref_behaviour_fling_post_left_key)) || key.equals(context.getString(R.string.pref_behaviour_fling_post_right_key)) || key.equals(context.getString(R.string.pref_behaviour_nsfw_key)) || key.equals(context.getString(R.string.pref_behaviour_postcount_key)) || key.equals(context.getString(R.string.pref_behaviour_comment_min_key)) || key.equals(context.getString(R.string.pref_behaviour_pinned_subredditsort_key)) || key.equals(context.getString(R.string.pref_behaviour_blocked_subredditsort_key)); } public static boolean isRestartRequired(Context context, String key) { return context.getString(R.string.pref_appearance_theme_key).equals(key) || context.getString(R.string.pref_appearance_navbar_color_key).equals(key) || context.getString(R.string.pref_appearance_langforce_key).equals(key) || context.getString(R.string.pref_behaviour_bezel_toolbar_swipezone_key).equals(key) || context.getString(R.string.pref_appearance_hide_username_main_menu_key).equals(key) || context.getString(R.string.pref_appearance_hide_android_status_key).equals(key) || context.getString(R.string.pref_appearance_comments_show_floating_toolbar_key).equals(key) || context.getString(R.string.pref_behaviour_enable_swipe_refresh_key).equals(key); } /////////////////////////////// // pref_appearance /////////////////////////////// // pref_appearance_twopane public enum AppearanceTwopane { NEVER, AUTO, FORCE } public static AppearanceTwopane appearance_twopane(final Context context, final SharedPreferences sharedPreferences) { return AppearanceTwopane.valueOf(General.asciiUppercase(getString(R.string.pref_appearance_twopane_key, "auto", context, sharedPreferences))); } public enum AppearanceTheme { RED, GREEN, BLUE, LTBLUE, ORANGE, GRAY, NIGHT, NIGHT_LOWCONTRAST, ULTRABLACK } public static boolean isNightMode(final Context context) { final AppearanceTheme theme = appearance_theme( context, PreferenceManager.getDefaultSharedPreferences(context)); return theme == AppearanceTheme.NIGHT || theme == AppearanceTheme.NIGHT_LOWCONTRAST || theme == AppearanceTheme.ULTRABLACK; } public static AppearanceTheme appearance_theme(final Context context, final SharedPreferences sharedPreferences) { return AppearanceTheme.valueOf(General.asciiUppercase(getString(R.string.pref_appearance_theme_key, "red", context, sharedPreferences))); } public enum AppearanceNavbarColour { BLACK, PRIMARY, PRIMARYDARK } public static AppearanceNavbarColour appearance_navbar_colour(final Context context, final SharedPreferences sharedPreferences) { return AppearanceNavbarColour.valueOf(General.asciiUppercase(getString(R.string.pref_appearance_navbar_color_key, "black", context, sharedPreferences))); } public static void applyTheme(@NonNull final Activity activity) { final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); final AppearanceTheme theme = appearance_theme(activity, prefs); switch(theme) { case RED: activity.setTheme(R.style.RR_Light_Red); break; case GREEN: activity.setTheme(R.style.RR_Light_Green); break; case BLUE: activity.setTheme(R.style.RR_Light_Blue); break; case LTBLUE: activity.setTheme(R.style.RR_Light_LtBlue); break; case ORANGE: activity.setTheme(R.style.RR_Light_Orange); break; case GRAY: activity.setTheme(R.style.RR_Light_Gray); break; case NIGHT: activity.setTheme(R.style.RR_Dark); break; case NIGHT_LOWCONTRAST: activity.setTheme(R.style.RR_Dark_LowContrast); break; case ULTRABLACK: activity.setTheme(R.style.RR_Dark_UltraBlack); break; } applyLanguage(activity, prefs); } public static void applySettingsTheme(@NonNull final Activity activity) { final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); activity.setTheme(R.style.RR_Settings); applyLanguage(activity, prefs); } private static void applyLanguage(final Activity activity, final SharedPreferences prefs) { final String lang = getString(R.string.pref_appearance_langforce_key, "auto", activity, prefs); for(final Resources res : new Resources[] { activity.getResources(), activity.getApplication().getResources() }) { final DisplayMetrics dm = res.getDisplayMetrics(); final android.content.res.Configuration conf = res.getConfiguration(); if(!lang.equals("auto")) { conf.locale = new Locale(lang); } else { conf.locale = Locale.getDefault(); } res.updateConfiguration(conf, dm); } } public enum AppearanceThumbnailsShow { NEVER, WIFIONLY, ALWAYS } public static AppearanceThumbnailsShow appearance_thumbnails_show(final Context context, final SharedPreferences sharedPreferences) { if(!getBoolean(R.string.pref_appearance_thumbnails_show_key, true, context, sharedPreferences)) { return AppearanceThumbnailsShow.NEVER; } else if(getBoolean(R.string.pref_appearance_thumbnails_wifionly_key, false, context, sharedPreferences)) { return AppearanceThumbnailsShow.WIFIONLY; } else { return AppearanceThumbnailsShow.ALWAYS; } } public static boolean appearance_thumbnails_nsfw_show(final Context context, final SharedPreferences sharedPreferences) { return getBoolean(R.string.pref_appearance_thumbnails_nsfw_show_key, false, context, sharedPreferences); } public static float appearance_fontscale_comments(final Context context, final SharedPreferences sharedPreferences) { return Float.valueOf(getString(R.string.pref_appearance_fontscale_comments_key, "1", context, sharedPreferences)); } public static float appearance_fontscale_inbox(final Context context, final SharedPreferences sharedPreferences) { return Float.valueOf(getString(R.string.pref_appearance_fontscale_inbox_key, "1", context, sharedPreferences)); } public static float appearance_fontscale_posts(final Context context, final SharedPreferences sharedPreferences) { return Float.valueOf(getString(R.string.pref_appearance_fontscale_posts_key, "1", context, sharedPreferences)); } public static boolean pref_appearance_hide_username_main_menu(final Context context, final SharedPreferences sharedPreferences) { return getBoolean(R.string.pref_appearance_hide_username_main_menu_key, false, context, sharedPreferences); } public static boolean pref_appearance_show_blocked_subreddits_main_menu(final Context context, final SharedPreferences sharedPreferences) { return getBoolean(R.string.pref_appearance_show_blocked_subreddits_main_menu_key, false, context, sharedPreferences); } public static boolean pref_appearance_linkbuttons(final Context context, final SharedPreferences sharedPreferences) { return getBoolean(R.string.pref_appearance_linkbuttons_key, true, context, sharedPreferences); } public static boolean pref_appearance_hide_android_status(final Context context, final SharedPreferences sharedPreferences) { return getBoolean(R.string.pref_appearance_hide_android_status_key, false, context, sharedPreferences); } public static boolean pref_appearance_link_text_clickable(final Context context, final SharedPreferences sharedPreferences) { return getBoolean(R.string.pref_appearance_link_text_clickable_key, true, context, sharedPreferences); } public static boolean pref_appearance_image_viewer_show_floating_toolbar(final Context context, final SharedPreferences sharedPreferences) { return getBoolean(R.string.pref_appearance_image_viewer_show_floating_toolbar_key, true, context, sharedPreferences); } public static boolean pref_appearance_comments_show_floating_toolbar(final Context context, final SharedPreferences sharedPreferences) { return getBoolean(R.string.pref_appearance_comments_show_floating_toolbar_key, true, context, sharedPreferences); } public static boolean pref_appearance_indentlines(final Context context, final SharedPreferences sharedPreferences) { return getBoolean(R.string.pref_appearance_indentlines_key, false, context, sharedPreferences); } public enum AppearanceCommentHeaderItem { AUTHOR, FLAIR, SCORE, AGE, GOLD } public static EnumSet<AppearanceCommentHeaderItem> appearance_comment_header_items(final Context context, final SharedPreferences sharedPreferences) { final Set<String> strings = getStringSet(R.string.pref_appearance_comment_header_items_key, R.array.pref_appearance_comment_header_items_default, context, sharedPreferences); final EnumSet<AppearanceCommentHeaderItem> result = EnumSet.noneOf(AppearanceCommentHeaderItem.class); for(String s : strings) { if(s.equalsIgnoreCase("ups_downs")) continue; try { result.add(AppearanceCommentHeaderItem.valueOf(General.asciiUppercase(s))); } catch(IllegalArgumentException e) { // Ignore -- this option no longer exists } } return result; } /////////////////////////////// // pref_behaviour /////////////////////////////// public static boolean pref_behaviour_skiptofrontpage(final Context context, final SharedPreferences sharedPreferences) { return getBoolean(R.string.pref_behaviour_skiptofrontpage_key, false, context, sharedPreferences); } public static boolean pref_behaviour_useinternalbrowser(final Context context, final SharedPreferences sharedPreferences) { return getBoolean(R.string.pref_behaviour_useinternalbrowser_key, true, context, sharedPreferences); } public static boolean pref_behaviour_notifications(final Context context, final SharedPreferences sharedPreferences) { return getBoolean(R.string.pref_behaviour_notifications_key, true, context, sharedPreferences); } public static boolean pref_behaviour_enable_swipe_refresh(final Context context, final SharedPreferences sharedPreferences) { return getBoolean(R.string.pref_behaviour_enable_swipe_refresh_key, true, context, sharedPreferences); } public static int pref_behaviour_bezel_toolbar_swipezone_dp(final Context context, final SharedPreferences sharedPreferences) { try { return Integer.parseInt(getString(R.string.pref_behaviour_bezel_toolbar_swipezone_key, "10", context, sharedPreferences)); } catch(Throwable e) { return 10; } } public static int pref_behaviour_gallery_swipe_length_dp(final Context context, final SharedPreferences sharedPreferences) { try { return Integer.parseInt(getString(R.string.pref_behaviour_gallery_swipe_length_key, "150", context, sharedPreferences)); } catch(Throwable e) { return 150; } } public static Integer pref_behaviour_comment_min(final Context context, final SharedPreferences sharedPreferences) { Integer defaultValue = -4; final String value = getString(R.string.pref_behaviour_comment_min_key, defaultValue.toString(), context, sharedPreferences); if(value == null || value.trim().isEmpty()) { return null; } try { return Integer.parseInt(value); } catch(Throwable e) { return defaultValue; } } // pref_behaviour_imageview_mode public enum ImageViewMode { INTERNAL_OPENGL(true), INTERNAL_BROWSER(false), EXTERNAL_BROWSER(false); public final boolean downloadInApp; ImageViewMode(final boolean downloadInApp) { this.downloadInApp = downloadInApp; } } public static ImageViewMode pref_behaviour_imageview_mode(final Context context, final SharedPreferences sharedPreferences) { return ImageViewMode.valueOf(General.asciiUppercase(getString(R.string.pref_behaviour_imageview_mode_key, "internal_opengl", context, sharedPreferences))); } // pref_behaviour_albumview_mode public enum AlbumViewMode { INTERNAL_LIST, INTERNAL_BROWSER, EXTERNAL_BROWSER } public static AlbumViewMode pref_behaviour_albumview_mode(final Context context, final SharedPreferences sharedPreferences) { return AlbumViewMode.valueOf(General.asciiUppercase(getString(R.string.pref_behaviour_albumview_mode_key, "internal_list", context, sharedPreferences))); } // pref_behaviour_gifview_mode public enum GifViewMode { INTERNAL_MOVIE(true), INTERNAL_LEGACY(true), INTERNAL_BROWSER(false), EXTERNAL_BROWSER(false); public final boolean downloadInApp; GifViewMode(final boolean downloadInApp) { this.downloadInApp = downloadInApp; } } public static GifViewMode pref_behaviour_gifview_mode(final Context context, final SharedPreferences sharedPreferences) { return GifViewMode.valueOf(General.asciiUppercase(getString(R.string.pref_behaviour_gifview_mode_key, "internal_movie", context, sharedPreferences))); } // pref_behaviour_videoview_mode public enum VideoViewMode { INTERNAL_VIDEOVIEW(true), INTERNAL_BROWSER(false), EXTERNAL_BROWSER(false), EXTERNAL_APP_VLC(true); public final boolean downloadInApp; VideoViewMode(final boolean downloadInApp) { this.downloadInApp = downloadInApp; } } public static VideoViewMode pref_behaviour_videoview_mode(final Context context, final SharedPreferences sharedPreferences) { return VideoViewMode.valueOf(General.asciiUppercase(getString(R.string.pref_behaviour_videoview_mode_key, "internal_videoview", context, sharedPreferences))); } // pref_behaviour_fling_post public enum PostFlingAction { UPVOTE, DOWNVOTE, SAVE, HIDE, COMMENTS, LINK, ACTION_MENU, BROWSER, BACK, DISABLED } public static PostFlingAction pref_behaviour_fling_post_left(final Context context, final SharedPreferences sharedPreferences) { return PostFlingAction.valueOf(General.asciiUppercase(getString(R.string.pref_behaviour_fling_post_left_key, "downvote", context, sharedPreferences))); } public static PostFlingAction pref_behaviour_fling_post_right(final Context context, final SharedPreferences sharedPreferences) { return PostFlingAction.valueOf(General.asciiUppercase(getString(R.string.pref_behaviour_fling_post_right_key, "upvote", context, sharedPreferences))); } // pref_behaviour_fling_comment public enum CommentFlingAction { UPVOTE, DOWNVOTE, SAVE, REPLY, USER_PROFILE, COLLAPSE, ACTION_MENU, PROPERTIES, BACK, DISABLED } public static CommentFlingAction pref_behaviour_fling_comment_left(final Context context, final SharedPreferences sharedPreferences) { return CommentFlingAction.valueOf(General.asciiUppercase(getString(R.string.pref_behaviour_fling_comment_left_key, "downvote", context, sharedPreferences))); } public static CommentFlingAction pref_behaviour_fling_comment_right(final Context context, final SharedPreferences sharedPreferences) { return CommentFlingAction.valueOf(General.asciiUppercase(getString(R.string.pref_behaviour_fling_comment_right_key, "upvote", context, sharedPreferences))); } public enum CommentAction { COLLAPSE, ACTION_MENU, NOTHING } public static CommentAction pref_behaviour_actions_comment_tap(final Context context, final SharedPreferences sharedPreferences) { return CommentAction.valueOf(General.asciiUppercase(getString(R.string.pref_behaviour_actions_comment_tap_key, "collapse", context, sharedPreferences))); } public static CommentAction pref_behaviour_actions_comment_longclick(final Context context, final SharedPreferences sharedPreferences) { return CommentAction.valueOf(General.asciiUppercase(getString(R.string.pref_behaviour_actions_comment_longclick_key, "action_menu", context, sharedPreferences))); } public static PostSort pref_behaviour_postsort(final Context context, final SharedPreferences sharedPreferences) { return PostSort.valueOf(General.asciiUppercase(getString(R.string.pref_behaviour_postsort_key, "hot", context, sharedPreferences))); } public static PostCommentListingURL.Sort pref_behaviour_commentsort(final Context context, final SharedPreferences sharedPreferences) { return PostCommentListingURL.Sort.valueOf(General.asciiUppercase(getString(R.string.pref_behaviour_commentsort_key, "best", context, sharedPreferences))); } public enum PinnedSubredditSort { NAME, DATE } public static PinnedSubredditSort pref_behaviour_pinned_subredditsort(final Context context, final SharedPreferences sharedPreferences) { return PinnedSubredditSort.valueOf(General.asciiUppercase(getString(R.string.pref_behaviour_pinned_subredditsort_key, "name", context, sharedPreferences))); } public enum BlockedSubredditSort { NAME, DATE } public static BlockedSubredditSort pref_behaviour_blocked_subredditsort(final Context context, final SharedPreferences sharedPreferences) { return BlockedSubredditSort.valueOf(General.asciiUppercase(getString(R.string.pref_behaviour_blocked_subredditsort_key, "name", context, sharedPreferences))); } public static boolean pref_behaviour_nsfw(final Context context, final SharedPreferences sharedPreferences) { return getBoolean(R.string.pref_behaviour_nsfw_key, false, context, sharedPreferences); } public static boolean pref_behaviour_share_permalink(final Context context, final SharedPreferences sharedPreferences) { return getBoolean(R.string.pref_behaviour_share_permalink_key, false, context, sharedPreferences); } public enum PostCount { R25, R50, R100, ALL } public static PostCount pref_behaviour_post_count(final Context context, final SharedPreferences sharedPreferences) { return PostCount.valueOf(getString(R.string.pref_behaviour_postcount_key, "ALL", context, sharedPreferences)); } public enum ScreenOrientation { AUTO, PORTRAIT, LANDSCAPE } public static ScreenOrientation pref_behaviour_screen_orientation(final Context context, final SharedPreferences sharedPreferences) { return ScreenOrientation.valueOf(General.asciiUppercase(getString(R.string.pref_behaviour_screenorientation_key, ScreenOrientation.AUTO.name(), context, sharedPreferences))); } /////////////////////////////// // pref_cache /////////////////////////////// // pref_cache_location public static String pref_cache_location(final Context context, final SharedPreferences sharedPreferences) { File defaultCacheDir = context.getExternalCacheDir(); if (defaultCacheDir == null) { defaultCacheDir = context.getCacheDir(); } return getString(R.string.pref_cache_location_key, defaultCacheDir.getAbsolutePath(), context, sharedPreferences); } public static void pref_cache_location(Context context, final SharedPreferences sharedPreferences, final String path) { sharedPreferences.edit() .putString(context.getString(R.string.pref_cache_location_key), path) .apply(); } public static long pref_cache_rerequest_postlist_age_ms(final Context context, final SharedPreferences sharedPreferences) { try { final int hours = Integer.parseInt( getString(R.string.pref_cache_rerequest_postlist_age_key, "1", context, sharedPreferences)); return General.hoursToMs(hours); } catch(Throwable e) { return 1; } } // pref_cache_maxage public static HashMap<Integer, Long> pref_cache_maxage(final Context context, final SharedPreferences sharedPreferences) { final HashMap<Integer, Long> result = new HashMap<>(); final long maxAgeListing = 1000L * 60L * 60L * Long.valueOf(getString(R.string.pref_cache_maxage_listing_key, "168", context, sharedPreferences)); final long maxAgeThumb = 1000L * 60L * 60L * Long.valueOf(getString(R.string.pref_cache_maxage_thumb_key, "168", context, sharedPreferences)); final long maxAgeImage = 1000L * 60L * 60L * Long.valueOf(getString(R.string.pref_cache_maxage_image_key, "72", context, sharedPreferences)); result.put(Constants.FileType.POST_LIST, maxAgeListing); result.put(Constants.FileType.COMMENT_LIST, maxAgeListing); result.put(Constants.FileType.SUBREDDIT_LIST, maxAgeListing); result.put(Constants.FileType.SUBREDDIT_ABOUT, maxAgeListing); result.put(Constants.FileType.USER_ABOUT, maxAgeListing); result.put(Constants.FileType.INBOX_LIST, maxAgeListing); result.put(Constants.FileType.THUMBNAIL, maxAgeThumb); result.put(Constants.FileType.IMAGE, maxAgeImage); result.put(Constants.FileType.IMAGE_INFO, maxAgeImage); result.put(Constants.FileType.CAPTCHA, maxAgeImage); return result; } // pref_cache_precache_images public enum CachePrecacheImages { NEVER, WIFIONLY, ALWAYS } public static CachePrecacheImages cache_precache_images(final Context context, final SharedPreferences sharedPreferences) { if(network_tor(context, sharedPreferences)) { return CachePrecacheImages.NEVER; } if(!getBoolean(R.string.pref_cache_precache_images_key, true, context, sharedPreferences)) { return CachePrecacheImages.NEVER; } else if(getBoolean(R.string.pref_cache_precache_images_wifionly_key, true, context, sharedPreferences)) { return CachePrecacheImages.WIFIONLY; } else { return CachePrecacheImages.ALWAYS; } } // pref_cache_precache_comments public enum CachePrecacheComments { NEVER, WIFIONLY, ALWAYS } public static CachePrecacheComments cache_precache_comments(final Context context, final SharedPreferences sharedPreferences) { if(!getBoolean(R.string.pref_cache_precache_comments_key, true, context, sharedPreferences)) { return CachePrecacheComments.NEVER; } else if(getBoolean(R.string.pref_cache_precache_comments_wifionly_key, false, context, sharedPreferences)) { return CachePrecacheComments.WIFIONLY; } else { return CachePrecacheComments.ALWAYS; } } /////////////////////////////// // pref_network /////////////////////////////// public static boolean network_tor(final Context context, final SharedPreferences sharedPreferences) { return getBoolean(R.string.pref_network_tor_key, false, context, sharedPreferences); } /////////////////////////////// // pref_menus /////////////////////////////// public static EnumSet<RedditPreparedPost.Action> pref_menus_post_context_items(final Context context, final SharedPreferences sharedPreferences) { final Set<String> strings = getStringSet(R.string.pref_menus_post_context_items_key, R.array.pref_menus_post_context_items_return, context, sharedPreferences); final EnumSet<RedditPreparedPost.Action> result = EnumSet.noneOf(RedditPreparedPost.Action.class); for(String s : strings) result.add(RedditPreparedPost.Action.valueOf(General.asciiUppercase(s))); return result; } public static EnumSet<RedditPreparedPost.Action> pref_menus_post_toolbar_items(final Context context, final SharedPreferences sharedPreferences) { final Set<String> strings = getStringSet(R.string.pref_menus_post_toolbar_items_key, R.array.pref_menus_post_toolbar_items_return, context, sharedPreferences); final EnumSet<RedditPreparedPost.Action> result = EnumSet.noneOf(RedditPreparedPost.Action.class); for(String s : strings) result.add(RedditPreparedPost.Action.valueOf(General.asciiUppercase(s))); return result; } public static EnumSet<LinkHandler.LinkAction> pref_menus_link_context_items(final Context context, final SharedPreferences sharedPreferences) { final Set<String> strings = getStringSet(R.string.pref_menus_link_context_items_key, R.array.pref_menus_link_context_items_return, context, sharedPreferences); final EnumSet<LinkHandler.LinkAction> result = EnumSet.noneOf(LinkHandler.LinkAction.class); for(String s : strings) result.add(LinkHandler.LinkAction.valueOf(General.asciiUppercase(s))); return result; } public static EnumSet<MainMenuListingManager.SubredditAction> pref_menus_subreddit_context_items(final Context context, final SharedPreferences sharedPreferences) { final Set<String> strings = getStringSet(R.string.pref_menus_subreddit_context_items_key, R.array.pref_menus_subreddit_context_items_return, context, sharedPreferences); final EnumSet<MainMenuListingManager.SubredditAction> result = EnumSet.noneOf(MainMenuListingManager.SubredditAction.class); for(String s : strings) result.add(MainMenuListingManager.SubredditAction.valueOf(General.asciiUppercase(s))); return result; } public static EnumSet<MainMenuFragment.MainMenuUserItems> pref_menus_mainmenu_useritems(final Context context, final SharedPreferences sharedPreferences) { final Set<String> strings = getStringSet(R.string.pref_menus_mainmenu_useritems_key, R.array.pref_menus_mainmenu_useritems_items_default, context, sharedPreferences); final EnumSet<MainMenuFragment.MainMenuUserItems> result = EnumSet.noneOf(MainMenuFragment.MainMenuUserItems.class); for(String s : strings) result.add(MainMenuFragment.MainMenuUserItems.valueOf(General.asciiUppercase(s))); return result; } public static EnumSet<OptionsMenuUtility.OptionsMenuItemsPref> pref_menus_optionsmenu_items(final Context context, final SharedPreferences sharedPreferences) { final Set<String> strings = getStringSet(R.string.pref_menus_optionsmenu_items_key, R.array.pref_menus_optionsmenu_items_items_default, context, sharedPreferences); final EnumSet<OptionsMenuUtility.OptionsMenuItemsPref> result = EnumSet.noneOf(OptionsMenuUtility.OptionsMenuItemsPref.class); for(String s : strings) result.add(OptionsMenuUtility.OptionsMenuItemsPref.valueOf(General.asciiUppercase(s))); return result; } /////////////////////////////// // pref_pinned_subreddits /////////////////////////////// public static List<String> pref_pinned_subreddits(final Context context, final SharedPreferences sharedPreferences) { final String value = getString(R.string.pref_pinned_subreddits_key, "", context, sharedPreferences); return WritableHashSet.escapedStringToList(value); } public static void pref_pinned_subreddits_add( final Context context, final SharedPreferences sharedPreferences, final String subreddit) throws RedditSubreddit.InvalidSubredditNameException { pref_subreddits_add(context, sharedPreferences, subreddit, R.string.pref_pinned_subreddits_key); } public static void pref_pinned_subreddits_remove( final Context context, final SharedPreferences sharedPreferences, final String subreddit) throws RedditSubreddit.InvalidSubredditNameException { pref_subreddits_remove(context, sharedPreferences, subreddit, R.string.pref_pinned_subreddits_key); } public static boolean pref_pinned_subreddits_check( final Context context, final SharedPreferences sharedPreferences, final String subreddit) throws RedditSubreddit.InvalidSubredditNameException { final List<String> list = pref_pinned_subreddits(context, sharedPreferences); for(final String existingSr : list) { if(General.asciiLowercase(subreddit).equals(General.asciiLowercase(existingSr))) return true; } return false; } /////////////////////////////// // pref_blocked_subreddits /////////////////////////////// public static List<String> pref_blocked_subreddits(final Context context, final SharedPreferences sharedPreferences) { final String value = getString(R.string.pref_blocked_subreddits_key, "", context, sharedPreferences); return WritableHashSet.escapedStringToList(value); } public static void pref_blocked_subreddits_add( final Context context, final SharedPreferences sharedPreferences, final String subreddit) throws RedditSubreddit.InvalidSubredditNameException { pref_subreddits_add(context, sharedPreferences, subreddit, R.string.pref_blocked_subreddits_key); General.quickToast(context, R.string.block_done); } public static void pref_blocked_subreddits_remove( final Context context, final SharedPreferences sharedPreferences, final String subreddit) throws RedditSubreddit.InvalidSubredditNameException { pref_subreddits_remove(context, sharedPreferences, subreddit, R.string.pref_blocked_subreddits_key); General.quickToast(context, R.string.unblock_done); } public static boolean pref_blocked_subreddits_check( final Context context, final SharedPreferences sharedPreferences, final String subreddit) throws RedditSubreddit.InvalidSubredditNameException { final List<String> list = pref_blocked_subreddits(context, sharedPreferences); for(final String existingSr : list) { if (General.asciiLowercase(subreddit).equals(General.asciiLowercase(existingSr))) return true; } return false; } /////////////////////////////// // Shared pref_subreddits methods /////////////////////////////// private static void pref_subreddits_add(Context context, SharedPreferences sharedPreferences, String subreddit, int prefId) throws RedditSubreddit.InvalidSubredditNameException { final String name = RedditSubreddit.getCanonicalName(subreddit); final String value = getString(prefId, "", context, sharedPreferences); final ArrayList<String> list = WritableHashSet.escapedStringToList(value); list.add(name); final String result = WritableHashSet.listToEscapedString(list); sharedPreferences.edit().putString(context.getString(prefId), result).apply(); } private static void pref_subreddits_remove(Context context, SharedPreferences sharedPreferences, String subreddit, int prefId) throws RedditSubreddit.InvalidSubredditNameException { final String name = RedditSubreddit.getCanonicalName(subreddit); final String value = getString(prefId, "", context, sharedPreferences); final ArrayList<String> list = WritableHashSet.escapedStringToList(value); list.add(name); final ArrayList<String> result = new ArrayList<>(list.size()); for(final String existingSr : list) { if(!General.asciiLowercase(name).equals(General.asciiLowercase(existingSr))) { result.add(existingSr); } } final String resultStr = WritableHashSet.listToEscapedString(result); sharedPreferences.edit().putString(context.getString(prefId), resultStr).apply(); } }