Use Executor in FetchFlairs instead of AsyncTask.

This commit is contained in:
Docile-Alligator
2025-04-09 04:07:09 -04:00
parent 11106626a7
commit 027e49521f
4 changed files with 61 additions and 80 deletions

View File

@ -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();
}

View File

@ -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 {

View File

@ -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();
}
}

View File

@ -17,4 +17,4 @@ public class SubredditRepository {
LiveData<SubredditData> getSubredditLiveData() {
return mSubredditLiveData;
}
}
}