package ml.docilealligator.infinityforreddit.comment; import android.os.Handler; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.util.ArrayList; import java.util.concurrent.Executor; import ml.docilealligator.infinityforreddit.thing.SortType; import ml.docilealligator.infinityforreddit.account.Account; import ml.docilealligator.infinityforreddit.apis.RedditAPI; import ml.docilealligator.infinityforreddit.commentfilter.CommentFilter; import ml.docilealligator.infinityforreddit.utils.APIUtils; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; import retrofit2.Retrofit; public class FetchComment { public static void fetchComments(Executor executor, Handler handler, Retrofit retrofit, @Nullable String accessToken, @NonNull String accountName, String article, String commentId, SortType.Type sortType, String contextNumber, boolean expandChildren, CommentFilter commentFilter, FetchCommentListener fetchCommentListener) { RedditAPI api = retrofit.create(RedditAPI.class); Call comments; if (accountName.equals(Account.ANONYMOUS_ACCOUNT)) { if (commentId == null) { comments = api.getPostAndCommentsById(article, sortType); } else { comments = api.getPostAndCommentsSingleThreadById(article, commentId, sortType, contextNumber); } } else { if (commentId == null) { comments = api.getPostAndCommentsByIdOauth(article, sortType, APIUtils.getOAuthHeader(accessToken)); } else { comments = api.getPostAndCommentsSingleThreadByIdOauth(article, commentId, sortType, contextNumber, APIUtils.getOAuthHeader(accessToken)); } } comments.enqueue(new Callback<>() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { if (response.isSuccessful()) { ParseComment.parseComment(executor, handler, response.body(), expandChildren, commentFilter, new ParseComment.ParseCommentListener() { @Override public void onParseCommentSuccess(ArrayList topLevelComments, ArrayList expandedComments, String parentId, ArrayList moreChildrenIds) { fetchCommentListener.onFetchCommentSuccess(expandedComments, parentId, moreChildrenIds); } @Override public void onParseCommentFailed() { fetchCommentListener.onFetchCommentFailed(); } }); } else { fetchCommentListener.onFetchCommentFailed(); } } @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { fetchCommentListener.onFetchCommentFailed(); } }); } public static void fetchMoreComment(Executor executor, Handler handler, Retrofit retrofit, @Nullable String accessToken, @NonNull String accountName, ArrayList allChildren, boolean expandChildren, String postFullName, SortType.Type sortType, FetchMoreCommentListener fetchMoreCommentListener) { if (allChildren == null) { return; } String childrenIds = String.join(",", allChildren); if (childrenIds.isEmpty()) { return; } RedditAPI api = retrofit.create(RedditAPI.class); Call moreComments; if (accountName.equals(Account.ANONYMOUS_ACCOUNT)) { moreComments = api.moreChildren(postFullName, childrenIds, sortType); } else { moreComments = api.moreChildrenOauth(postFullName, childrenIds, sortType, APIUtils.getOAuthHeader(accessToken)); } moreComments.enqueue(new Callback<>() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { if (response.isSuccessful()) { ParseComment.parseMoreComment(executor, handler, response.body(), expandChildren, new ParseComment.ParseCommentListener() { @Override public void onParseCommentSuccess(ArrayList topLevelComments, ArrayList expandedComments, String parentId, ArrayList moreChildrenIds) { fetchMoreCommentListener.onFetchMoreCommentSuccess( topLevelComments, expandedComments, moreChildrenIds); } @Override public void onParseCommentFailed() { fetchMoreCommentListener.onFetchMoreCommentFailed(); } }); } else { fetchMoreCommentListener.onFetchMoreCommentFailed(); } } @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { fetchMoreCommentListener.onFetchMoreCommentFailed(); } }); } public interface FetchCommentListener { void onFetchCommentSuccess(ArrayList expandedComments, String parentId, ArrayList children); void onFetchCommentFailed(); } public interface FetchMoreCommentListener { void onFetchMoreCommentSuccess(ArrayList topLevelComments, ArrayList expandedComments, ArrayList moreChildrenIds); void onFetchMoreCommentFailed(); } }