mirror of
https://github.com/Docile-Alligator/Infinity-For-Reddit.git
synced 2026-03-01 13:19:49 +00:00
Use Executor in FetchFlairs instead of AsyncTask.
This commit is contained in:
@ -11,18 +11,18 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import ml.docilealligator.infinityforreddit.subreddit.Flair;
|
||||
import ml.docilealligator.infinityforreddit.R;
|
||||
import ml.docilealligator.infinityforreddit.activities.BaseActivity;
|
||||
import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
|
||||
import ml.docilealligator.infinityforreddit.databinding.ItemFlairBinding;
|
||||
import ml.docilealligator.infinityforreddit.subreddit.Flair;
|
||||
import ml.docilealligator.infinityforreddit.utils.Utils;
|
||||
|
||||
public class FlairBottomSheetRecyclerViewAdapter extends RecyclerView.Adapter<FlairBottomSheetRecyclerViewAdapter.FlairViewHolder> {
|
||||
private final BaseActivity activity;
|
||||
private ArrayList<Flair> flairs;
|
||||
private List<Flair> flairs;
|
||||
private final int flairTextColor;
|
||||
private final ItemClickListener itemClickListener;
|
||||
|
||||
@ -62,7 +62,7 @@ public class FlairBottomSheetRecyclerViewAdapter extends RecyclerView.Adapter<Fl
|
||||
});
|
||||
}
|
||||
|
||||
if (flairs.get(holder.getBindingAdapterPosition()).isEditable() && flairs.get(holder.getBindingAdapterPosition()).getText().equals("")) {
|
||||
if (flairs.get(holder.getBindingAdapterPosition()).isEditable() && flairs.get(holder.getBindingAdapterPosition()).getText().isEmpty()) {
|
||||
holder.itemView.setOnClickListener(view -> holder.binding.editFlairImageViewItemFlair.performClick());
|
||||
} else {
|
||||
holder.itemView.setOnClickListener(view -> itemClickListener.onClick(flairs.get(holder.getBindingAdapterPosition())));
|
||||
@ -82,7 +82,7 @@ public class FlairBottomSheetRecyclerViewAdapter extends RecyclerView.Adapter<Fl
|
||||
holder.binding.editFlairImageViewItemFlair.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
public void changeDataset(ArrayList<Flair> flairs) {
|
||||
public void changeDataset(List<Flair> flairs) {
|
||||
this.flairs = flairs;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@ -3,24 +3,24 @@ package ml.docilealligator.infinityforreddit.bottomsheetfragments;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import com.google.android.material.bottomsheet.BottomSheetBehavior;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
import ml.docilealligator.infinityforreddit.subreddit.FetchFlairs;
|
||||
import ml.docilealligator.infinityforreddit.subreddit.Flair;
|
||||
import ml.docilealligator.infinityforreddit.Infinity;
|
||||
import ml.docilealligator.infinityforreddit.R;
|
||||
import ml.docilealligator.infinityforreddit.activities.BaseActivity;
|
||||
@ -29,13 +29,12 @@ import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
|
||||
import ml.docilealligator.infinityforreddit.customviews.LandscapeExpandedBottomSheetDialogFragment;
|
||||
import ml.docilealligator.infinityforreddit.databinding.FragmentFlairBottomSheetBinding;
|
||||
import ml.docilealligator.infinityforreddit.events.FlairSelectedEvent;
|
||||
import ml.docilealligator.infinityforreddit.subreddit.FetchFlairs;
|
||||
import ml.docilealligator.infinityforreddit.subreddit.Flair;
|
||||
import ml.docilealligator.infinityforreddit.utils.Utils;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
|
||||
/**
|
||||
* A simple {@link Fragment} subclass.
|
||||
*/
|
||||
public class FlairBottomSheetFragment extends LandscapeExpandedBottomSheetDialogFragment {
|
||||
|
||||
public static final String EXTRA_SUBREDDIT_NAME = "ESN";
|
||||
@ -45,8 +44,11 @@ public class FlairBottomSheetFragment extends LandscapeExpandedBottomSheetDialog
|
||||
Retrofit mOauthRetrofit;
|
||||
@Inject
|
||||
CustomThemeWrapper mCustomThemeWrapper;
|
||||
@Inject
|
||||
Executor mExecutor;
|
||||
private String mSubredditName;
|
||||
private BaseActivity mActivity;
|
||||
private Handler mHandler;
|
||||
private FlairBottomSheetRecyclerViewAdapter mAdapter;
|
||||
private FragmentFlairBottomSheetBinding binding;
|
||||
|
||||
@ -80,18 +82,20 @@ public class FlairBottomSheetFragment extends LandscapeExpandedBottomSheetDialog
|
||||
|
||||
mSubredditName = getArguments().getString(EXTRA_SUBREDDIT_NAME);
|
||||
|
||||
mHandler = new Handler(Looper.getMainLooper());
|
||||
|
||||
fetchFlairs();
|
||||
|
||||
return binding.getRoot();
|
||||
}
|
||||
|
||||
private void fetchFlairs() {
|
||||
FetchFlairs.fetchFlairsInSubreddit(mOauthRetrofit, mActivity.accessToken,
|
||||
FetchFlairs.fetchFlairsInSubreddit(mExecutor, mHandler, mOauthRetrofit, mActivity.accessToken,
|
||||
mSubredditName, new FetchFlairs.FetchFlairsInSubredditListener() {
|
||||
@Override
|
||||
public void fetchSuccessful(ArrayList<Flair> flairs) {
|
||||
public void fetchSuccessful(List<Flair> flairs) {
|
||||
binding.progressBarFlairBottomSheetFragment.setVisibility(View.GONE);
|
||||
if (flairs == null || flairs.size() == 0) {
|
||||
if (flairs == null || flairs.isEmpty()) {
|
||||
binding.errorTextViewFlairBottomSheetFragment.setVisibility(View.VISIBLE);
|
||||
binding.errorTextViewFlairBottomSheetFragment.setText(R.string.no_flair);
|
||||
} else {
|
||||
|
||||
@ -1,103 +1,80 @@
|
||||
package ml.docilealligator.infinityforreddit.subreddit;
|
||||
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Handler;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.WorkerThread;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import ml.docilealligator.infinityforreddit.apis.RedditAPI;
|
||||
import ml.docilealligator.infinityforreddit.utils.APIUtils;
|
||||
import ml.docilealligator.infinityforreddit.utils.JSONUtils;
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
import retrofit2.Response;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
public class FetchFlairs {
|
||||
public static void fetchFlairsInSubreddit(Retrofit oauthRetrofit, String accessToken, String subredditName, FetchFlairsInSubredditListener fetchFlairsInSubredditListener) {
|
||||
RedditAPI api = oauthRetrofit.create(RedditAPI.class);
|
||||
public static void fetchFlairsInSubreddit(Executor executor, Handler handler, Retrofit oauthRetrofit, String accessToken, String subredditName, FetchFlairsInSubredditListener fetchFlairsInSubredditListener) {
|
||||
executor.execute(() -> {
|
||||
RedditAPI api = oauthRetrofit.create(RedditAPI.class);
|
||||
|
||||
Call<String> flairsCall = api.getFlairs(APIUtils.getOAuthHeader(accessToken), subredditName);
|
||||
flairsCall.enqueue(new Callback<String>() {
|
||||
@Override
|
||||
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
|
||||
Call<String> flairsCall = api.getFlairs(APIUtils.getOAuthHeader(accessToken), subredditName);
|
||||
try {
|
||||
Response<String> response = flairsCall.execute();
|
||||
if (response.isSuccessful()) {
|
||||
new ParseFlairsAsyncTask(response.body(), new ParseFlairsAsyncTask.ParseFlairsAsyncTaskListener() {
|
||||
@Override
|
||||
public void parseSuccessful(ArrayList<Flair> flairs) {
|
||||
fetchFlairsInSubredditListener.fetchSuccessful(flairs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void parseFailed() {
|
||||
fetchFlairsInSubredditListener.fetchFailed();
|
||||
}
|
||||
}).execute();
|
||||
List<Flair> flairs = parseFlairs(response.body());
|
||||
if (flairs != null) {
|
||||
handler.post(() -> fetchFlairsInSubredditListener.fetchSuccessful(flairs));
|
||||
} else {
|
||||
handler.post(fetchFlairsInSubredditListener::fetchFailed);
|
||||
}
|
||||
} else if (response.code() == 403) {
|
||||
//No flairs
|
||||
fetchFlairsInSubredditListener.fetchSuccessful(null);
|
||||
handler.post(() -> fetchFlairsInSubredditListener.fetchSuccessful(null));
|
||||
} else {
|
||||
fetchFlairsInSubredditListener.fetchFailed();
|
||||
handler.post(fetchFlairsInSubredditListener::fetchFailed);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
|
||||
fetchFlairsInSubredditListener.fetchFailed();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
handler.post(fetchFlairsInSubredditListener::fetchFailed);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public interface FetchFlairsInSubredditListener {
|
||||
void fetchSuccessful(ArrayList<Flair> flairs);
|
||||
|
||||
void fetchFailed();
|
||||
}
|
||||
|
||||
private static class ParseFlairsAsyncTask extends AsyncTask<Void, ArrayList<Flair>, ArrayList<Flair>> {
|
||||
private final String response;
|
||||
private final ParseFlairsAsyncTaskListener parseFlairsAsyncTaskListener;
|
||||
ParseFlairsAsyncTask(String response, ParseFlairsAsyncTaskListener parseFlairsAsyncTaskListener) {
|
||||
this.response = response;
|
||||
this.parseFlairsAsyncTaskListener = parseFlairsAsyncTaskListener;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ArrayList<Flair> doInBackground(Void... voids) {
|
||||
try {
|
||||
JSONArray jsonArray = new JSONArray(response);
|
||||
ArrayList<Flair> flairs = new ArrayList<>();
|
||||
for (int i = 0; i < jsonArray.length(); i++) {
|
||||
@WorkerThread
|
||||
@Nullable
|
||||
private static List<Flair> parseFlairs(String response) {
|
||||
try {
|
||||
JSONArray jsonArray = new JSONArray(response);
|
||||
List<Flair> flairs = new ArrayList<>();
|
||||
for (int i = 0; i < jsonArray.length(); i++) {
|
||||
try {
|
||||
String id = jsonArray.getJSONObject(i).getString(JSONUtils.ID_KEY);
|
||||
String text = jsonArray.getJSONObject(i).getString(JSONUtils.TEXT_KEY);
|
||||
boolean editable = jsonArray.getJSONObject(i).getBoolean(JSONUtils.TEXT_EDITABLE_KEY);
|
||||
|
||||
flairs.add(new Flair(id, text, editable));
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return flairs;
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
return flairs;
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(ArrayList<Flair> strings) {
|
||||
if (strings != null) {
|
||||
parseFlairsAsyncTaskListener.parseSuccessful(strings);
|
||||
} else {
|
||||
parseFlairsAsyncTaskListener.parseFailed();
|
||||
}
|
||||
}
|
||||
public interface FetchFlairsInSubredditListener {
|
||||
void fetchSuccessful(List<Flair> flairs);
|
||||
|
||||
interface ParseFlairsAsyncTaskListener {
|
||||
void parseSuccessful(ArrayList<Flair> flairs);
|
||||
|
||||
void parseFailed();
|
||||
}
|
||||
void fetchFailed();
|
||||
}
|
||||
}
|
||||
|
||||
@ -17,4 +17,4 @@ public class SubredditRepository {
|
||||
LiveData<SubredditData> getSubredditLiveData() {
|
||||
return mSubredditLiveData;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user