Change some methods related to parsing data to static methods. Preparing to use Retrofit to send API requests. Already made a change to use Retrofit to fetch comments.

This commit is contained in:
Alex Ning 2018-08-27 23:05:56 +08:00
parent 41b243be7d
commit a6a951732d
16 changed files with 164 additions and 158 deletions

Binary file not shown.

View File

@ -57,4 +57,5 @@ dependencies {
implementation 'io.reactivex.rxjava2:rxjava:2.2.0' implementation 'io.reactivex.rxjava2:rxjava:2.2.0'
implementation 'org.sufficientlysecure:html-textview:3.6' implementation 'org.sufficientlysecure:html-textview:3.6'
implementation 'com.squareup.retrofit2:retrofit:2.4.0' implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.4.0'
} }

View File

@ -1,12 +1,13 @@
package ml.docilealligator.infinityforreddit; package ml.docilealligator.infinityforreddit;
import android.net.Uri; import android.support.annotation.NonNull;
import android.util.Log;
import com.android.volley.Request; import retrofit2.Call;
import com.android.volley.RequestQueue; import retrofit2.Callback;
import com.android.volley.Response; import retrofit2.Response;
import com.android.volley.VolleyError; import retrofit2.Retrofit;
import com.android.volley.toolbox.StringRequest; import retrofit2.converter.scalars.ScalarsConverterFactory;
class FetchComment { class FetchComment {
interface FetchCommentListener { interface FetchCommentListener {
@ -14,36 +15,34 @@ class FetchComment {
void onFetchCommentFail(); void onFetchCommentFail();
} }
private RequestQueue requestQueue; private String subredditNamePrefixed;
private String subredditName;
private String article; private String article;
private FetchCommentListener mFetchCommentListener;
FetchComment(RequestQueue requestQueue, String subredditName, String article) { FetchComment(String subredditNamePrefixed, String article) {
this.requestQueue = requestQueue; this.subredditNamePrefixed = subredditNamePrefixed;
this.subredditName = subredditName;
this.article = article; this.article = article;
} }
void queryComment(FetchCommentListener fetchCommentListener) { void queryComment(final FetchCommentListener fetchCommentListener) {
mFetchCommentListener = fetchCommentListener; Retrofit retrofit = new Retrofit.Builder()
.baseUrl(RedditUtils.API_BASE_URI)
Uri uri = Uri.parse(RedditUtils.getQueryCommentUrl(subredditName, article)) .addConverterFactory(ScalarsConverterFactory.create())
.buildUpon().appendQueryParameter(RedditUtils.RAW_JSON_KEY, RedditUtils.RAW_JSON_VALUE)
.build(); .build();
StringRequest commentRequest = new StringRequest(Request.Method.GET, uri.toString(), new Response.Listener<String>() { RedditAPI api = retrofit.create(RedditAPI.class);
Call<String> comments = api.getComments(subredditNamePrefixed, article);
comments.enqueue(new Callback<String>() {
@Override @Override
public void onResponse(String response) { public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
mFetchCommentListener.onFetchCommentSuccess(response); fetchCommentListener.onFetchCommentSuccess(response.body());
} }
}, new Response.ErrorListener() {
@Override @Override
public void onErrorResponse(VolleyError error) { public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
mFetchCommentListener.onFetchCommentFail(); Log.i("call failed", t.getMessage());
fetchCommentListener.onFetchCommentFail();
} }
}) {}; });
commentRequest.setTag(FetchComment.class);
requestQueue.add(commentRequest);
} }
} }

View File

