/******************************************************************************* * 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.reddit.url; import android.content.Context; import android.net.Uri; import android.support.annotation.IntDef; import org.quantumbadger.redreader.common.General; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; public class RedditURLParser { public static final int SUBREDDIT_POST_LISTING_URL = 0; public static final int USER_POST_LISTING_URL = 1; public static final int SEARCH_POST_LISTING_URL = 2; public static final int UNKNOWN_POST_LISTING_URL = 3; public static final int USER_PROFILE_URL = 4; public static final int USER_COMMENT_LISTING_URL = 5; public static final int UNKNOWN_COMMENT_LISTING_URL = 6; public static final int POST_COMMENT_LISTING_URL = 7; public static final int MULTIREDDIT_POST_LISTING_URL = 8; @IntDef({SUBREDDIT_POST_LISTING_URL, USER_POST_LISTING_URL, SEARCH_POST_LISTING_URL, UNKNOWN_POST_LISTING_URL, USER_PROFILE_URL, USER_COMMENT_LISTING_URL, UNKNOWN_COMMENT_LISTING_URL, POST_COMMENT_LISTING_URL, MULTIREDDIT_POST_LISTING_URL}) @Retention(RetentionPolicy.SOURCE) public @interface PathType {} private static boolean isRedditUri(Uri uri) { if (uri == null || uri.getHost() == null) return false; final String[] hostSegments = General.asciiLowercase(uri.getHost()).split("\\."); if (hostSegments.length < 2) return false; if (hostSegments[hostSegments.length - 1].equals("com") && hostSegments[hostSegments.length - 2].equals("reddit")) return true; if (hostSegments[hostSegments.length - 1].equals("it") && hostSegments[hostSegments.length - 2].equals("redd")) return true; return false; } public static RedditURL parse(Uri uri) { if (uri == null) return null; if (!isRedditUri(uri)) return null; { final SubredditPostListURL subredditPostListURL = SubredditPostListURL.parse(uri); if (subredditPostListURL != null) { return subredditPostListURL; } } { final MultiredditPostListURL multiredditPostListURL = MultiredditPostListURL.parse(uri); if (multiredditPostListURL != null) { return multiredditPostListURL; } } { final SearchPostListURL searchPostListURL = SearchPostListURL.parse(uri); if (searchPostListURL != null) { return searchPostListURL; } } { final UserPostListingURL userPostListURL = UserPostListingURL.parse(uri); if (userPostListURL != null) { return userPostListURL; } } { final UserCommentListingURL userCommentListURL = UserCommentListingURL.parse(uri); if (userCommentListURL != null) { return userCommentListURL; } } { final PostCommentListingURL commentListingURL = PostCommentListingURL.parse(uri); if (commentListingURL != null) { return commentListingURL; } } { final UserProfileURL userProfileURL = UserProfileURL.parse(uri); if (userProfileURL != null) { return userProfileURL; } } return null; } public static RedditURL parseProbableCommentListing(Uri uri) { RedditURL matchURL = parse(uri); if (matchURL != null) return matchURL; return new UnknownCommentListURL(uri); } public static RedditURL parseProbablePostListing(Uri uri) { RedditURL matchURL = parse(uri); if (matchURL != null) return matchURL; return new UnknownPostListURL(uri); } public static abstract class RedditURL { public abstract Uri generateJsonUri(); public abstract @PathType int pathType(); public final SubredditPostListURL asSubredditPostListURL() { return (SubredditPostListURL) this; } public final MultiredditPostListURL asMultiredditPostListURL() { return (MultiredditPostListURL) this; } public final SearchPostListURL asSearchPostListURL() { return (SearchPostListURL) this; } public final UserPostListingURL asUserPostListURL() { return (UserPostListingURL) this; } public UserProfileURL asUserProfileURL() { return (UserProfileURL) this; } public PostCommentListingURL asPostCommentListURL() { return (PostCommentListingURL) this; } public UserCommentListingURL asUserCommentListURL() { return (UserCommentListingURL) this; } public String humanReadableName(Context context, boolean shorter) { return humanReadablePath(); } public String humanReadableUrl() { return "reddit.com" + humanReadablePath(); } public String humanReadablePath() { final Uri src = generateJsonUri(); final StringBuilder builder = new StringBuilder(); for (String pathElement : src.getPathSegments()) { if (!pathElement.equals(".json")) { builder.append("/"); builder.append(pathElement); } } return builder.toString(); } @Override public String toString() { return generateJsonUri().toString(); } } }