package me.ccrama.redditslide; import android.content.SharedPreferences; import net.dean.jraw.models.Submission; import java.net.MalformedURLException; import java.net.URL; /** * Created by carlo_000 on 1/13/2016. */ public class PostMatch { public static boolean contains(String target, String[] strings, boolean totalMatch) { for (String s : strings) { s = s.toLowerCase().trim(); if (!s.isEmpty() && !s.equals("\n") && totalMatch ? target.equals(s) : target.contains(s)) { return true; } } return false; } /** * Checks if a domain should be filtered or not: returns true if the target domain ends with the * comparison domain and if supplied, target path begins with the comparison path * * @param target URL to check * @param strings The URLs to check against * @return If the target is covered by any strings * @throws MalformedURLException */ public static boolean isDomain(String target, String[] strings) throws MalformedURLException { URL domain = new URL(target); for (String s : strings) { if (!s.contains("/")) { if (ContentType.hostContains(domain.getHost(), s)) { return true; } else { continue; } } if (!s.contains("://")) { s = "http://" + s; } try { URL comparison = new URL(s.toLowerCase()); if (ContentType.hostContains(domain.getHost(), comparison.getHost()) && domain.getPath().startsWith(comparison.getPath())) { return true; } } catch (MalformedURLException ignored) { } } return false; } public static boolean openExternal(String url) { if (externalDomain == null) { externalDomain = SettingValues.alwaysExternal.replaceAll("^[,\\s]+", "").split("[,\\s]+"); } try { return !SettingValues.alwaysExternal.isEmpty() && isDomain(url.toLowerCase(), externalDomain); } catch (MalformedURLException e) { return false; } } public static SharedPreferences filters; public static String[] titles = null; public static String[] texts = null; public static String[] domains = null; public static String[] subreddits = null; public static String[] externalDomain = null; public static String[] flairs = null; public static String[] users = null; public static boolean doesMatch(Submission s, String baseSubreddit, boolean ignore18) { String title = s.getTitle(); String body = s.getSelftext(); String domain = s.getUrl(); String subreddit = s.getSubredditName(); String flair = s.getSubmissionFlair().getText() != null?s.getSubmissionFlair().getText():""; boolean titlec; boolean bodyc; boolean domainc; boolean subredditc; boolean userc; if (titles == null) { titles = SettingValues.titleFilters.replaceAll("^[,\\s]+", "").split("[,\\s]+"); } if (texts == null) { texts = SettingValues.textFilters.replaceAll("^[,\\s]+", "").split("[,\\s]+"); } if (domains == null) { domains = SettingValues.domainFilters.replaceAll("^[,\\s]+", "").split("[,\\s]+"); } if (subreddits == null) { subreddits = SettingValues.subredditFilters.replaceAll("^[,\\s]+", "").split("[,\\s]+"); } if (flairs == null) { flairs = SettingValues.flairFilters.replaceAll("^[,]+", "").split("[,]+"); } if (users == null) { users = SettingValues.userFilters.replaceAll("^[,\\s]+", "").split("[,\\s]+"); } titlec = !SettingValues.titleFilters.isEmpty() && contains(title.toLowerCase(), titles, false); bodyc = !SettingValues.textFilters.isEmpty() && contains(body.toLowerCase(), texts, false); userc = !SettingValues.userFilters.isEmpty() && contains(s.getAuthor().toLowerCase(), users, false); try { domainc = !SettingValues.domainFilters.isEmpty() && isDomain(domain.toLowerCase(), domains); } catch (MalformedURLException e) { domainc = false; } subredditc = !subreddit.equalsIgnoreCase(baseSubreddit) && !SettingValues.subredditFilters.isEmpty() && contains(subreddit.toLowerCase(), subreddits, true); boolean contentMatch = false; if (baseSubreddit == null || baseSubreddit.isEmpty()) { baseSubreddit = "frontpage"; } baseSubreddit = baseSubreddit.toLowerCase(); boolean gifs = isGif(baseSubreddit); boolean images = isImage(baseSubreddit); boolean nsfw = isNsfw(baseSubreddit); boolean albums = isAlbums(baseSubreddit); boolean urls = isUrls(baseSubreddit); boolean selftext = isSelftext(baseSubreddit); boolean videos = isVideo(baseSubreddit); if (s.isNsfw()) { if (nsfw) { contentMatch = true; } if (!Reddit.over18 && !ignore18) { contentMatch = true; } } switch (ContentType.getContentType(s)) { case REDDIT: case EMBEDDED: case LINK: if (urls) { contentMatch = true; } break; case SELF: case NONE: if (selftext) { contentMatch = true; } break; case ALBUM: if (albums) { contentMatch = true; } break; case IMAGE: case DEVIANTART: case IMGUR: case XKCD: if (images) { contentMatch = true; } break; case GIF: if (gifs) { contentMatch = true; } break; case VID_ME: case STREAMABLE: case VIDEO: if (videos) { contentMatch = true; } break; } if(!flair.isEmpty()) for(String flairText : flairs){ if(flairText.toLowerCase().startsWith(baseSubreddit)){ String[] split = flairText.split(":"); if(split[0].equalsIgnoreCase(baseSubreddit)){ if(flair.equalsIgnoreCase(split[1].trim())){ contentMatch = true; break; } } } } return (titlec || bodyc || userc || domainc || subredditc || contentMatch || Hidden.id.contains(s.getFullName())); } public static boolean doesMatch(Submission s) { String title = s.getTitle(); String body = s.getSelftext(); String domain = s.getUrl(); String subreddit = s.getSubredditName(); boolean titlec; boolean bodyc; boolean domainc; boolean subredditc; if (titles == null) { titles = SettingValues.titleFilters.replaceAll("^[,\\s]+", "").split("[,\\s]+"); } if (texts == null) { texts = SettingValues.textFilters.replaceAll("^[,\\s]+", "").split("[,\\s]+"); } if (domains == null) { domains = SettingValues.domainFilters.replaceAll("^[,\\s]+", "").split("[,\\s]+"); } if (subreddits == null) { subreddits = SettingValues.subredditFilters.replaceAll("^[,\\s]+", "").split("[,\\s]+"); } titlec = !SettingValues.titleFilters.isEmpty() && contains(title.toLowerCase(), titles, false); bodyc = !SettingValues.textFilters.isEmpty() && contains(body.toLowerCase(), texts, false); domainc = !SettingValues.domainFilters.isEmpty() && contains(domain.toLowerCase(), domains, false); subredditc = subreddit != null && !subreddit.isEmpty() && !SettingValues.subredditFilters.isEmpty() && contains(subreddit.toLowerCase(), subreddits, true); return (titlec || bodyc || domainc || subredditc); } public static void setChosen(boolean[] values, String subreddit) { subreddit = subreddit.toLowerCase(); SharedPreferences.Editor e = filters.edit(); e.putBoolean(subreddit + "_gifsFilter", values[2]); e.putBoolean(subreddit + "_albumsFilter", values[1]); e.putBoolean(subreddit + "_imagesFilter", values[0]); e.putBoolean(subreddit + "_nsfwFilter", values[6]); e.putBoolean(subreddit + "_selftextFilter", values[5]); e.putBoolean(subreddit + "_urlsFilter", values[4]); e.putBoolean(subreddit + "_videoFilter", values[3]); e.apply(); } public static boolean isGif(String baseSubreddit) { return filters.getBoolean(baseSubreddit + "_gifsFilter", false); } public static boolean isImage(String baseSubreddit) { return filters.getBoolean(baseSubreddit + "_imagesFilter", false); } public static boolean isAlbums(String baseSubreddit) { return filters.getBoolean(baseSubreddit + "_albumsFilter", false); } public static boolean isNsfw(String baseSubreddit) { return filters.getBoolean(baseSubreddit + "_nsfwFilter", false); } public static boolean isSelftext(String baseSubreddit) { return filters.getBoolean(baseSubreddit + "_selftextFilter", false); } public static boolean isUrls(String baseSubreddit) { return filters.getBoolean(baseSubreddit + "_urlsFilter", false); } public static boolean isVideo(String baseSubreddit) { return filters.getBoolean(baseSubreddit + "_videoFilter", false); } }