mirror of
https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy.git
synced 2024-11-10 04:37:25 +01:00
Use Retrofit to send API requests. Rename some methods. Changing the type of some methods related to fetching data to static.
This commit is contained in:
parent
a6a951732d
commit
2a57e4d5b4
@ -1,94 +0,0 @@
|
||||
package ml.docilealligator.infinityforreddit;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.android.volley.Request;
|
||||
import com.android.volley.RequestQueue;
|
||||
import com.android.volley.Response;
|
||||
import com.android.volley.VolleyError;
|
||||
import com.android.volley.toolbox.StringRequest;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Created by alex on 3/13/18.
|
||||
*/
|
||||
|
||||
class AcquireAccessToken {
|
||||
|
||||
interface AcquireAccessTokenListener {
|
||||
void onAcquireAccessTokenSuccess();
|
||||
void onAcquireAccessTokenFail();
|
||||
}
|
||||
|
||||
private Context mContext;
|
||||
private AcquireAccessTokenListener mAcquireAccessTokenListener;
|
||||
|
||||
AcquireAccessToken(Context context) {
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
void refreshAccessToken(RequestQueue refreshQueue, AcquireAccessTokenListener acquireAccessTokenListener) {
|
||||
if(mContext != null) {
|
||||
mAcquireAccessTokenListener = acquireAccessTokenListener;
|
||||
final String refreshToken = mContext.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE).getString(SharedPreferencesUtils.REFRESH_TOKEN_KEY, "");
|
||||
final SharedPreferences.Editor editor = mContext.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE).edit();
|
||||
StringRequest newTokenRequest = new StringRequest(Request.Method.POST, RedditUtils.ACQUIRE_ACCESS_TOKEN_URL, new Response.Listener<String>() {
|
||||
@Override
|
||||
public void onResponse(String response) {
|
||||
try {
|
||||
JSONObject jsonObject = new JSONObject(response);
|
||||
String newAccessToken = jsonObject.getString(RedditUtils.ACCESS_TOKEN_KEY);
|
||||
int expireIn = jsonObject.getInt(RedditUtils.EXPIRES_IN_KEY);
|
||||
editor.putString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, newAccessToken);
|
||||
editor.putInt(SharedPreferencesUtils.ACCESS_TOKEN_EXPIRE_INTERVAL_KEY, expireIn);
|
||||
editor.apply();
|
||||
|
||||
Log.i("access token", newAccessToken);
|
||||
mAcquireAccessTokenListener.onAcquireAccessTokenSuccess();
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
mAcquireAccessTokenListener.onAcquireAccessTokenFail();
|
||||
Toast.makeText(mContext, "Error parsing JSON object when getting the access token", Toast.LENGTH_SHORT).show();
|
||||
Log.i("main activity", "Error parsing JSON object when getting the access token");
|
||||
}
|
||||
}
|
||||
}, new Response.ErrorListener() {
|
||||
@Override
|
||||
public void onErrorResponse(VolleyError error) {
|
||||
Toast.makeText(mContext, "Error getting the new access token", Toast.LENGTH_SHORT).show();
|
||||
mAcquireAccessTokenListener.onAcquireAccessTokenFail();
|
||||
Log.i("Error", "getting access token");
|
||||
}
|
||||
}) {
|
||||
@Override
|
||||
protected Map<String, String> getParams() {
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put(RedditUtils.GRANT_TYPE_KEY, RedditUtils.GRANT_TYPE_REFRESH_TOKEN);
|
||||
params.put(RedditUtils.REFRESH_TOKEN_KEY, refreshToken);
|
||||
return params;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String> getHeaders() {
|
||||
return RedditUtils.getHttpBasicAuthHeader();
|
||||
}
|
||||
};
|
||||
newTokenRequest.setTag(AcquireAccessToken.class);
|
||||
|
||||
long queryAccessTokenTime = Calendar.getInstance().getTimeInMillis();
|
||||
editor.putLong(SharedPreferencesUtils.QUERY_ACCESS_TOKEN_TIME_KEY, queryAccessTokenTime);
|
||||
editor.apply();
|
||||
|
||||
refreshQueue.add(newTokenRequest);
|
||||
}
|
||||
}
|
||||
}
|
@ -12,8 +12,6 @@ import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.android.volley.RequestQueue;
|
||||
|
||||
import org.sufficientlysecure.htmltextview.HtmlTextView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -21,15 +19,10 @@ import java.util.ArrayList;
|
||||
class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||
private Context mContext;
|
||||
private ArrayList<CommentData> mCommentData;
|
||||
private RequestQueue mVoteThingRequestQueue;
|
||||
private RequestQueue mAcquireAccessTokenRequestQueue;
|
||||
|
||||
CommentRecyclerViewAdapter(Context context, ArrayList<CommentData> commentData,
|
||||
RequestQueue voteThingRequestQueue, RequestQueue acquireAccessTokenRequestQueue) {
|
||||
CommentRecyclerViewAdapter(Context context, ArrayList<CommentData> commentData) {
|
||||
mContext = context;
|
||||
mCommentData = commentData;
|
||||
mVoteThingRequestQueue = voteThingRequestQueue;
|
||||
mAcquireAccessTokenRequestQueue = acquireAccessTokenRequestQueue;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@ -71,7 +64,7 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
((CommentViewHolder) holder).scoreTextView.setText(Integer.toString(mCommentData.get(position).getScore() + 1));
|
||||
}
|
||||
|
||||
new VoteThing(mContext, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue).votePost(new VoteThing.VoteThingListener() {
|
||||
VoteThing.voteThing(mContext, new VoteThing.VoteThingListener() {
|
||||
@Override
|
||||
public void onVoteThingSuccess(int position) {
|
||||
mCommentData.get(position).setVoteType(1);
|
||||
@ -95,7 +88,7 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
((CommentViewHolder) holder).upvoteButton.clearColorFilter();
|
||||
((CommentViewHolder) holder).scoreTextView.setText(Integer.toString(mCommentData.get(position).getScore() - 1));
|
||||
|
||||
new VoteThing(mContext, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue).votePost(new VoteThing.VoteThingListener() {
|
||||
VoteThing.voteThing(mContext, new VoteThing.VoteThingListener() {
|
||||
@Override
|
||||
public void onVoteThingSuccess(int position) {
|
||||
mCommentData.get(position).setVoteType(0);
|
||||
@ -130,7 +123,7 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
((CommentViewHolder) holder).scoreTextView.setText(Integer.toString(mCommentData.get(position).getScore() - 1));
|
||||
}
|
||||
|
||||
new VoteThing(mContext, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue).votePost(new VoteThing.VoteThingListener() {
|
||||
VoteThing.voteThing(mContext, new VoteThing.VoteThingListener() {
|
||||
@Override
|
||||
public void onVoteThingSuccess(int position) {
|
||||
mCommentData.get(position).setVoteType(-1);
|
||||
@ -154,7 +147,7 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
((CommentViewHolder) holder).downvoteButton.clearColorFilter();
|
||||
((CommentViewHolder) holder).scoreTextView.setText(Integer.toString(mCommentData.get(position).getScore() + 1));
|
||||
|
||||
new VoteThing(mContext, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue).votePost(new VoteThing.VoteThingListener() {
|
||||
VoteThing.voteThing(mContext, new VoteThing.VoteThingListener() {
|
||||
@Override
|
||||
public void onVoteThingSuccess(int position) {
|
||||
mCommentData.get(position).setVoteType(0);
|
||||
|
@ -15,15 +15,7 @@ class FetchComment {
|
||||
void onFetchCommentFail();
|
||||
}
|
||||
|
||||
private String subredditNamePrefixed;
|
||||
private String article;
|
||||
|
||||
FetchComment(String subredditNamePrefixed, String article) {
|
||||
this.subredditNamePrefixed = subredditNamePrefixed;
|
||||
this.article = article;
|
||||
}
|
||||
|
||||
void queryComment(final FetchCommentListener fetchCommentListener) {
|
||||
static void queryComment(String subredditNamePrefixed, String article, final FetchCommentListener fetchCommentListener) {
|
||||
Retrofit retrofit = new Retrofit.Builder()
|
||||
.baseUrl(RedditUtils.API_BASE_URI)
|
||||
.addConverterFactory(ScalarsConverterFactory.create())
|
||||
|
@ -1,10 +1,13 @@
|
||||
package ml.docilealligator.infinityforreddit;
|
||||
|
||||
import com.android.volley.Request;
|
||||
import com.android.volley.RequestQueue;
|
||||
import com.android.volley.Response;
|
||||
import com.android.volley.VolleyError;
|
||||
import com.android.volley.toolbox.StringRequest;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.util.Log;
|
||||
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
import retrofit2.Response;
|
||||
import retrofit2.Retrofit;
|
||||
import retrofit2.converter.scalars.ScalarsConverterFactory;
|
||||
|
||||
class FetchSubredditData {
|
||||
interface FetchSubredditDataListener {
|
||||
@ -12,29 +15,26 @@ class FetchSubredditData {
|
||||
void onFetchSubredditDataFail();
|
||||
}
|
||||
|
||||
private RequestQueue requestQueue;
|
||||
private String subredditName;
|
||||
private FetchSubredditDataListener mFetchSubredditDataListener;
|
||||
static void fetchSubredditData(String subredditName, final FetchSubredditDataListener fetchSubredditDataListener) {
|
||||
Retrofit retrofit = new Retrofit.Builder()
|
||||
.baseUrl(RedditUtils.API_BASE_URI)
|
||||
.addConverterFactory(ScalarsConverterFactory.create())
|
||||
.build();
|
||||
|
||||
FetchSubredditData(RequestQueue requestQueue, String subredditName) {
|
||||
this.requestQueue = requestQueue;
|
||||
this.subredditName = subredditName;
|
||||
}
|
||||
RedditAPI api = retrofit.create(RedditAPI.class);
|
||||
|
||||
void querySubredditData(FetchSubredditDataListener fetchSubredditDataListener) {
|
||||
mFetchSubredditDataListener = fetchSubredditDataListener;
|
||||
StringRequest commentRequest = new StringRequest(Request.Method.GET, RedditUtils.getQuerySubredditDataUrl(subredditName), new Response.Listener<String>() {
|
||||
Call<String> subredditData = api.getSubredditData(subredditName);
|
||||
subredditData.enqueue(new Callback<String>() {
|
||||
@Override
|
||||
public void onResponse(String response) {
|
||||
mFetchSubredditDataListener.onFetchSubredditDataSuccess(response);
|
||||
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
|
||||
fetchSubredditDataListener.onFetchSubredditDataSuccess(response.body());
|
||||
}
|
||||
}, new Response.ErrorListener() {
|
||||
|
||||
@Override
|
||||
public void onErrorResponse(VolleyError error) {
|
||||
mFetchSubredditDataListener.onFetchSubredditDataFail();
|
||||
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
|
||||
Log.i("call failed", t.getMessage());
|
||||
fetchSubredditDataListener.onFetchSubredditDataFail();
|
||||
}
|
||||
}) {};
|
||||
commentRequest.setTag(FetchSubredditData.class);
|
||||
requestQueue.add(commentRequest);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -1,62 +1,51 @@
|
||||
package ml.docilealligator.infinityforreddit;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
|
||||
import com.android.volley.AuthFailureError;
|
||||
import com.android.volley.Request;
|
||||
import com.android.volley.RequestQueue;
|
||||
import com.android.volley.Response;
|
||||
import com.android.volley.VolleyError;
|
||||
import com.android.volley.toolbox.StringRequest;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.util.Log;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Map;
|
||||
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
import retrofit2.Response;
|
||||
import retrofit2.Retrofit;
|
||||
import retrofit2.converter.scalars.ScalarsConverterFactory;
|
||||
|
||||
class FetchSubscribedThing {
|
||||
interface FetchSubscribedSubredditsListener {
|
||||
void onFetchSubscribedSubredditsSuccess(ArrayList<SubscribedSubredditData> subscribedSubredditData,
|
||||
ArrayList<SubscribedUserData> subscribedUserData,
|
||||
ArrayList<SubredditData> subredditData);
|
||||
void onFetchSubscribedSubredditsFail();
|
||||
interface FetchSubscribedThingListener {
|
||||
void onFetchSubscribedThingSuccess(ArrayList<SubscribedSubredditData> subscribedSubredditData,
|
||||
ArrayList<SubscribedUserData> subscribedUserData,
|
||||
ArrayList<SubredditData> subredditData);
|
||||
void onFetchSubscribedThingFail();
|
||||
}
|
||||
|
||||
private Context context;
|
||||
private RequestQueue requestQueue;
|
||||
private FetchSubscribedSubredditsListener mFetchSubscribedSubredditsListener;
|
||||
private ArrayList<SubscribedSubredditData> mSubscribedSubredditData;
|
||||
private ArrayList<SubscribedUserData> mSubscribedUserData;
|
||||
private ArrayList<SubredditData> mSubredditData;
|
||||
|
||||
private String mLastItem;
|
||||
|
||||
FetchSubscribedThing(Context context, RequestQueue requestQueue,
|
||||
ArrayList<SubscribedSubredditData> subscribedSubredditData,
|
||||
ArrayList<SubscribedUserData> subscribedUserData,
|
||||
ArrayList<SubredditData> subredditData) {
|
||||
this.context = context;
|
||||
this.requestQueue = requestQueue;
|
||||
mSubscribedSubredditData = subscribedSubredditData;
|
||||
mSubscribedUserData = subscribedUserData;
|
||||
mSubredditData = subredditData;
|
||||
}
|
||||
|
||||
void fetchSubscribedSubreddits(FetchSubscribedSubredditsListener fetchUserInfoListener, final int refreshTime) {
|
||||
static void fetchSubscribedThing(final Context context, final String lastItem,
|
||||
final ArrayList<SubscribedSubredditData> subscribedSubredditData,
|
||||
final ArrayList<SubscribedUserData> subscribedUserData,
|
||||
final ArrayList<SubredditData> subredditData,
|
||||
final FetchSubscribedThingListener fetchSubscribedThingListener, final int refreshTime) {
|
||||
if(refreshTime < 0) {
|
||||
mFetchSubscribedSubredditsListener.onFetchSubscribedSubredditsFail();
|
||||
fetchSubscribedThingListener.onFetchSubscribedThingFail();
|
||||
return;
|
||||
}
|
||||
|
||||
Uri uri = Uri.parse(RedditUtils.OAUTH_API_BASE_URI + RedditUtils.SUBSCRIBED_SUBREDDITS)
|
||||
.buildUpon().appendQueryParameter(RedditUtils.AFTER_KEY, mLastItem)
|
||||
.appendQueryParameter(RedditUtils.RAW_JSON_KEY, RedditUtils.RAW_JSON_VALUE).build();
|
||||
Retrofit retrofit = new Retrofit.Builder()
|
||||
.baseUrl(RedditUtils.OAUTH_API_BASE_URI)
|
||||
.addConverterFactory(ScalarsConverterFactory.create())
|
||||
.build();
|
||||
|
||||
mFetchSubscribedSubredditsListener = fetchUserInfoListener;
|
||||
StringRequest commentRequest = new StringRequest(Request.Method.GET, uri.toString(), new Response.Listener<String>() {
|
||||
RedditAPI api = retrofit.create(RedditAPI.class);
|
||||
|
||||
String accessToken = context.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE)
|
||||
.getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, "");
|
||||
|
||||
Call<String> subredditDataCall = api.getSubscribedThing(lastItem, RedditUtils.getOAuthHeader(accessToken));
|
||||
subredditDataCall.enqueue(new Callback<String>() {
|
||||
@Override
|
||||
public void onResponse(String response) {
|
||||
ParseSubscribedThing.parseSubscribedSubreddits(response, mSubscribedSubredditData,
|
||||
mSubscribedUserData, mSubredditData,
|
||||
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
|
||||
ParseSubscribedThing.parseSubscribedSubreddits(response.body(), subscribedSubredditData,
|
||||
subscribedUserData, subredditData,
|
||||
new ParseSubscribedThing.ParseSubscribedSubredditsListener() {
|
||||
|
||||
@Override
|
||||
@ -64,49 +53,37 @@ class FetchSubscribedThing {
|
||||
ArrayList<SubscribedUserData> subscribedUserData,
|
||||
ArrayList<SubredditData> subredditData,
|
||||
String lastItem) {
|
||||
mSubscribedSubredditData = subscribedSubredditData;
|
||||
mSubscribedUserData = subscribedUserData;
|
||||
mSubredditData = subredditData;
|
||||
mLastItem = lastItem;
|
||||
if(mLastItem.equals("null")) {
|
||||
mFetchSubscribedSubredditsListener.onFetchSubscribedSubredditsSuccess(mSubscribedSubredditData,
|
||||
mSubscribedUserData, mSubredditData);
|
||||
if(lastItem.equals("null")) {
|
||||
fetchSubscribedThingListener.onFetchSubscribedThingSuccess(
|
||||
subscribedSubredditData, subscribedUserData, subredditData);
|
||||
} else {
|
||||
fetchSubscribedSubreddits(mFetchSubscribedSubredditsListener, refreshTime);
|
||||
fetchSubscribedThing(context, lastItem, subscribedSubredditData,
|
||||
subscribedUserData, subredditData,
|
||||
fetchSubscribedThingListener, refreshTime);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onParseSubscribedSubredditsFail() {
|
||||
|
||||
fetchSubscribedThingListener.onFetchSubscribedThingFail();
|
||||
}
|
||||
});
|
||||
}
|
||||
}, new Response.ErrorListener() {
|
||||
@Override
|
||||
public void onErrorResponse(VolleyError error) {
|
||||
if(error instanceof AuthFailureError) {
|
||||
new AcquireAccessToken(context).refreshAccessToken(requestQueue, new AcquireAccessToken.AcquireAccessTokenListener() {
|
||||
@Override
|
||||
public void onAcquireAccessTokenSuccess() {
|
||||
fetchSubscribedSubreddits(mFetchSubscribedSubredditsListener, refreshTime - 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAcquireAccessTokenFail() {}
|
||||
});
|
||||
} else {
|
||||
mFetchSubscribedSubredditsListener.onFetchSubscribedSubredditsFail();
|
||||
}
|
||||
}
|
||||
}) {
|
||||
@Override
|
||||
public Map<String, String> getHeaders() {
|
||||
String accessToken = context.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE).getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, "");
|
||||
return RedditUtils.getOAuthHeader(accessToken);
|
||||
public void onFailure(@NonNull Call<String> 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() {}
|
||||
});
|
||||
}
|
||||
};
|
||||
commentRequest.setTag(FetchComment.class);
|
||||
requestQueue.add(commentRequest);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -1,16 +1,13 @@
|
||||
package ml.docilealligator.infinityforreddit;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.volley.AuthFailureError;
|
||||
import com.android.volley.Request;
|
||||
import com.android.volley.RequestQueue;
|
||||
import com.android.volley.Response;
|
||||
import com.android.volley.VolleyError;
|
||||
import com.android.volley.toolbox.StringRequest;
|
||||
|
||||
import java.util.Map;
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
import retrofit2.Retrofit;
|
||||
import retrofit2.converter.scalars.ScalarsConverterFactory;
|
||||
|
||||
class FetchUserInfo {
|
||||
interface FetchUserInfoListener {
|
||||
@ -18,57 +15,41 @@ class FetchUserInfo {
|
||||
void onFetchUserInfoFail();
|
||||
}
|
||||
|
||||
private Context context;
|
||||
private RequestQueue requestQueue;
|
||||
private FetchUserInfoListener mFetchUserInfoListener;
|
||||
|
||||
FetchUserInfo(Context context, RequestQueue requestQueue) {
|
||||
this.context = context;
|
||||
this.requestQueue = requestQueue;
|
||||
}
|
||||
|
||||
void queryUserInfo(FetchUserInfoListener fetchUserInfoListener, final int refreshTime) {
|
||||
static void fetchUserInfo(final Context context, final FetchUserInfoListener fetchUserInfoListener, final int refreshTime) {
|
||||
if(refreshTime < 0) {
|
||||
mFetchUserInfoListener.onFetchUserInfoFail();
|
||||
fetchUserInfoListener.onFetchUserInfoFail();
|
||||
return;
|
||||
}
|
||||
|
||||
mFetchUserInfoListener = fetchUserInfoListener;
|
||||
|
||||
Uri uri = Uri.parse(RedditUtils.OAUTH_API_BASE_URI + RedditUtils.USER_INFO_SUFFIX)
|
||||
.buildUpon().appendQueryParameter(RedditUtils.RAW_JSON_KEY, RedditUtils.RAW_JSON_VALUE)
|
||||
Retrofit retrofit = new Retrofit.Builder()
|
||||
.baseUrl(RedditUtils.OAUTH_API_BASE_URI)
|
||||
.addConverterFactory(ScalarsConverterFactory.create())
|
||||
.build();
|
||||
|
||||
StringRequest commentRequest = new StringRequest(Request.Method.GET, uri.toString(), new Response.Listener<String>() {
|
||||
@Override
|
||||
public void onResponse(String response) {
|
||||
mFetchUserInfoListener.onFetchUserInfoSuccess(response);
|
||||
}
|
||||
}, new Response.ErrorListener() {
|
||||
@Override
|
||||
public void onErrorResponse(VolleyError error) {
|
||||
if(error instanceof AuthFailureError) {
|
||||
new AcquireAccessToken(context).refreshAccessToken(requestQueue, new AcquireAccessToken.AcquireAccessTokenListener() {
|
||||
@Override
|
||||
public void onAcquireAccessTokenSuccess() {
|
||||
queryUserInfo(mFetchUserInfoListener, refreshTime - 1);
|
||||
}
|
||||
RedditAPI api = retrofit.create(RedditAPI.class);
|
||||
|
||||
@Override
|
||||
public void onAcquireAccessTokenFail() {}
|
||||
});
|
||||
} else {
|
||||
mFetchUserInfoListener.onFetchUserInfoFail();
|
||||
}
|
||||
}
|
||||
}) {
|
||||
String accessToken = context.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE)
|
||||
.getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, "");
|
||||
Call<String> userInfo = api.getUserInfo(RedditUtils.getOAuthHeader(accessToken));
|
||||
userInfo.enqueue(new Callback<String>() {
|
||||
@Override
|
||||
public Map<String, String> getHeaders() {
|
||||
String accessToken = context.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE).getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, "");
|
||||
return RedditUtils.getOAuthHeader(accessToken);
|
||||
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
|
||||
fetchUserInfoListener.onFetchUserInfoSuccess(response.body());
|
||||
}
|
||||
};
|
||||
commentRequest.setTag(FetchComment.class);
|
||||
requestQueue.add(commentRequest);
|
||||
|
||||
@Override
|
||||
public void onFailure(@NonNull Call<String> 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() {}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -21,7 +21,6 @@ import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.volley.toolbox.Volley;
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.RequestManager;
|
||||
|
||||
@ -100,15 +99,15 @@ public class MainActivity extends AppCompatActivity {
|
||||
queryAccessTokenTime.add(Calendar.SECOND, interval - 300);
|
||||
|
||||
if(now.after(queryAccessTokenTime)) {
|
||||
new AcquireAccessToken(this).refreshAccessToken(Volley.newRequestQueue(this),
|
||||
new AcquireAccessToken.AcquireAccessTokenListener() {
|
||||
RefreshAccessToken.refreshAccessToken(this,
|
||||
new RefreshAccessToken.RefreshAccessTokenListener() {
|
||||
@Override
|
||||
public void onAcquireAccessTokenSuccess() {
|
||||
public void onRefreshAccessTokenSuccess() {
|
||||
loadUserData(savedInstanceState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAcquireAccessTokenFail() {}
|
||||
public void onRefreshAccessTokenFail() {}
|
||||
});
|
||||
} else {
|
||||
loadUserData(savedInstanceState);
|
||||
@ -179,19 +178,19 @@ public class MainActivity extends AppCompatActivity {
|
||||
}
|
||||
|
||||
private void loadUserData(Bundle savedInstanceState) {
|
||||
if(savedInstanceState == null) {
|
||||
if(!mFetchUserInfoSuccess) {
|
||||
new FetchUserInfo(this, Volley.newRequestQueue(this)).queryUserInfo(new FetchUserInfo.FetchUserInfoListener() {
|
||||
if (savedInstanceState == null) {
|
||||
if (!mFetchUserInfoSuccess) {
|
||||
FetchUserInfo.fetchUserInfo(this, new FetchUserInfo.FetchUserInfoListener() {
|
||||
@Override
|
||||
public void onFetchUserInfoSuccess(String response) {
|
||||
ParseUserInfo.parseUserInfo(response, new ParseUserInfo.ParseUserInfoListener() {
|
||||
@Override
|
||||
public void onParseUserInfoSuccess(String name, String profileImageUrl, String bannerImageUrl, int karma) {
|
||||
mNameTextView.setText(name);
|
||||
if(!mProfileImageUrl.equals("")) {
|
||||
if (!mProfileImageUrl.equals("")) {
|
||||
glide.load(profileImageUrl).into(mProfileImageView);
|
||||
}
|
||||
if(!mBannerImageUrl.equals("")) {
|
||||
if (!mBannerImageUrl.equals("")) {
|
||||
glide.load(bannerImageUrl).into(mBannerImageView);
|
||||
}
|
||||
|
||||
@ -225,14 +224,15 @@ public class MainActivity extends AppCompatActivity {
|
||||
}, 1);
|
||||
}
|
||||
|
||||
if(!mInsertSuccess) {
|
||||
new FetchSubscribedThing(this, Volley.newRequestQueue(this), new ArrayList<SubscribedSubredditData>(),
|
||||
new ArrayList<SubscribedUserData>(), new ArrayList<SubredditData>())
|
||||
.fetchSubscribedSubreddits(new FetchSubscribedThing.FetchSubscribedSubredditsListener() {
|
||||
if (!mInsertSuccess) {
|
||||
FetchSubscribedThing.fetchSubscribedThing(this, null,
|
||||
new ArrayList<SubscribedSubredditData>(), new ArrayList<SubscribedUserData>(),
|
||||
new ArrayList<SubredditData>(),
|
||||
new FetchSubscribedThing.FetchSubscribedThingListener() {
|
||||
@Override
|
||||
public void onFetchSubscribedSubredditsSuccess(ArrayList<SubscribedSubredditData> subscribedSubredditData,
|
||||
ArrayList<SubscribedUserData> subscribedUserData,
|
||||
ArrayList<SubredditData> subredditData) {
|
||||
public void onFetchSubscribedThingSuccess(ArrayList<SubscribedSubredditData> subscribedSubredditData,
|
||||
ArrayList<SubscribedUserData> subscribedUserData,
|
||||
ArrayList<SubredditData> subredditData) {
|
||||
new InsertSubscribedThingsAsyncTask(
|
||||
SubscribedSubredditRoomDatabase.getDatabase(MainActivity.this),
|
||||
SubscribedUserRoomDatabase.getDatabase(MainActivity.this),
|
||||
@ -249,7 +249,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFetchSubscribedSubredditsFail() {
|
||||
public void onFetchSubscribedThingFail() {
|
||||
mInsertSuccess = false;
|
||||
}
|
||||
}, 1);
|
||||
|
@ -71,7 +71,7 @@ public class PostFragment extends Fragment {
|
||||
if(savedInstanceState.containsKey(PostDataParcelableState)) {
|
||||
mPostData = savedInstanceState.getParcelableArrayList(PostDataParcelableState);
|
||||
mLastItem = savedInstanceState.getString(lastItemState);
|
||||
mAdapter = new PostRecyclerViewAdapter(getActivity(), mPostData, mPaginationSynchronizer, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue);
|
||||
mAdapter = new PostRecyclerViewAdapter(getActivity(), mPostData, mPaginationSynchronizer, mVoteThingRequestQueue);
|
||||
mPostRecyclerView.setAdapter(mAdapter);
|
||||
mPostRecyclerView.addOnScrollListener(new PostPaginationScrollListener(
|
||||
getActivity(), mLinearLayoutManager, mAdapter, mLastItem, mPostData,
|
||||
@ -82,9 +82,9 @@ public class PostFragment extends Fragment {
|
||||
mProgressBar.setVisibility(View.GONE);
|
||||
} else {
|
||||
if(mIsBestPost) {
|
||||
queryBestPost(mQueryPostUrl, 1);
|
||||
queryBestPost(1);
|
||||
} else {
|
||||
queryPost(mQueryPostUrl, 1);
|
||||
fetchPost(mQueryPostUrl, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -99,7 +99,7 @@ public class PostFragment extends Fragment {
|
||||
}
|
||||
|
||||
if(mAcquireAccessTokenRequestQueue != null) {
|
||||
mAcquireAccessTokenRequestQueue.cancelAll(AcquireAccessToken.class);
|
||||
mAcquireAccessTokenRequestQueue.cancelAll(RefreshAccessToken.class);
|
||||
}
|
||||
|
||||
if(mVoteThingRequestQueue != null) {
|
||||
@ -156,9 +156,9 @@ public class PostFragment extends Fragment {
|
||||
} else {
|
||||
mPaginationSynchronizer = new PaginationSynchronizer();
|
||||
if(mIsBestPost) {
|
||||
queryBestPost(mQueryPostUrl, 1);
|
||||
queryBestPost(1);
|
||||
} else {
|
||||
queryPost(mQueryPostUrl, 1);
|
||||
fetchPost(mQueryPostUrl, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -181,7 +181,7 @@ public class PostFragment extends Fragment {
|
||||
return rootView;
|
||||
}
|
||||
|
||||
private void queryBestPost(final String queryPostUrl, final int refreshTime) {
|
||||
private void queryBestPost(final int refreshTime) {
|
||||
if(refreshTime < 0) {
|
||||
showErrorSnackbar();
|
||||
return;
|
||||
@ -203,7 +203,7 @@ public class PostFragment extends Fragment {
|
||||
public void onParsePostSuccess(ArrayList<PostData> postData, String lastItem) {
|
||||
mPostData = postData;
|
||||
mLastItem = lastItem;
|
||||
mAdapter = new PostRecyclerViewAdapter(getActivity(), postData, mPaginationSynchronizer, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue);
|
||||
mAdapter = new PostRecyclerViewAdapter(getActivity(), postData, mPaginationSynchronizer, mVoteThingRequestQueue);
|
||||
|
||||
mPostRecyclerView.setAdapter(mAdapter);
|
||||
mPostRecyclerView.addOnScrollListener(new PostPaginationScrollListener(
|
||||
@ -230,15 +230,15 @@ public class PostFragment extends Fragment {
|
||||
if (error instanceof AuthFailureError) {
|
||||
// Error indicating that there was an Authentication Failure while performing the request
|
||||
// Access token expired
|
||||
new AcquireAccessToken(getActivity()).refreshAccessToken(mAcquireAccessTokenRequestQueue,
|
||||
new AcquireAccessToken.AcquireAccessTokenListener() {
|
||||
RefreshAccessToken.refreshAccessToken(getActivity(),
|
||||
new RefreshAccessToken.RefreshAccessTokenListener() {
|
||||
@Override
|
||||
public void onAcquireAccessTokenSuccess() {
|
||||
queryBestPost(queryPostUrl, refreshTime - 1);
|
||||
public void onRefreshAccessTokenSuccess() {
|
||||
queryBestPost(refreshTime - 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAcquireAccessTokenFail() {}
|
||||
public void onRefreshAccessTokenFail() {}
|
||||
});
|
||||
} else {
|
||||
Log.i("Post fetch error", error.toString());
|
||||
@ -256,7 +256,7 @@ public class PostFragment extends Fragment {
|
||||
mRequestQueue.add(postRequest);
|
||||
}
|
||||
|
||||
private void queryPost(final String queryPostUrl, final int refreshTime) {
|
||||
private void fetchPost(final String queryPostUrl, final int refreshTime) {
|
||||
if(refreshTime < 0) {
|
||||
showErrorSnackbar();
|
||||
return;
|
||||
@ -282,7 +282,7 @@ public class PostFragment extends Fragment {
|
||||
public void onParsePostSuccess(ArrayList<PostData> postData, String lastItem) {
|
||||
mPostData = postData;
|
||||
mLastItem = lastItem;
|
||||
mAdapter = new PostRecyclerViewAdapter(getActivity(), postData, mPaginationSynchronizer, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue);
|
||||
mAdapter = new PostRecyclerViewAdapter(getActivity(), postData, mPaginationSynchronizer, mVoteThingRequestQueue);
|
||||
|
||||
mPostRecyclerView.setAdapter(mAdapter);
|
||||
mPostRecyclerView.addOnScrollListener(new PostPaginationScrollListener(
|
||||
@ -309,15 +309,15 @@ public class PostFragment extends Fragment {
|
||||
if (error instanceof AuthFailureError) {
|
||||
// Error indicating that there was an Authentication Failure while performing the request
|
||||
// Access token expired
|
||||
new AcquireAccessToken(getActivity()).refreshAccessToken(mAcquireAccessTokenRequestQueue,
|
||||
new AcquireAccessToken.AcquireAccessTokenListener() {
|
||||
RefreshAccessToken.refreshAccessToken(getActivity(),
|
||||
new RefreshAccessToken.RefreshAccessTokenListener() {
|
||||
@Override
|
||||
public void onAcquireAccessTokenSuccess() {
|
||||
queryPost(queryPostUrl, refreshTime - 1);
|
||||
public void onRefreshAccessTokenSuccess() {
|
||||
fetchPost(queryPostUrl, refreshTime - 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAcquireAccessTokenFail() {}
|
||||
public void onRefreshAccessTokenFail() {}
|
||||
});
|
||||
} else {
|
||||
Log.i("Post fetch error", error.toString());
|
||||
@ -336,9 +336,9 @@ public class PostFragment extends Fragment {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if(mIsBestPost) {
|
||||
queryBestPost(mQueryPostUrl, 1);
|
||||
queryBestPost(1);
|
||||
} else {
|
||||
queryPost(mQueryPostUrl, 1);
|
||||
fetchPost(mQueryPostUrl, 1);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -146,15 +146,15 @@ class PostPaginationScrollListener extends RecyclerView.OnScrollListener {
|
||||
public void onErrorResponse(VolleyError error) {
|
||||
if (error instanceof AuthFailureError) {
|
||||
//Access token expired
|
||||
new AcquireAccessToken(mContext).refreshAccessToken(mAcquireAccessTokenRequestQueue,
|
||||
new AcquireAccessToken.AcquireAccessTokenListener() {
|
||||
RefreshAccessToken.refreshAccessToken(mContext,
|
||||
new RefreshAccessToken.RefreshAccessTokenListener() {
|
||||
@Override
|
||||
public void onAcquireAccessTokenSuccess() {
|
||||
public void onRefreshAccessTokenSuccess() {
|
||||
fetchBestPost(queryPostUrl, refreshTime - 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAcquireAccessTokenFail() {
|
||||
public void onRefreshAccessTokenFail() {
|
||||
}
|
||||
});
|
||||
} else {
|
||||
@ -219,15 +219,15 @@ class PostPaginationScrollListener extends RecyclerView.OnScrollListener {
|
||||
public void onErrorResponse(VolleyError error) {
|
||||
if (error instanceof AuthFailureError) {
|
||||
//Access token expired
|
||||
new AcquireAccessToken(mContext).refreshAccessToken(mAcquireAccessTokenRequestQueue,
|
||||
new AcquireAccessToken.AcquireAccessTokenListener() {
|
||||
RefreshAccessToken.refreshAccessToken(mContext,
|
||||
new RefreshAccessToken.RefreshAccessTokenListener() {
|
||||
@Override
|
||||
public void onAcquireAccessTokenSuccess() {
|
||||
public void onRefreshAccessTokenSuccess() {
|
||||
fetchPost(queryPostUrl, refreshTime - 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAcquireAccessTokenFail() {
|
||||
public void onRefreshAccessTokenFail() {
|
||||
}
|
||||
});
|
||||
} else {
|
||||
|
@ -44,7 +44,6 @@ class PostRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
|
||||
private Context mContext;
|
||||
private PaginationSynchronizer mPaginationSynchronizer;
|
||||
private RequestQueue mVoteThingRequestQueue;
|
||||
private RequestQueue mAcquireAccessTokenRequestQueue;
|
||||
private RequestManager glide;
|
||||
private SubredditDao subredditDao;
|
||||
private boolean isLoadingMorePostSuccess;
|
||||
@ -55,13 +54,12 @@ class PostRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
|
||||
|
||||
|
||||
PostRecyclerViewAdapter(Context context, ArrayList<PostData> postData, PaginationSynchronizer paginationSynchronizer,
|
||||
RequestQueue voteThingRequestQueue, RequestQueue acquireAccessTokenRequestQueue) {
|
||||
RequestQueue voteThingRequestQueue) {
|
||||
if(context != null) {
|
||||
mContext = context;
|
||||
mPostData = postData;
|
||||
mPaginationSynchronizer = paginationSynchronizer;
|
||||
mVoteThingRequestQueue = voteThingRequestQueue;
|
||||
mAcquireAccessTokenRequestQueue = acquireAccessTokenRequestQueue;
|
||||
isLoadingMorePostSuccess = true;
|
||||
canStartActivity = true;
|
||||
glide = Glide.with(mContext);
|
||||
@ -139,7 +137,7 @@ class PostRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class);
|
||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME,
|
||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
|
||||
mPostData.get(holder.getAdapterPosition()).getSubredditNamePrefixed().substring(2));
|
||||
}
|
||||
});
|
||||
@ -348,7 +346,7 @@ class PostRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
|
||||
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(mPostData.get(holder.getAdapterPosition()).getScore() + 1));
|
||||
}
|
||||
|
||||
new VoteThing(mContext, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue).votePost(new VoteThing.VoteThingListener() {
|
||||
VoteThing.voteThing(mContext, new VoteThing.VoteThingListener() {
|
||||
@Override
|
||||
public void onVoteThingSuccess(int position) {
|
||||
mPostData.get(position).setVoteType(1);
|
||||
@ -372,7 +370,7 @@ class PostRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
|
||||
((DataViewHolder) holder).upvoteButton.clearColorFilter();
|
||||
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(mPostData.get(holder.getAdapterPosition()).getScore() - 1));
|
||||
|
||||
new VoteThing(mContext, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue).votePost(new VoteThing.VoteThingListener() {
|
||||
VoteThing.voteThing(mContext, new VoteThing.VoteThingListener() {
|
||||
@Override
|
||||
public void onVoteThingSuccess(int position) {
|
||||
mPostData.get(position).setVoteType(0);
|
||||
@ -406,7 +404,7 @@ class PostRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
|
||||
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(mPostData.get(holder.getAdapterPosition()).getScore() - 1));
|
||||
}
|
||||
|
||||
new VoteThing(mContext, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue).votePost(new VoteThing.VoteThingListener() {
|
||||
VoteThing.voteThing(mContext, new VoteThing.VoteThingListener() {
|
||||
@Override
|
||||
public void onVoteThingSuccess(int position) {
|
||||
mPostData.get(position).setVoteType(-1);
|
||||
@ -430,7 +428,7 @@ class PostRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
|
||||
((DataViewHolder) holder).downvoteButton.clearColorFilter();
|
||||
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(mPostData.get(holder.getAdapterPosition()).getScore() + 1));
|
||||
|
||||
new VoteThing(mContext, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue).votePost(new VoteThing.VoteThingListener() {
|
||||
VoteThing.voteThing(mContext, new VoteThing.VoteThingListener() {
|
||||
@Override
|
||||
public void onVoteThingSuccess(int position) {
|
||||
mPostData.get(position).setVoteType(0);
|
||||
|
@ -1,10 +1,34 @@
|
||||
package ml.docilealligator.infinityforreddit;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import retrofit2.Call;
|
||||
import retrofit2.http.FieldMap;
|
||||
import retrofit2.http.FormUrlEncoded;
|
||||
import retrofit2.http.GET;
|
||||
import retrofit2.http.HeaderMap;
|
||||
import retrofit2.http.POST;
|
||||
import retrofit2.http.Path;
|
||||
import retrofit2.http.Query;
|
||||
|
||||
public interface RedditAPI {
|
||||
@FormUrlEncoded
|
||||
@POST("api/v1/access_token")
|
||||
Call<String> getAccessToken(@HeaderMap Map<String, String> headers, @FieldMap Map<String, String> params);
|
||||
|
||||
@GET("{subredditNamePrefixed}/comments/{article}.json?raw_json=1")
|
||||
Call<String> getComments(@Path("subredditNamePrefixed") String subredditNamePrefixed, @Path("article") String article);
|
||||
|
||||
@GET("r/{subredditName}/about.json?raw_json=1")
|
||||
Call<String> getSubredditData(@Path("subredditName") String subredditName);
|
||||
|
||||
@GET("subreddits/mine/subscriber?raw_json=1")
|
||||
Call<String> getSubscribedThing(@Query("after") String lastItem, @HeaderMap Map<String, String> headers);
|
||||
|
||||
@GET("api/v1/me?raw_json=1")
|
||||
Call<String> getUserInfo(@HeaderMap Map<String, String> headers);
|
||||
|
||||
@FormUrlEncoded
|
||||
@POST("api/vote")
|
||||
Call<String> voteThing(@HeaderMap Map<String, String> headers, @FieldMap Map<String, String> params);
|
||||
}
|
||||
|
@ -11,15 +11,11 @@ import java.util.Map;
|
||||
|
||||
class RedditUtils {
|
||||
static final String OAUTH_URL ="https://www.reddit.com/api/v1/authorize.compact";
|
||||
static final String ACQUIRE_ACCESS_TOKEN_URL = "https://www.reddit.com/api/v1/access_token";
|
||||
static final String OAUTH_API_BASE_URI = "https://oauth.reddit.com";
|
||||
static final String API_BASE_URI = "https://www.reddit.com";
|
||||
static final String RAW_JSON_KEY ="raw_json";
|
||||
static final String RAW_JSON_VALUE = "1";
|
||||
static final String BEST_POST_SUFFIX = "/best";
|
||||
static final String VOTE_SUFFIX = "/api/vote";
|
||||
static final String USER_INFO_SUFFIX = "/api/v1/me";
|
||||
static final String SUBSCRIBED_SUBREDDITS = "/subreddits/mine/subscriber";
|
||||
|
||||
static final String CLIENT_ID_KEY = "client_id";
|
||||
static final String CLIENT_ID = "";
|
||||
@ -70,14 +66,6 @@ class RedditUtils {
|
||||
return params;
|
||||
}
|
||||
|
||||
static String getQueryCommentUrl(String subredditName, String article) {
|
||||
return API_BASE_URI + "/" + subredditName + "/comments/" + article + ".json";
|
||||
}
|
||||
|
||||
static String getQuerySubredditDataUrl(String subredditName) {
|
||||
return API_BASE_URI + "/r/" + subredditName + "/about.json";
|
||||
}
|
||||
|
||||
static String getQuerySubredditPostUrl(String subredditName) {
|
||||
return API_BASE_URI + "/r/" + subredditName + ".json";
|
||||
}
|
||||
|
@ -0,0 +1,82 @@
|
||||
package ml.docilealligator.infinityforreddit;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.util.Log;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
import retrofit2.Retrofit;
|
||||
import retrofit2.converter.scalars.ScalarsConverterFactory;
|
||||
|
||||
/**
|
||||
* Created by alex on 3/13/18.
|
||||
*/
|
||||
|
||||
class RefreshAccessToken {
|
||||
|
||||
interface RefreshAccessTokenListener {
|
||||
void onRefreshAccessTokenSuccess();
|
||||
void onRefreshAccessTokenFail();
|
||||
}
|
||||
|
||||
static void refreshAccessToken(final Context context, final RefreshAccessTokenListener refreshAccessTokenListener) {
|
||||
if(context != null) {
|
||||
String refreshToken = context.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE).getString(SharedPreferencesUtils.REFRESH_TOKEN_KEY, "");
|
||||
|
||||
final Retrofit retrofit = new Retrofit.Builder()
|
||||
.baseUrl(RedditUtils.API_BASE_URI)
|
||||
.addConverterFactory(ScalarsConverterFactory.create())
|
||||
.build();
|
||||
|
||||
RedditAPI api = retrofit.create(RedditAPI.class);
|
||||
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put(RedditUtils.GRANT_TYPE_KEY, RedditUtils.GRANT_TYPE_REFRESH_TOKEN);
|
||||
params.put(RedditUtils.REFRESH_TOKEN_KEY, refreshToken);
|
||||
|
||||
Call<String> accessTokenCall = api.getAccessToken(RedditUtils.getHttpBasicAuthHeader(), params);
|
||||
accessTokenCall.enqueue(new Callback<String>() {
|
||||
@Override
|
||||
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
|
||||
try {
|
||||
JSONObject jsonObject = new JSONObject(response.body());
|
||||
String newAccessToken = jsonObject.getString(RedditUtils.ACCESS_TOKEN_KEY);
|
||||
int expireIn = jsonObject.getInt(RedditUtils.EXPIRES_IN_KEY);
|
||||
|
||||
SharedPreferences.Editor editor = context.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE).edit();
|
||||
editor.putString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, newAccessToken);
|
||||
editor.putInt(SharedPreferencesUtils.ACCESS_TOKEN_EXPIRE_INTERVAL_KEY, expireIn);
|
||||
editor.apply();
|
||||
|
||||
long queryAccessTokenTime = Calendar.getInstance().getTimeInMillis();
|
||||
editor.putLong(SharedPreferencesUtils.QUERY_ACCESS_TOKEN_TIME_KEY, queryAccessTokenTime);
|
||||
editor.apply();
|
||||
|
||||
Log.i("access token", newAccessToken);
|
||||
refreshAccessTokenListener.onRefreshAccessTokenSuccess();
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
refreshAccessTokenListener.onRefreshAccessTokenFail();
|
||||
Log.i("main activity", "Error parsing JSON object when getting the access token");
|
||||
}
|
||||
refreshAccessTokenListener.onRefreshAccessTokenSuccess();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
|
||||
Log.i("call failed", t.getMessage());
|
||||
refreshAccessTokenListener.onRefreshAccessTokenFail();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
@ -38,8 +38,8 @@ class SubscribedSubredditRecyclerViewAdapter extends RecyclerView.Adapter<Recycl
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class);
|
||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME, mSubscribedSubredditData.get(viewHolder.getAdapterPosition()).getName());
|
||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_ID, mSubscribedSubredditData.get(viewHolder.getAdapterPosition()).getId());
|
||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, mSubscribedSubredditData.get(viewHolder.getAdapterPosition()).getName());
|
||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_ID_KEY, mSubscribedSubredditData.get(viewHolder.getAdapterPosition()).getId());
|
||||
mContext.startActivity(intent);
|
||||
}
|
||||
});
|
||||
|
@ -24,8 +24,6 @@ import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.android.volley.RequestQueue;
|
||||
import com.android.volley.toolbox.Volley;
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.load.DataSource;
|
||||
import com.bumptech.glide.load.engine.GlideException;
|
||||
@ -59,9 +57,6 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
||||
|
||||
private LoadSubredditIconAsyncTask mLoadSubredditIconAsyncTask;
|
||||
|
||||
private RequestQueue mVoteThingRequestQueue;
|
||||
private RequestQueue mAcquireAccessTokenRequestQueue;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
@ -140,8 +135,6 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
||||
mRecyclerView.setNestedScrollingEnabled(false);
|
||||
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
|
||||
mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
|
||||
mVoteThingRequestQueue = Volley.newRequestQueue(this);
|
||||
mAcquireAccessTokenRequestQueue = Volley.newRequestQueue(this);
|
||||
|
||||
subredditTextView.setText(mPostData.getSubredditNamePrefixed());
|
||||
postTimeTextView.setText(mPostData.getPostTime());
|
||||
@ -385,7 +378,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
||||
scoreTextView.setText(Integer.toString(mPostData.getScore() + 1));
|
||||
}
|
||||
|
||||
new VoteThing(ViewPostDetailActivity.this, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue).votePost(new VoteThing.VoteThingWithoutPositionListener() {
|
||||
VoteThing.voteThing(ViewPostDetailActivity.this, new VoteThing.VoteThingWithoutPositionListener() {
|
||||
@Override
|
||||
public void onVoteThingSuccess() {
|
||||
mPostData.setVoteType(1);
|
||||
@ -409,7 +402,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
||||
upvoteButton.clearColorFilter();
|
||||
scoreTextView.setText(Integer.toString(mPostData.getScore() - 1));
|
||||
|
||||
new VoteThing(ViewPostDetailActivity.this, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue).votePost(new VoteThing.VoteThingWithoutPositionListener() {
|
||||
VoteThing.voteThing(ViewPostDetailActivity.this, new VoteThing.VoteThingWithoutPositionListener() {
|
||||
@Override
|
||||
public void onVoteThingSuccess() {
|
||||
mPostData.setVoteType(0);
|
||||
@ -445,7 +438,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
||||
scoreTextView.setText(Integer.toString(mPostData.getScore() - 1));
|
||||
}
|
||||
|
||||
new VoteThing(ViewPostDetailActivity.this, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue).votePost(new VoteThing.VoteThingWithoutPositionListener() {
|
||||
VoteThing.voteThing(ViewPostDetailActivity.this, new VoteThing.VoteThingWithoutPositionListener() {
|
||||
@Override
|
||||
public void onVoteThingSuccess() {
|
||||
mPostData.setVoteType(-1);
|
||||
@ -469,7 +462,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
||||
downvoteButton.clearColorFilter();
|
||||
scoreTextView.setText(Integer.toString(mPostData.getScore() + 1));
|
||||
|
||||
new VoteThing(ViewPostDetailActivity.this, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue).votePost(new VoteThing.VoteThingWithoutPositionListener() {
|
||||
VoteThing.voteThing(ViewPostDetailActivity.this, new VoteThing.VoteThingWithoutPositionListener() {
|
||||
@Override
|
||||
public void onVoteThingSuccess() {
|
||||
mPostData.setVoteType(0);
|
||||
@ -492,40 +485,41 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
||||
private void queryComment() {
|
||||
mCommentProgressbar.setVisibility(View.VISIBLE);
|
||||
mNoCommentWrapperLinearLayout.setVisibility(View.GONE);
|
||||
new FetchComment(mPostData.getSubredditNamePrefixed(), mPostData.getId()).queryComment(new FetchComment.FetchCommentListener() {
|
||||
@Override
|
||||
public void onFetchCommentSuccess(String response) {
|
||||
ParseComment.parseComment(response, new ArrayList<CommentData>(),
|
||||
getResources().getConfiguration().locale, new ParseComment.ParseCommentListener() {
|
||||
@Override
|
||||
public void onParseCommentSuccess(ArrayList<CommentData> commentData, int moreCommentCount) {
|
||||
mCommentProgressbar.setVisibility(View.GONE);
|
||||
mMoreCommentCount = moreCommentCount;
|
||||
if (commentData.size() > 0) {
|
||||
CommentRecyclerViewAdapter adapter = new CommentRecyclerViewAdapter(
|
||||
ViewPostDetailActivity.this, commentData, mVoteThingRequestQueue, mAcquireAccessTokenRequestQueue);
|
||||
mRecyclerView.setAdapter(adapter);
|
||||
mCommentCardView.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
mNoCommentWrapperLinearLayout.setVisibility(View.VISIBLE);
|
||||
Glide.with(ViewPostDetailActivity.this).load(R.drawable.no_comment_indicator).into(mNoCommentImageView);
|
||||
}
|
||||
}
|
||||
FetchComment.queryComment(mPostData.getSubredditNamePrefixed(), mPostData.getId(),
|
||||
new FetchComment.FetchCommentListener() {
|
||||
@Override
|
||||
public void onFetchCommentSuccess(String response) {
|
||||
ParseComment.parseComment(response, new ArrayList<CommentData>(),
|
||||
getResources().getConfiguration().locale, new ParseComment.ParseCommentListener() {
|
||||
@Override
|
||||
public void onParseCommentSuccess(ArrayList<CommentData> commentData, int moreCommentCount) {
|
||||
mCommentProgressbar.setVisibility(View.GONE);
|
||||
mMoreCommentCount = moreCommentCount;
|
||||
if (commentData.size() > 0) {
|
||||
CommentRecyclerViewAdapter adapter = new CommentRecyclerViewAdapter(
|
||||
ViewPostDetailActivity.this, commentData);
|
||||
mRecyclerView.setAdapter(adapter);
|
||||
mCommentCardView.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
mNoCommentWrapperLinearLayout.setVisibility(View.VISIBLE);
|
||||
Glide.with(ViewPostDetailActivity.this).load(R.drawable.no_comment_indicator).into(mNoCommentImageView);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onParseCommentFail() {
|
||||
mCommentProgressbar.setVisibility(View.GONE);
|
||||
showRetrySnackbar();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onParseCommentFail() {
|
||||
public void onFetchCommentFail() {
|
||||
mCommentProgressbar.setVisibility(View.GONE);
|
||||
showRetrySnackbar();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFetchCommentFail() {
|
||||
mCommentProgressbar.setVisibility(View.GONE);
|
||||
showRetrySnackbar();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void showRetrySnackbar() {
|
||||
|
@ -18,7 +18,6 @@ import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.android.volley.toolbox.Volley;
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.RequestManager;
|
||||
|
||||
@ -26,8 +25,10 @@ import de.hdodenhof.circleimageview.CircleImageView;
|
||||
|
||||
public class ViewSubredditDetailActivity extends AppCompatActivity {
|
||||
|
||||
static final String EXTRA_SUBREDDIT_NAME = "ESN";
|
||||
static final String EXTRA_SUBREDDIT_ID = "ESI";
|
||||
static final String EXTRA_SUBREDDIT_NAME_KEY = "ESN";
|
||||
static final String EXTRA_SUBREDDIT_ID_KEY = "ESI";
|
||||
|
||||
private static final String FRAGMENT_OUT_STATE_KEY = "FOSK";
|
||||
|
||||
private Fragment mFragment;
|
||||
|
||||
@ -40,7 +41,7 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
|
||||
Toolbar toolbar = findViewById(R.id.toolbar);
|
||||
setSupportActionBar(toolbar);
|
||||
|
||||
final String subredditName = getIntent().getExtras().getString(EXTRA_SUBREDDIT_NAME);
|
||||
final String subredditName = getIntent().getExtras().getString(EXTRA_SUBREDDIT_NAME_KEY);
|
||||
|
||||
final String title = "r/" + subredditName;
|
||||
setTitle(title);
|
||||
@ -74,7 +75,7 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
|
||||
final TextView descriptionTextView = findViewById(R.id.description_text_view_view_subreddit_detail_activity);
|
||||
final RequestManager glide = Glide.with(ViewSubredditDetailActivity.this);
|
||||
|
||||
String id = getIntent().getExtras().getString(EXTRA_SUBREDDIT_ID);
|
||||
String id = getIntent().getExtras().getString(EXTRA_SUBREDDIT_ID_KEY);
|
||||
SubredditViewModel.Factory factory = new SubredditViewModel.Factory(getApplication(), id);
|
||||
mSubredditViewModel = ViewModelProviders.of(this, factory).get(SubredditViewModel.class);
|
||||
mSubredditViewModel.getSubredditLiveData().observe(this, new Observer<SubredditData>() {
|
||||
@ -137,7 +138,7 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
|
||||
}
|
||||
});
|
||||
|
||||
new FetchSubredditData(Volley.newRequestQueue(this), subredditName).querySubredditData(new FetchSubredditData.FetchSubredditDataListener() {
|
||||
FetchSubredditData.fetchSubredditData(subredditName, new FetchSubredditData.FetchSubredditDataListener() {
|
||||
@Override
|
||||
public void onFetchSubredditDataSuccess(String response) {
|
||||
ParseSubredditData.parseComment(response, new ParseSubredditData.ParseSubredditDataListener() {
|
||||
@ -173,7 +174,7 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
|
||||
mFragment.setArguments(bundle);
|
||||
getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_subreddit_detail_activity, mFragment).commit();
|
||||
} else {
|
||||
mFragment = getSupportFragmentManager().getFragment(savedInstanceState, "outStateFragment");
|
||||
mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE_KEY);
|
||||
getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_subreddit_detail_activity, mFragment).commit();
|
||||
}
|
||||
}
|
||||
@ -192,7 +193,7 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
|
||||
protected void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
if(mFragment != null) {
|
||||
getSupportFragmentManager().putFragment(outState, "outStateFragment", mFragment);
|
||||
getSupportFragmentManager().putFragment(outState, FRAGMENT_OUT_STATE_KEY, mFragment);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,17 +1,17 @@
|
||||
package ml.docilealligator.infinityforreddit;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.android.volley.AuthFailureError;
|
||||
import com.android.volley.Request;
|
||||
import com.android.volley.RequestQueue;
|
||||
import com.android.volley.Response;
|
||||
import com.android.volley.VolleyError;
|
||||
import com.android.volley.toolbox.StringRequest;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.util.Log;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
import retrofit2.Retrofit;
|
||||
import retrofit2.converter.scalars.ScalarsConverterFactory;
|
||||
|
||||
/**
|
||||
* Created by alex on 3/14/18.
|
||||
*/
|
||||
@ -28,116 +28,96 @@ class VoteThing {
|
||||
void onVoteThingFail();
|
||||
}
|
||||
|
||||
private Context mContext;
|
||||
private RequestQueue mQueue;
|
||||
private RequestQueue mAcquireAccessTokenRequestQueue;
|
||||
|
||||
VoteThing(Context context, RequestQueue queue, RequestQueue acquireAccessTokenRequestQueue) {
|
||||
mContext = context;
|
||||
mQueue = queue;
|
||||
mAcquireAccessTokenRequestQueue = acquireAccessTokenRequestQueue;
|
||||
}
|
||||
|
||||
void votePost(final VoteThingListener voteThingListener, final String fullName, final String point, final int position, final int refreshTime) {
|
||||
if(mContext != null) {
|
||||
static void voteThing(final Context context, final VoteThingListener voteThingListener, final String fullName, final String point, final int position, final int refreshTime) {
|
||||
if(context != null) {
|
||||
if(refreshTime < 0) {
|
||||
voteThingListener.onVoteThingFail(position);
|
||||
return;
|
||||
}
|
||||
|
||||
StringRequest voteRequest = new StringRequest(Request.Method.POST, RedditUtils.OAUTH_API_BASE_URI + RedditUtils.VOTE_SUFFIX, new Response.Listener<String>() {
|
||||
Retrofit retrofit = new Retrofit.Builder()
|
||||
.baseUrl(RedditUtils.OAUTH_API_BASE_URI)
|
||||
.addConverterFactory(ScalarsConverterFactory.create())
|
||||
.build();
|
||||
|
||||
RedditAPI api = retrofit.create(RedditAPI.class);
|
||||
|
||||
String accessToken = context.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE)
|
||||
.getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, "");
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put(RedditUtils.DIR_KEY, point);
|
||||
params.put(RedditUtils.ID_KEY, fullName);
|
||||
params.put(RedditUtils.RANK_KEY, RedditUtils.RANK);
|
||||
|
||||
Call<String> voteThingCall = api.voteThing(RedditUtils.getOAuthHeader(accessToken), params);
|
||||
voteThingCall.enqueue(new Callback<String>() {
|
||||
@Override
|
||||
public void onResponse(String response) {
|
||||
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
|
||||
voteThingListener.onVoteThingSuccess(position);
|
||||
}
|
||||
}, new Response.ErrorListener() {
|
||||
@Override
|
||||
public void onErrorResponse(VolleyError error) {
|
||||
if (error instanceof AuthFailureError) {
|
||||
//Access token expired
|
||||
new AcquireAccessToken(mContext).refreshAccessToken(mAcquireAccessTokenRequestQueue,
|
||||
new AcquireAccessToken.AcquireAccessTokenListener() {
|
||||
@Override
|
||||
public void onAcquireAccessTokenSuccess() {
|
||||
votePost(voteThingListener, fullName, point, position, refreshTime - 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAcquireAccessTokenFail() {}
|
||||
});
|
||||
} else {
|
||||
voteThingListener.onVoteThingFail(position);
|
||||
}
|
||||
}
|
||||
}) {
|
||||
@Override
|
||||
protected Map<String, String> getParams() {
|
||||
HashMap<String, String> params = new HashMap<>();
|
||||
params.put(RedditUtils.DIR_KEY, point);
|
||||
params.put(RedditUtils.ID_KEY, fullName);
|
||||
params.put(RedditUtils.RANK_KEY, RedditUtils.RANK);
|
||||
return params;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String> getHeaders() {
|
||||
String accessToken = mContext.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE).getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, "");
|
||||
return RedditUtils.getOAuthHeader(accessToken);
|
||||
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
|
||||
Log.i("call failed", t.getMessage());
|
||||
RefreshAccessToken.refreshAccessToken(context,
|
||||
new RefreshAccessToken.RefreshAccessTokenListener() {
|
||||
@Override
|
||||
public void onRefreshAccessTokenSuccess() {
|
||||
voteThing(context, voteThingListener, fullName, point, position, refreshTime - 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRefreshAccessTokenFail() {
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
voteRequest.setTag(VoteThing.class);
|
||||
mQueue.add(voteRequest);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void votePost(final VoteThingWithoutPositionListener voteThingWithoutPositionListener, final String fullName, final String point, final int refreshTime) {
|
||||
if(mContext != null) {
|
||||
static void voteThing(final Context context, final VoteThingWithoutPositionListener voteThingWithoutPositionListener, final String fullName, final String point, final int refreshTime) {
|
||||
if(context != null) {
|
||||
if(refreshTime < 0) {
|
||||
voteThingWithoutPositionListener.onVoteThingFail();
|
||||
return;
|
||||
}
|
||||
StringRequest voteRequest = new StringRequest(Request.Method.POST, RedditUtils.OAUTH_API_BASE_URI + RedditUtils.VOTE_SUFFIX, new Response.Listener<String>() {
|
||||
|
||||
Retrofit retrofit = new Retrofit.Builder()
|
||||
.baseUrl(RedditUtils.OAUTH_API_BASE_URI)
|
||||
.addConverterFactory(ScalarsConverterFactory.create())
|
||||
.build();
|
||||
|
||||
RedditAPI api = retrofit.create(RedditAPI.class);
|
||||
|
||||
String accessToken = context.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE)
|
||||
.getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, "");
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put(RedditUtils.DIR_KEY, point);
|
||||
params.put(RedditUtils.ID_KEY, fullName);
|
||||
params.put(RedditUtils.RANK_KEY, RedditUtils.RANK);
|
||||
|
||||
Call<String> voteThingCall = api.voteThing(RedditUtils.getOAuthHeader(accessToken), params);
|
||||
voteThingCall.enqueue(new Callback<String>() {
|
||||
@Override
|
||||
public void onResponse(String response) {
|
||||
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
|
||||
voteThingWithoutPositionListener.onVoteThingSuccess();
|
||||
}
|
||||
}, new Response.ErrorListener() {
|
||||
@Override
|
||||
public void onErrorResponse(VolleyError error) {
|
||||
if (error instanceof AuthFailureError) {
|
||||
//Access token expired
|
||||
new AcquireAccessToken(mContext).refreshAccessToken(mAcquireAccessTokenRequestQueue,
|
||||
new AcquireAccessToken.AcquireAccessTokenListener() {
|
||||
@Override
|
||||
public void onAcquireAccessTokenSuccess() {
|
||||
votePost(voteThingWithoutPositionListener, fullName, point, refreshTime - 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAcquireAccessTokenFail() {}
|
||||
});
|
||||
} else {
|
||||
voteThingWithoutPositionListener.onVoteThingFail();
|
||||
}
|
||||
}
|
||||
}) {
|
||||
@Override
|
||||
protected Map<String, String> getParams() {
|
||||
HashMap<String, String> params = new HashMap<>();
|
||||
params.put(RedditUtils.DIR_KEY, point);
|
||||
params.put(RedditUtils.ID_KEY, fullName);
|
||||
params.put(RedditUtils.RANK_KEY, RedditUtils.RANK);
|
||||
return params;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String> getHeaders() {
|
||||
String accessToken = mContext.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE).getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, "");
|
||||
return RedditUtils.getOAuthHeader(accessToken);
|
||||
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
|
||||
Log.i("call failed", t.getMessage());
|
||||
RefreshAccessToken.refreshAccessToken(context,
|
||||
new RefreshAccessToken.RefreshAccessTokenListener() {
|
||||
@Override
|
||||
public void onRefreshAccessTokenSuccess() {
|
||||
voteThing(context, voteThingWithoutPositionListener, fullName, point, refreshTime - 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRefreshAccessTokenFail() {}
|
||||
});
|
||||
}
|
||||
};
|
||||
voteRequest.setTag(VoteThing.class);
|
||||
mQueue.add(voteRequest);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user