From 4364e20e36aba6de96d25b237cac7c178a5e1980 Mon Sep 17 00:00:00 2001 From: Alex Ning Date: Thu, 30 Aug 2018 14:08:02 +0800 Subject: Display a custom error view when there is something wrong when loading best posts. Probably fix a bug that holder.getAdapterPosition() returns -1 when loading subreddit icons in the RecyclerView of PostFragment. Subreddit banners are parsed correctly in ParseSubscribedThing. Check if the api call is successful in onResponse. Rewrite some methods. --- .../infinityforreddit/FetchComment.java | 7 +- .../infinityforreddit/FetchSubredditData.java | 7 +- .../infinityforreddit/FetchSubscribedThing.java | 69 ++++++++++--------- .../infinityforreddit/FetchUserInfo.java | 27 +++++--- .../infinityforreddit/ParseSubscribedThing.java | 2 +- .../infinityforreddit/PostFragment.java | 80 +++++++++++++--------- .../infinityforreddit/PostRecyclerViewAdapter.java | 61 +++++++++-------- .../infinityforreddit/RedditUtils.java | 4 -- 8 files changed, 147 insertions(+), 110 deletions(-) (limited to 'app/src/main/java') diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchComment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchComment.java index 20a0d444..eb98a605 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchComment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchComment.java @@ -27,7 +27,12 @@ class FetchComment { comments.enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { - fetchCommentListener.onFetchCommentSuccess(response.body()); + if(response.isSuccessful()) { + fetchCommentListener.onFetchCommentSuccess(response.body()); + } else { + Log.i("call failed", response.message()); + fetchCommentListener.onFetchCommentFail(); + } } @Override diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchSubredditData.java b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchSubredditData.java index 5baaede9..105a7679 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchSubredditData.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchSubredditData.java @@ -27,7 +27,12 @@ class FetchSubredditData { subredditData.enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { - fetchSubredditDataListener.onFetchSubredditDataSuccess(response.body()); + if(response.isSuccessful()) { + fetchSubredditDataListener.onFetchSubredditDataSuccess(response.body()); + } else { + Log.i("call failed", response.message()); + fetchSubredditDataListener.onFetchSubredditDataFail(); + } } @Override diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchSubscribedThing.java b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchSubscribedThing.java index 03e30f5e..c5b6b6f5 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchSubscribedThing.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchSubscribedThing.java @@ -44,45 +44,52 @@ class FetchSubscribedThing { subredditDataCall.enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { - ParseSubscribedThing.parseSubscribedSubreddits(response.body(), subscribedSubredditData, - subscribedUserData, subredditData, - new ParseSubscribedThing.ParseSubscribedSubredditsListener() { + if(response.isSuccessful()) { + ParseSubscribedThing.parseSubscribedSubreddits(response.body(), subscribedSubredditData, + subscribedUserData, subredditData, + new ParseSubscribedThing.ParseSubscribedSubredditsListener() { - @Override - public void onParseSubscribedSubredditsSuccess(ArrayList subscribedSubredditData, - ArrayList subscribedUserData, - ArrayList subredditData, - String lastItem) { - if(lastItem.equals("null")) { - fetchSubscribedThingListener.onFetchSubscribedThingSuccess( - subscribedSubredditData, subscribedUserData, subredditData); - } else { - fetchSubscribedThing(context, lastItem, subscribedSubredditData, - subscribedUserData, subredditData, - fetchSubscribedThingListener, refreshTime); + @Override + public void onParseSubscribedSubredditsSuccess(ArrayList subscribedSubredditData, + ArrayList subscribedUserData, + ArrayList subredditData, + String lastItem) { + if(lastItem.equals("null")) { + fetchSubscribedThingListener.onFetchSubscribedThingSuccess( + subscribedSubredditData, subscribedUserData, subredditData); + } else { + fetchSubscribedThing(context, lastItem, subscribedSubredditData, + subscribedUserData, subredditData, + fetchSubscribedThingListener, refreshTime); + } } - } - @Override - public void onParseSubscribedSubredditsFail() { - fetchSubscribedThingListener.onFetchSubscribedThingFail(); - } - }); + @Override + public void onParseSubscribedSubredditsFail() { + fetchSubscribedThingListener.onFetchSubscribedThingFail(); + } + }); + } else if(response.code() == 401) { + RefreshAccessToken.refreshAccessToken(context, new RefreshAccessToken.RefreshAccessTokenListener() { + @Override + public void onRefreshAccessTokenSuccess() { + fetchSubscribedThing(context, lastItem, subscribedSubredditData, + subscribedUserData, subredditData, fetchSubscribedThingListener, refreshTime - 1); + } + + @Override + public void onRefreshAccessTokenFail() {} + }); + } else { + Log.i("call failed", response.message()); + fetchSubscribedThingListener.onFetchSubscribedThingFail(); + } } @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { Log.i("call failed", t.getMessage()); - RefreshAccessToken.refreshAccessToken(context, new RefreshAccessToken.RefreshAccessTokenListener() { - @Override - public void onRefreshAccessTokenSuccess() { - fetchSubscribedThing(context, lastItem, subscribedSubredditData, - subscribedUserData, subredditData, fetchSubscribedThingListener, refreshTime); - } - - @Override - public void onRefreshAccessTokenFail() {} - }); + fetchSubscribedThingListener.onFetchSubscribedThingFail(); } }); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchUserInfo.java b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchUserInfo.java index 45957308..9a1a8b4d 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchUserInfo.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchUserInfo.java @@ -34,21 +34,28 @@ class FetchUserInfo { userInfo.enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { - fetchUserInfoListener.onFetchUserInfoSuccess(response.body()); + if(response.isSuccessful()) { + fetchUserInfoListener.onFetchUserInfoSuccess(response.body()); + } else if(response.code() == 401){ + RefreshAccessToken.refreshAccessToken(context, new RefreshAccessToken.RefreshAccessTokenListener() { + @Override + public void onRefreshAccessTokenSuccess() { + fetchUserInfo(context, fetchUserInfoListener, refreshTime - 1); + } + + @Override + public void onRefreshAccessTokenFail() {} + }); + } else { + Log.i("call failed", response.message()); + fetchUserInfoListener.onFetchUserInfoFail(); + } } @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { Log.i("call failed", t.getMessage()); - RefreshAccessToken.refreshAccessToken(context, new RefreshAccessToken.RefreshAccessTokenListener() { - @Override - public void onRefreshAccessTokenSuccess() { - fetchUserInfo(context, fetchUserInfoListener, refreshTime - 1); - } - - @Override - public void onRefreshAccessTokenFail() {} - }); + fetchUserInfoListener.onFetchUserInfoFail(); } }); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubscribedThing.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubscribedThing.java index d4cc4030..2cddfc2f 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubscribedThing.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubscribedThing.java @@ -65,7 +65,7 @@ class ParseSubscribedThing { for(int i = 0; i < children.length(); i++) { JSONObject data = children.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY); String name = data.getString(JSONUtils.DISPLAY_NAME); - String bannerImageUrl = data.getString(JSONUtils.BANNER_IMG_KEY); + String bannerImageUrl = data.getString(JSONUtils.BANNER_BACKGROUND_IMAGE_KEY); if(bannerImageUrl.equals("") || bannerImageUrl.equals("null")) { bannerImageUrl= data.getString(JSONUtils.BANNER_IMG_KEY); if(bannerImageUrl.equals("null")) { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java index dc262abe..7d44eb31 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java @@ -16,8 +16,11 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.ProgressBar; -import android.widget.Toast; + +import com.bumptech.glide.Glide; import java.util.ArrayList; @@ -43,6 +46,8 @@ public class PostFragment extends Fragment { private String mLastItem; private PaginationSynchronizer mPaginationSynchronizer; private PostRecyclerViewAdapter mAdapter; + private LinearLayout mFetchPostErrorLinearLayout; + private ImageView mFetchPostErrorImageView; private boolean mIsBestPost; private String mSubredditName; @@ -73,7 +78,7 @@ public class PostFragment extends Fragment { if(mIsBestPost) { fetchBestPost(1); } else { - fetchPost(mSubredditName, 1); + fetchPost(); } } } @@ -108,6 +113,8 @@ public class PostFragment extends Fragment { mLinearLayoutManager = new LinearLayoutManager(getActivity()); mPostRecyclerView.setLayoutManager(mLinearLayoutManager); mProgressBar = rootView.findViewById(R.id.progress_bar_post_fragment); + mFetchPostErrorLinearLayout = rootView.findViewById(R.id.fetch_post_error_linear_layout_post_fragment); + mFetchPostErrorImageView = rootView.findViewById(R.id.fetch_post_error_image_view_post_fragment); /*FloatingActionButton fab = rootView.findViewById(R.id.fab_post_fragment); fab.setOnClickListener(new View.OnClickListener() { @Override @@ -120,6 +127,17 @@ public class PostFragment extends Fragment { mIsBestPost = getArguments().getBoolean(IS_BEST_POST_KEY); if(!mIsBestPost) { mSubredditName = getArguments().getString(SUBREDDIT_NAME_KEY); + } else { + mFetchPostErrorLinearLayout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(mIsBestPost) { + fetchBestPost(1); + } else { + fetchPost(); + } + } + }); } if(savedInstanceState != null && savedInstanceState.getParcelable(paginationSynchronizerState) != null) { @@ -129,7 +147,7 @@ public class PostFragment extends Fragment { if(mIsBestPost) { fetchBestPost(1); } else { - fetchPost(mSubredditName, 1); + fetchPost(); } } @@ -146,10 +164,11 @@ public class PostFragment extends Fragment { private void fetchBestPost(final int refreshTime) { if(refreshTime < 0) { - showErrorSnackbar(); + showErrorView(); return; } + mFetchPostErrorLinearLayout.setVisibility(View.GONE); mProgressBar.setVisibility(View.VISIBLE); Retrofit retrofit = new Retrofit.Builder() @@ -166,7 +185,6 @@ public class PostFragment extends Fragment { @Override public void onResponse(Call call, retrofit2.Response response) { if(getActivity() != null) { - if(response.isSuccessful()) { ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("response", response.body()); @@ -191,9 +209,8 @@ public class PostFragment extends Fragment { @Override public void onParsePostFail() { - Toast.makeText(getActivity(), "Error parsing data", Toast.LENGTH_SHORT).show(); Log.i("Post fetch error", "Error parsing data"); - mProgressBar.setVisibility(View.GONE); + showErrorView(); } }); } else if(response.code() == 401) { @@ -211,24 +228,20 @@ public class PostFragment extends Fragment { }); } else { Log.i("Post fetch error", response.message()); - showErrorSnackbar(); + showErrorView(); } } } @Override public void onFailure(Call call, Throwable t) { - showErrorSnackbar(); + showErrorView(); } }); } - private void fetchPost(final String queryPostUrl, final int refreshTime) { - if(refreshTime < 0) { - showErrorSnackbar(); - return; - } - + private void fetchPost() { + mFetchPostErrorLinearLayout.setVisibility(View.GONE); mProgressBar.setVisibility(View.VISIBLE); Retrofit retrofit = new Retrofit.Builder() @@ -242,7 +255,6 @@ public class PostFragment extends Fragment { @Override public void onResponse(Call call, retrofit2.Response response) { if(getActivity() != null) { - Log.i("response_code", Integer.toString(response.code())); if(response.isSuccessful()) { ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("response", response.body()); @@ -267,38 +279,42 @@ public class PostFragment extends Fragment { @Override public void onParsePostFail() { - Toast.makeText(getActivity(), "Error parsing data", Toast.LENGTH_SHORT).show(); Log.i("Post fetch error", "Error parsing data"); - mProgressBar.setVisibility(View.GONE); + showErrorView(); } }); } else { Log.i("Post fetch error", response.message()); - showErrorSnackbar(); + showErrorView(); } } } @Override public void onFailure(Call call, Throwable t) { - showErrorSnackbar(); + showErrorView(); } }); } - private void showErrorSnackbar() { + private void showErrorView() { mProgressBar.setVisibility(View.GONE); - Snackbar snackbar = Snackbar.make(mCoordinatorLayout, "Error getting post", Snackbar.LENGTH_INDEFINITE); - snackbar.setAction(R.string.retry, new View.OnClickListener() { - @Override - public void onClick(View view) { - if(mIsBestPost) { - fetchBestPost(1); - } else { - fetchPost(mSubredditName, 1); + if(mIsBestPost) { + mFetchPostErrorLinearLayout.setVisibility(View.VISIBLE); + Glide.with(this).load(R.drawable.load_post_error_indicator).into(mFetchPostErrorImageView); + } else { + Snackbar snackbar = Snackbar.make(mCoordinatorLayout, "Error getting post", Snackbar.LENGTH_INDEFINITE); + snackbar.setAction(R.string.retry, new View.OnClickListener() { + @Override + public void onClick(View view) { + if (mIsBestPost) { + fetchBestPost(1); + } else { + fetchPost(); + } } - } - }); - snackbar.show(); + }); + snackbar.show(); + } } } \ No newline at end of file diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java index f0021f33..ac7a09b4 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java @@ -80,21 +80,22 @@ class PostRecyclerViewAdapter extends RecyclerView.Adapter