@ -55,7 +55,7 @@ class FetchSubscribedThing {
StringRequest commentRequest = new StringRequest(Request.Method.GET, uri.toString(), new Response.Listener<String>() { StringRequest commentRequest = new StringRequest(Request.Method.GET, uri.toString(), new Response.Listener<String>() {
@Override @Override
public void onResponse(String response) { public void onResponse(String response) {
new ParseSubscribedThing().parseSubscribedSubreddits(response, mSubscribedSubredditData, ParseSubscribedThing.parseSubscribedSubreddits(response, mSubscribedSubredditData,
mSubscribedUserData, mSubredditData, mSubscribedUserData, mSubredditData,
new ParseSubscribedThing.ParseSubscribedSubredditsListener() { new ParseSubscribedThing.ParseSubscribedSubredditsListener() {

View File

@ -62,8 +62,8 @@ class JSONUtils {
static final String SUBREDDIT_TYPE_KEY = "subreddit_type"; static final String SUBREDDIT_TYPE_KEY = "subreddit_type";
static final String SUBREDDIT_TYPE_VALUE_USER = "user"; static final String SUBREDDIT_TYPE_VALUE_USER = "user";
static final String SUBSCRIBERS_KEY = "subscribers"; static final String SUBSCRIBERS_KEY = "subscribers";
static final String PUBLIC_DESCRIPTION = "public_description"; static final String PUBLIC_DESCRIPTION_KEY = "public_description";
static final String ACTIVE_USER_COUNT = "active_user_count"; static final String ACTIVE_USER_COUNT_KEY = "active_user_count";
static final String DISPLAY_NAME_PREFIXED = "display_name_prefixed"; static final String DISPLAY_NAME_PREFIXED_KEY = "display_name_prefixed";
static final String LINK_ID = "link_id"; static final String LINK_ID_KEY = "link_id";
} }

View File

@ -17,7 +17,6 @@ import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
@ -185,7 +184,7 @@ public class MainActivity extends AppCompatActivity {
new FetchUserInfo(this, Volley.newRequestQueue(this)).queryUserInfo(new FetchUserInfo.FetchUserInfoListener() { new FetchUserInfo(this, Volley.newRequestQueue(this)).queryUserInfo(new FetchUserInfo.FetchUserInfoListener() {
@Override @Override
public void onFetchUserInfoSuccess(String response) { public void onFetchUserInfoSuccess(String response) {
new ParseUserInfo().parseUserInfo(response, new ParseUserInfo.ParseUserInfoListener() { ParseUserInfo.parseUserInfo(response, new ParseUserInfo.ParseUserInfoListener() {
@Override @Override
public void onParseUserInfoSuccess(String name, String profileImageUrl, String bannerImageUrl, int karma) { public void onParseUserInfoSuccess(String name, String profileImageUrl, String bannerImageUrl, int karma) {
mNameTextView.setText(name); mNameTextView.setText(name);

View File

@ -1,6 +1,5 @@
package ml.docilealligator.infinityforreddit; package ml.docilealligator.infinityforreddit;
import android.content.Context;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.util.Log; import android.util.Log;
@ -11,6 +10,7 @@ import org.json.JSONObject;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Locale;
class ParseComment { class ParseComment {
interface ParseCommentListener { interface ParseCommentListener {
@ -18,31 +18,30 @@ class ParseComment {
void onParseCommentFail(); void onParseCommentFail();
} }
private Context mContext; static void parseComment(String response, ArrayList<CommentData> commentData, Locale locale, ParseCommentListener parseCommentListener) {
private ParseCommentListener mParseCommentListener; new ParseCommentAsyncTask(response, commentData, locale, parseCommentListener).execute();
void parseComment(Context context, String response, ArrayList<CommentData> commentData, ParseCommentListener parseCommentListener) {
mParseCommentListener = parseCommentListener;
mContext = context;
new ParseCommentAsyncTask(response, commentData).execute();
} }
private class ParseCommentAsyncTask extends AsyncTask<Void, Void, Void> { private static class ParseCommentAsyncTask extends AsyncTask<Void, Void, Void> {
private JSONArray jsonResponse; private JSONArray jsonResponse;
private ArrayList<CommentData> commentData; private ArrayList<CommentData> commentData;
private ArrayList<CommentData> newcommentData; private ArrayList<CommentData> newcommentData;
private Locale locale;
private ParseCommentListener parseCommentListener;
private boolean parseFailed; private boolean parseFailed;
int moreCommentCount; private int moreCommentCount;
ParseCommentAsyncTask(String response, ArrayList<CommentData> commentData){ ParseCommentAsyncTask(String response, ArrayList<CommentData> commentData, Locale locale, ParseCommentListener parseCommentListener){
try { try {
jsonResponse = new JSONArray(response); jsonResponse = new JSONArray(response);
this.commentData = commentData; this.commentData = commentData;
newcommentData = new ArrayList<>(); newcommentData = new ArrayList<>();
this.locale = locale;
this.parseCommentListener = parseCommentListener;
parseFailed = false; parseFailed = false;
} catch (JSONException e) { } catch (JSONException e) {
Log.i("comment json error", e.getMessage()); Log.i("comment json error", e.getMessage());
mParseCommentListener.onParseCommentFail(); parseCommentListener.onParseCommentFail();
} }
} }
@ -69,7 +68,7 @@ class ParseComment {
for (int i = 0; i < actualCommentLength; i++) { for (int i = 0; i < actualCommentLength; i++) {
JSONObject data = allComments.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY); JSONObject data = allComments.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY);
String fullName = data.getString(JSONUtils.LINK_ID); String fullName = data.getString(JSONUtils.LINK_ID_KEY);
String author = data.getString(JSONUtils.AUTHOR_KEY); String author = data.getString(JSONUtils.AUTHOR_KEY);
boolean isSubmitter = data.getBoolean(JSONUtils.IS_SUBMITTER_KEY); boolean isSubmitter = data.getBoolean(JSONUtils.IS_SUBMITTER_KEY);
String commentContent = ""; String commentContent = "";
@ -84,7 +83,7 @@ class ParseComment {
Calendar submitTimeCalendar = Calendar.getInstance(); Calendar submitTimeCalendar = Calendar.getInstance();
submitTimeCalendar.setTimeInMillis(submitTime); submitTimeCalendar.setTimeInMillis(submitTime);
String formattedSubmitTime = new SimpleDateFormat("MMM d, YYYY, HH:mm", String formattedSubmitTime = new SimpleDateFormat("MMM d, YYYY, HH:mm",
mContext.getResources().getConfiguration().locale).format(submitTimeCalendar.getTime()); locale).format(submitTimeCalendar.getTime());
int depth = data.getInt(JSONUtils.DEPTH_KEY); int depth = data.getInt(JSONUtils.DEPTH_KEY);
boolean collapsed = data.getBoolean(JSONUtils.COLLAPSED_KEY); boolean collapsed = data.getBoolean(JSONUtils.COLLAPSED_KEY);
@ -103,9 +102,9 @@ class ParseComment {
protected void onPostExecute(Void aVoid) { protected void onPostExecute(Void aVoid) {
if(!parseFailed) { if(!parseFailed) {
commentData.addAll(newcommentData); commentData.addAll(newcommentData);
mParseCommentListener.onParseCommentSuccess(commentData, moreCommentCount); parseCommentListener.onParseCommentSuccess(commentData, moreCommentCount);
} else { } else {
mParseCommentListener.onParseCommentFail(); parseCommentListener.onParseCommentFail();
} }
} }
} }

View File

@ -1,9 +1,7 @@
package ml.docilealligator.infinityforreddit; package ml.docilealligator.infinityforreddit;
import android.content.Context;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.util.Log; import android.util.Log;
import android.widget.Toast;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
@ -12,6 +10,7 @@ import org.json.JSONObject;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Locale;
/** /**
* Created by alex on 3/21/18. * Created by alex on 3/21/18.
@ -24,34 +23,31 @@ class ParsePost {
void onParsePostFail(); void onParsePostFail();
} }
private Context mContext; static void parsePost(String response, ArrayList<PostData> postData, Locale locale,
private ParsePostListener mParseBetPostListener; ParsePostListener parsePostListener) {
new ParsePostDataAsyncTask(response, postData, locale, parsePostListener).execute();
ParsePost(Context context, ParsePostListener parsePostListener) {
mContext = context;
mParseBetPostListener = parsePostListener;
} }
void parsePost(String response, ArrayList<PostData> postData) { private static class ParsePostDataAsyncTask extends AsyncTask<Void, Void, Void> {
new ParsePostDataAsyncTask(response, postData).execute();
}
private class ParsePostDataAsyncTask extends AsyncTask<Void, Void, Void> {
private JSONObject jsonResponse; private JSONObject jsonResponse;
private ArrayList<PostData> postData; private ArrayList<PostData> postData;
private Locale locale;
private ParsePostListener parsePostListener;
private ArrayList<PostData> newPostData; private ArrayList<PostData> newPostData;
private String lastItem; private String lastItem;
private boolean parseFailed; private boolean parseFailed;
ParsePostDataAsyncTask(String response, ArrayList<PostData> postData) { ParsePostDataAsyncTask(String response, ArrayList<PostData> postData, Locale locale,
ParsePostListener parsePostListener) {
try { try {
jsonResponse = new JSONObject(response); jsonResponse = new JSONObject(response);
this.postData = postData; this.postData = postData;
this.locale = locale;
this.parsePostListener = parsePostListener;
newPostData = new ArrayList<>(); newPostData = new ArrayList<>();
parseFailed = false; parseFailed = false;
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); e.printStackTrace();
Toast.makeText(mContext, "Error converting response to JSON", Toast.LENGTH_SHORT).show();
} }
} }
@ -82,7 +78,7 @@ class ParsePost {
Calendar postTimeCalendar = Calendar.getInstance(); Calendar postTimeCalendar = Calendar.getInstance();
postTimeCalendar.setTimeInMillis(postTime); postTimeCalendar.setTimeInMillis(postTime);
String formattedPostTime = new SimpleDateFormat("MMM d, YYYY, HH:mm", String formattedPostTime = new SimpleDateFormat("MMM d, YYYY, HH:mm",
mContext.getResources().getConfiguration().locale).format(postTimeCalendar.getTime()); locale).format(postTimeCalendar.getTime());
String permalink = data.getString(JSONUtils.PERMALINK_KEY); String permalink = data.getString(JSONUtils.PERMALINK_KEY);
String previewUrl = ""; String previewUrl = "";
@ -102,8 +98,7 @@ class ParsePost {
} }
} }
} catch (JSONException e) { } catch (JSONException e) {
Log.e("error", e.getMessage()); Log.e("best post parse error", e.getMessage());
Log.i("Best post", "Error parsing data");
parseFailed = true; parseFailed = true;
} }
return null; return null;
@ -113,14 +108,14 @@ class ParsePost {
protected void onPostExecute(Void aVoid) { protected void onPostExecute(Void aVoid) {
if(!parseFailed) { if(!parseFailed) {
postData.addAll(newPostData); postData.addAll(newPostData);
mParseBetPostListener.onParsePostSuccess(postData, lastItem); parsePostListener.onParsePostSuccess(postData, lastItem);
} else { } else {
mParseBetPostListener.onParsePostFail(); parsePostListener.onParsePostFail();
} }
} }
} }
private void parseData(JSONObject data, String permalink, ArrayList<PostData> bestPostData, private static void parseData(JSONObject data, String permalink, ArrayList<PostData> bestPostData,
String id, String fullName, String subredditNamePrefixed, String formattedPostTime, String id, String fullName, String subredditNamePrefixed, String formattedPostTime,
String title, String previewUrl, int score, int voteType, int gilded, String title, String previewUrl, int score, int voteType, int gilded,
boolean nsfw, boolean stickied, int i) throws JSONException { boolean nsfw, boolean stickied, int i) throws JSONException {

View File

@ -12,11 +12,8 @@ class ParseSubredditData {
void onParseSubredditDataFail(); void onParseSubredditDataFail();
} }
private ParseSubredditDataListener mParseSubredditDataListener; static void parseComment(String response, ParseSubredditDataListener parseSubredditDataListener) {
new ParseSubredditDataAsyncTask(response, parseSubredditDataListener).execute();
void parseComment(String response, ParseSubredditDataListener parseSubredditDataListener) {
mParseSubredditDataListener = parseSubredditDataListener;
new ParseSubredditDataAsyncTask(response, mParseSubredditDataListener).execute();
} }
private static class ParseSubredditDataAsyncTask extends AsyncTask<Void, Void, Void> { private static class ParseSubredditDataAsyncTask extends AsyncTask<Void, Void, Void> {
@ -42,8 +39,8 @@ class ParseSubredditData {
try { try {
JSONObject data = jsonResponse.getJSONObject(JSONUtils.DATA_KEY); JSONObject data = jsonResponse.getJSONObject(JSONUtils.DATA_KEY);
String id = data.getString(JSONUtils.NAME_KEY); String id = data.getString(JSONUtils.NAME_KEY);
String subredditFullName = data.getString(JSONUtils.DISPLAY_NAME_PREFIXED); String subredditFullName = data.getString(JSONUtils.DISPLAY_NAME_PREFIXED_KEY);
String description = data.getString(JSONUtils.PUBLIC_DESCRIPTION).trim(); String description = data.getString(JSONUtils.PUBLIC_DESCRIPTION_KEY).trim();
String bannerImageUrl = data.getString(JSONUtils.BANNER_BACKGROUND_IMAGE_KEY); String bannerImageUrl = data.getString(JSONUtils.BANNER_BACKGROUND_IMAGE_KEY);
if(bannerImageUrl.equals("") || bannerImageUrl.equals("null")) { if(bannerImageUrl.equals("") || bannerImageUrl.equals("null")) {
bannerImageUrl= data.getString(JSONUtils.BANNER_IMG_KEY); bannerImageUrl= data.getString(JSONUtils.BANNER_IMG_KEY);
@ -59,7 +56,7 @@ class ParseSubredditData {
} }
} }
int nSubscribers = data.getInt(JSONUtils.SUBSCRIBERS_KEY); int nSubscribers = data.getInt(JSONUtils.SUBSCRIBERS_KEY);
int nCurrentOnlineSubscribers = data.getInt(JSONUtils.ACTIVE_USER_COUNT); int nCurrentOnlineSubscribers = data.getInt(JSONUtils.ACTIVE_USER_COUNT_KEY);
subredditData = new SubredditData(id, subredditFullName, iconUrl, bannerImageUrl, description, nSubscribers); subredditData = new SubredditData(id, subredditFullName, iconUrl, bannerImageUrl, description, nSubscribers);
mNCurrentOnlineSubscribers = nCurrentOnlineSubscribers; mNCurrentOnlineSubscribers = nCurrentOnlineSubscribers;
} catch (JSONException e) { } catch (JSONException e) {

View File

@ -18,7 +18,7 @@ class ParseSubscribedThing {
void onParseSubscribedSubredditsFail(); void onParseSubscribedSubredditsFail();
} }
void parseSubscribedSubreddits(String response, ArrayList<SubscribedSubredditData> subscribedSubredditData, static void parseSubscribedSubreddits(String response, ArrayList<SubscribedSubredditData> subscribedSubredditData,
ArrayList<SubscribedUserData> subscribedUserData, ArrayList<SubscribedUserData> subscribedUserData,
ArrayList<SubredditData> subredditData, ArrayList<SubredditData> subredditData,
ParseSubscribedSubredditsListener parseSubscribedSubredditsListener) { ParseSubscribedSubredditsListener parseSubscribedSubredditsListener) {
@ -92,8 +92,8 @@ class ParseSubscribedThing {
//It's a user //It's a user
newSubscribedUserData.add(new SubscribedUserData(id, name.substring(2), iconUrl)); newSubscribedUserData.add(new SubscribedUserData(id, name.substring(2), iconUrl));
} else { } else {
String subredditFullName = data.getString(JSONUtils.DISPLAY_NAME_PREFIXED); String subredditFullName = data.getString(JSONUtils.DISPLAY_NAME_PREFIXED_KEY);
String description = data.getString(JSONUtils.PUBLIC_DESCRIPTION).trim(); String description = data.getString(JSONUtils.PUBLIC_DESCRIPTION_KEY).trim();
int nSubscribers = data.getInt(JSONUtils.SUBSCRIBERS_KEY); int nSubscribers = data.getInt(JSONUtils.SUBSCRIBERS_KEY);
newSubscribedSubredditData.add(new SubscribedSubredditData(id, name, iconUrl)); newSubscribedSubredditData.add(new SubscribedSubredditData(id, name, iconUrl));
newSubredditData.add(new SubredditData(id, subredditFullName, iconUrl, bannerImageUrl, description, nSubscribers)); newSubredditData.add(new SubredditData(id, subredditFullName, iconUrl, bannerImageUrl, description, nSubscribers));

View File

@ -13,15 +13,13 @@ class ParseUserInfo {
void onParseUserInfoFail(); void onParseUserInfoFail();
} }
private ParseUserInfoListener mParseUserInfoListener; static void parseUserInfo(String response, ParseUserInfoListener parseUserInfoListener) {
new ParseUserInfoAsyncTask(response, parseUserInfoListener).execute();
void parseUserInfo(String response, ParseUserInfoListener parseUserInfoListener) {
mParseUserInfoListener = parseUserInfoListener;
new ParseUserInfoAsyncTask(response).execute();
} }
private class ParseUserInfoAsyncTask extends AsyncTask<Void, Void, Void> { private static class ParseUserInfoAsyncTask extends AsyncTask<Void, Void, Void> {
private JSONObject jsonResponse; private JSONObject jsonResponse;
private ParseUserInfoListener parseUserInfoListener;
private boolean parseFailed; private boolean parseFailed;
private String name; private String name;
@ -29,13 +27,14 @@ class ParseUserInfo {
private String bannerImageUrl; private String bannerImageUrl;
private int karma; private int karma;
ParseUserInfoAsyncTask(String response){ ParseUserInfoAsyncTask(String response, ParseUserInfoListener parseUserInfoListener){
try { try {
jsonResponse = new JSONObject(response); jsonResponse = new JSONObject(response);
this.parseUserInfoListener = parseUserInfoListener;
parseFailed = false; parseFailed = false;
} catch (JSONException e) { } catch (JSONException e) {
Log.i("user info json error", e.getMessage()); Log.i("user info json error", e.getMessage());
mParseUserInfoListener.onParseUserInfoFail(); parseUserInfoListener.onParseUserInfoFail();
} }
} }
@ -58,9 +57,9 @@ class ParseUserInfo {
@Override @Override
protected void onPostExecute(Void aVoid) { protected void onPostExecute(Void aVoid) {
if(!parseFailed) { if(!parseFailed) {
mParseUserInfoListener.onParseUserInfoSuccess(name, profileImageUrl, bannerImageUrl, karma); parseUserInfoListener.onParseUserInfoSuccess(name, profileImageUrl, bannerImageUrl, karma);
} else { } else {
mParseUserInfoListener.onParseUserInfoFail(); parseUserInfoListener.onParseUserInfoFail();
} }
} }
} }

View File

@ -77,7 +77,8 @@ public class PostFragment extends Fragment {
getActivity(), mLinearLayoutManager, mAdapter, mLastItem, mPostData, getActivity(), mLinearLayoutManager, mAdapter, mLastItem, mPostData,
mPaginationSynchronizer, mAcquireAccessTokenRequestQueue, mPaginationSynchronizer, mAcquireAccessTokenRequestQueue,
mQueryPostUrl, mIsBestPost, mQueryPostUrl, mIsBestPost,
mPaginationSynchronizer.isLoading(), mPaginationSynchronizer.isLoadSuccess())); mPaginationSynchronizer.isLoading(), mPaginationSynchronizer.isLoadSuccess(),
getResources().getConfiguration().locale));
mProgressBar.setVisibility(View.GONE); mProgressBar.setVisibility(View.GONE);
} else { } else {
if(mIsBestPost) { if(mIsBestPost) {
@ -196,29 +197,31 @@ public class PostFragment extends Fragment {
ClipData clip = ClipData.newPlainText("response", response); ClipData clip = ClipData.newPlainText("response", response);
clipboard.setPrimaryClip(clip); clipboard.setPrimaryClip(clip);
//new ParsePostDataAsyncTask(response, accessToken).execute(); //new ParsePostDataAsyncTask(response, accessToken).execute();
new ParsePost(getActivity(), new ParsePost.ParsePostListener() { ParsePost.parsePost(response, new ArrayList<PostData>(),
@Override getResources().getConfiguration().locale, new ParsePost.ParsePostListener() {
public void onParsePostSuccess(ArrayList<PostData> postData, String lastItem) { @Override
mPostData = postData; public void onParsePostSuccess(ArrayList<PostData> postData, String lastItem) {
mLastItem = lastItem; mPostData = postData;
mAdapter = new PostRecyclerViewAdapter(getActivity(), postData, mPaginationSynchronizer, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue); mLastItem = lastItem;
mAdapter = new PostRecyclerViewAdapter(getActivity(), postData, mPaginationSynchronizer, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue);
mPostRecyclerView.setAdapter(mAdapter); mPostRecyclerView.setAdapter(mAdapter);
mPostRecyclerView.addOnScrollListener(new PostPaginationScrollListener( mPostRecyclerView.addOnScrollListener(new PostPaginationScrollListener(
getActivity(), mLinearLayoutManager, mAdapter, lastItem, postData, getActivity(), mLinearLayoutManager, mAdapter, lastItem, postData,
mPaginationSynchronizer, mAcquireAccessTokenRequestQueue, mPaginationSynchronizer, mAcquireAccessTokenRequestQueue,
mQueryPostUrl, mIsBestPost, mQueryPostUrl, mIsBestPost,
mPaginationSynchronizer.isLoading(), mPaginationSynchronizer.isLoadSuccess())); mPaginationSynchronizer.isLoading(), mPaginationSynchronizer.isLoadSuccess(),
mProgressBar.setVisibility(View.GONE); getResources().getConfiguration().locale));
} mProgressBar.setVisibility(View.GONE);
}
@Override @Override
public void onParsePostFail() { public void onParsePostFail() {
Toast.makeText(getActivity(), "Error parsing data", Toast.LENGTH_SHORT).show(); Toast.makeText(getActivity(), "Error parsing data", Toast.LENGTH_SHORT).show();
Log.i("Post fetch error", "Error parsing data"); Log.i("Post fetch error", "Error parsing data");
mProgressBar.setVisibility(View.GONE); mProgressBar.setVisibility(View.GONE);
} }
}).parsePost(response, new ArrayList<PostData>()); });
} }
} }
}, new Response.ErrorListener() { }, new Response.ErrorListener() {
@ -273,29 +276,31 @@ public class PostFragment extends Fragment {
ClipData clip = ClipData.newPlainText("response", response); ClipData clip = ClipData.newPlainText("response", response);
clipboard.setPrimaryClip(clip); clipboard.setPrimaryClip(clip);
//new ParsePostDataAsyncTask(response, accessToken).execute(); //new ParsePostDataAsyncTask(response, accessToken).execute();
new ParsePost(getActivity(), new ParsePost.ParsePostListener() { ParsePost.parsePost(response, new ArrayList<PostData>(),
@Override getResources().getConfiguration().locale, new ParsePost.ParsePostListener() {
public void onParsePostSuccess(ArrayList<PostData> postData, String lastItem) { @Override
mPostData = postData; public void onParsePostSuccess(ArrayList<PostData> postData, String lastItem) {
mLastItem = lastItem; mPostData = postData;
mAdapter = new PostRecyclerViewAdapter(getActivity(), postData, mPaginationSynchronizer, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue); mLastItem = lastItem;
mAdapter = new PostRecyclerViewAdapter(getActivity(), postData, mPaginationSynchronizer, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue);
mPostRecyclerView.setAdapter(mAdapter); mPostRecyclerView.setAdapter(mAdapter);
mPostRecyclerView.addOnScrollListener(new PostPaginationScrollListener( mPostRecyclerView.addOnScrollListener(new PostPaginationScrollListener(
getActivity(), mLinearLayoutManager, mAdapter, lastItem, postData, getActivity(), mLinearLayoutManager, mAdapter, lastItem, postData,
mPaginationSynchronizer, mAcquireAccessTokenRequestQueue, mPaginationSynchronizer, mAcquireAccessTokenRequestQueue,
mQueryPostUrl, mIsBestPost, mQueryPostUrl, mIsBestPost,
mPaginationSynchronizer.isLoading(), mPaginationSynchronizer.isLoadSuccess())); mPaginationSynchronizer.isLoading(), mPaginationSynchronizer.isLoadSuccess(),
mProgressBar.setVisibility(View.GONE); getResources().getConfiguration().locale));
} mProgressBar.setVisibility(View.GONE);
}
@Override @Override
public void onParsePostFail() { public void onParsePostFail() {
Toast.makeText(getActivity(), "Error parsing data", Toast.LENGTH_SHORT).show(); Toast.makeText(getActivity(), "Error parsing data", Toast.LENGTH_SHORT).show();
Log.i("Post fetch error", "Error parsing data"); Log.i("Post fetch error", "Error parsing data");
mProgressBar.setVisibility(View.GONE); mProgressBar.setVisibility(View.GONE);
} }
}).parsePost(response, new ArrayList<PostData>()); });
} }
} }
}, new Response.ErrorListener() { }, new Response.ErrorListener() {

View File

@ -19,6 +19,7 @@ import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley; import com.android.volley.toolbox.Volley;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Locale;
import java.util.Map; import java.util.Map;
/** /**
@ -39,6 +40,7 @@ class PostPaginationScrollListener extends RecyclerView.OnScrollListener {
private boolean isBestPost; private boolean isBestPost;
private boolean isLoading; private boolean isLoading;
private boolean loadSuccess; private boolean loadSuccess;
private Locale locale;
private String mLastItem; private String mLastItem;
private RequestQueue mRequestQueue; private RequestQueue mRequestQueue;
private RequestQueue mAcquireAccessTokenRequestQueue; private RequestQueue mAcquireAccessTokenRequestQueue;
@ -46,7 +48,7 @@ class PostPaginationScrollListener extends RecyclerView.OnScrollListener {
PostPaginationScrollListener(Context context, LinearLayoutManager layoutManager, PostRecyclerViewAdapter adapter, PostPaginationScrollListener(Context context, LinearLayoutManager layoutManager, PostRecyclerViewAdapter adapter,
String lastItem, ArrayList<PostData> postData, PaginationSynchronizer paginationSynchronizer, String lastItem, ArrayList<PostData> postData, PaginationSynchronizer paginationSynchronizer,
RequestQueue acquireAccessTokenRequestQueue, final String queryPostUrl, RequestQueue acquireAccessTokenRequestQueue, final String queryPostUrl,
final boolean isBestPost, boolean isLoading, boolean loadSuccess) { final boolean isBestPost, boolean isLoading, boolean loadSuccess, Locale locale) {
if(context != null) { if(context != null) {
this.mContext = context; this.mContext = context;
this.mLayoutManager = layoutManager; this.mLayoutManager = layoutManager;
@ -59,6 +61,7 @@ class PostPaginationScrollListener extends RecyclerView.OnScrollListener {
this.isBestPost = isBestPost; this.isBestPost = isBestPost;
this.isLoading = isLoading; this.isLoading = isLoading;
this.loadSuccess = loadSuccess; this.loadSuccess = loadSuccess;
this.locale = locale;
mRequestQueue = Volley.newRequestQueue(mContext); mRequestQueue = Volley.newRequestQueue(mContext);
mAcquireAccessTokenRequestQueue = Volley.newRequestQueue(mContext); mAcquireAccessTokenRequestQueue = Volley.newRequestQueue(mContext);
@ -117,7 +120,7 @@ class PostPaginationScrollListener extends RecyclerView.OnScrollListener {
ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE); ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("response", response); ClipData clip = ClipData.newPlainText("response", response);
clipboard.setPrimaryClip(clip); clipboard.setPrimaryClip(clip);
new ParsePost(mContext, new ParsePost.ParsePostListener() { ParsePost.parsePost(response, mPostData, locale, new ParsePost.ParsePostListener() {
@Override @Override
public void onParsePostSuccess(ArrayList<PostData> bestPostData, String lastItem) { public void onParsePostSuccess(ArrayList<PostData> bestPostData, String lastItem) {
mAdapter.notifyDataSetChanged(); mAdapter.notifyDataSetChanged();
@ -136,7 +139,7 @@ class PostPaginationScrollListener extends RecyclerView.OnScrollListener {
Log.i("Best post", "Error parsing data"); Log.i("Best post", "Error parsing data");
loadFailed(); loadFailed();
} }
}).parsePost(response, mPostData); });
} }
}, new Response.ErrorListener() { }, new Response.ErrorListener() {
@Override @Override
@ -190,7 +193,7 @@ class PostPaginationScrollListener extends RecyclerView.OnScrollListener {
ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE); ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("response", response); ClipData clip = ClipData.newPlainText("response", response);
clipboard.setPrimaryClip(clip); clipboard.setPrimaryClip(clip);
new ParsePost(mContext, new ParsePost.ParsePostListener() { ParsePost.parsePost(response, mPostData, locale, new ParsePost.ParsePostListener() {
@Override @Override
public void onParsePostSuccess(ArrayList<PostData> bestPostData, String lastItem) { public void onParsePostSuccess(ArrayList<PostData> bestPostData, String lastItem) {
mAdapter.notifyDataSetChanged(); mAdapter.notifyDataSetChanged();
@ -209,7 +212,7 @@ class PostPaginationScrollListener extends RecyclerView.OnScrollListener {
Log.i("Best post", "Error parsing data"); Log.i("Best post", "Error parsing data");
loadFailed(); loadFailed();
} }
}).parsePost(response, mPostData); });
} }
}, new Response.ErrorListener() { }, new Response.ErrorListener() {
@Override @Override

View File

@ -0,0 +1,10 @@
package ml.docilealligator.infinityforreddit;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Path;
public interface RedditAPI {
@GET("{subredditNamePrefixed}/comments/{article}.json?raw_json=1")
Call<String> getComments(@Path("subredditNamePrefixed") String subredditNamePrefixed, @Path("article") String article);
}

View File

@ -61,7 +61,6 @@ public class ViewPostDetailActivity extends AppCompatActivity {
private RequestQueue mVoteThingRequestQueue; private RequestQueue mVoteThingRequestQueue;
private RequestQueue mAcquireAccessTokenRequestQueue; private RequestQueue mAcquireAccessTokenRequestQueue;
private RequestQueue mCommentQueue;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -143,7 +142,6 @@ public class ViewPostDetailActivity extends AppCompatActivity {
mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
mVoteThingRequestQueue = Volley.newRequestQueue(this); mVoteThingRequestQueue = Volley.newRequestQueue(this);
mAcquireAccessTokenRequestQueue = Volley.newRequestQueue(this); mAcquireAccessTokenRequestQueue = Volley.newRequestQueue(this);
mCommentQueue = Volley.newRequestQueue(this);
subredditTextView.setText(mPostData.getSubredditNamePrefixed()); subredditTextView.setText(mPostData.getSubredditNamePrefixed());
postTimeTextView.setText(mPostData.getPostTime()); postTimeTextView.setText(mPostData.getPostTime());
@ -494,24 +492,25 @@ public class ViewPostDetailActivity extends AppCompatActivity {
private void queryComment() { private void queryComment() {
mCommentProgressbar.setVisibility(View.VISIBLE); mCommentProgressbar.setVisibility(View.VISIBLE);
mNoCommentWrapperLinearLayout.setVisibility(View.GONE); mNoCommentWrapperLinearLayout.setVisibility(View.GONE);
new FetchComment(mCommentQueue, mPostData.getSubredditNamePrefixed(), mPostData.getId()).queryComment(new FetchComment.FetchCommentListener() { new FetchComment(mPostData.getSubredditNamePrefixed(), mPostData.getId()).queryComment(new FetchComment.FetchCommentListener() {
@Override @Override
public void onFetchCommentSuccess(String response) { public void onFetchCommentSuccess(String response) {
new ParseComment().parseComment(ViewPostDetailActivity.this, response, new ArrayList<CommentData>(), new ParseComment.ParseCommentListener() { ParseComment.parseComment(response, new ArrayList<CommentData>(),
@Override getResources().getConfiguration().locale, new ParseComment.ParseCommentListener() {
public void onParseCommentSuccess(ArrayList<CommentData> commentData, int moreCommentCount) { @Override
mCommentProgressbar.setVisibility(View.GONE); public void onParseCommentSuccess(ArrayList<CommentData> commentData, int moreCommentCount) {
mMoreCommentCount = moreCommentCount; mCommentProgressbar.setVisibility(View.GONE);
if(commentData.size() > 0) { mMoreCommentCount = moreCommentCount;
CommentRecyclerViewAdapter adapter = new CommentRecyclerViewAdapter( if (commentData.size() > 0) {
ViewPostDetailActivity.this, commentData, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue); CommentRecyclerViewAdapter adapter = new CommentRecyclerViewAdapter(
mRecyclerView.setAdapter(adapter); ViewPostDetailActivity.this, commentData, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue);
mCommentCardView.setVisibility(View.VISIBLE); mRecyclerView.setAdapter(adapter);
} else { mCommentCardView.setVisibility(View.VISIBLE);
mNoCommentWrapperLinearLayout.setVisibility(View.VISIBLE); } else {
Glide.with(ViewPostDetailActivity.this).load(R.drawable.no_comment_indicator).into(mNoCommentImageView); mNoCommentWrapperLinearLayout.setVisibility(View.VISIBLE);
} Glide.with(ViewPostDetailActivity.this).load(R.drawable.no_comment_indicator).into(mNoCommentImageView);
} }
}
@Override @Override
public void onParseCommentFail() { public void onParseCommentFail() {

View File

@ -140,7 +140,7 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
new FetchSubredditData(Volley.newRequestQueue(this), subredditName).querySubredditData(new FetchSubredditData.FetchSubredditDataListener() { new FetchSubredditData(Volley.newRequestQueue(this), subredditName).querySubredditData(new FetchSubredditData.FetchSubredditDataListener() {
@Override @Override
public void onFetchSubredditDataSuccess(String response) { public void onFetchSubredditDataSuccess(String response) {
new ParseSubredditData().parseComment(response, new ParseSubredditData.ParseSubredditDataListener() { ParseSubredditData.parseComment(response, new ParseSubredditData.ParseSubredditDataListener() {
@Override @Override
public void onParseSubredditDataSuccess(SubredditData subredditData, int nCurrentOnlineSubscribers) { public void onParseSubredditDataSuccess(SubredditData subredditData, int nCurrentOnlineSubscribers) {
new InsertSubredditDataAsyncTask(SubredditRoomDatabase.getDatabase(ViewSubredditDetailActivity.this), subredditData) new InsertSubredditDataAsyncTask(SubredditRoomDatabase.getDatabase(ViewSubredditDetailActivity.this), subredditData)