From 027e49521f673306d5bf5a82bb9892a29d64be30 Mon Sep 17 00:00:00 2001 From: Docile-Alligator <25734209+Docile-Alligator@users.noreply.github.com> Date: Wed, 9 Apr 2025 04:07:09 -0400 Subject: [PATCH] Use Executor in FetchFlairs instead of AsyncTask. --- .../FlairBottomSheetRecyclerViewAdapter.java | 10 +- .../FlairBottomSheetFragment.java | 24 ++-- .../subreddit/FetchFlairs.java | 105 +++++++----------- .../subreddit/SubredditRepository.java | 2 +- 4 files changed, 61 insertions(+), 80 deletions(-) diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/FlairBottomSheetRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/FlairBottomSheetRecyclerViewAdapter.java index 14a3d34c..3c3b6925 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/FlairBottomSheetRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/FlairBottomSheetRecyclerViewAdapter.java @@ -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 { private final BaseActivity activity; - private ArrayList flairs; + private List flairs; private final int flairTextColor; private final ItemClickListener itemClickListener; @@ -62,7 +62,7 @@ public class FlairBottomSheetRecyclerViewAdapter extends RecyclerView.Adapter 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 flairs) { + public void changeDataset(List flairs) { this.flairs = flairs; notifyDataSetChanged(); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/bottomsheetfragments/FlairBottomSheetFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/bottomsheetfragments/FlairBottomSheetFragment.java index 9479ce72..a45f5859 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/bottomsheetfragments/FlairBottomSheetFragment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/bottomsheetfragments/FlairBottomSheetFragment.java @@ -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 flairs) { + public void fetchSuccessful(List 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 { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/subreddit/FetchFlairs.java b/app/src/main/java/ml/docilealligator/infinityforreddit/subreddit/FetchFlairs.java index 842eec94..86643c34 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/subreddit/FetchFlairs.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/subreddit/FetchFlairs.java @@ -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 flairsCall = api.getFlairs(APIUtils.getOAuthHeader(accessToken), subredditName); - flairsCall.enqueue(new Callback() { - @Override - public void onResponse(@NonNull Call call, @NonNull Response response) { + Call flairsCall = api.getFlairs(APIUtils.getOAuthHeader(accessToken), subredditName); + try { + Response response = flairsCall.execute(); if (response.isSuccessful()) { - new ParseFlairsAsyncTask(response.body(), new ParseFlairsAsyncTask.ParseFlairsAsyncTaskListener() { - @Override - public void parseSuccessful(ArrayList flairs) { - fetchFlairsInSubredditListener.fetchSuccessful(flairs); - } - - @Override - public void parseFailed() { - fetchFlairsInSubredditListener.fetchFailed(); - } - }).execute(); + List 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 call, @NonNull Throwable t) { - fetchFlairsInSubredditListener.fetchFailed(); + } catch (IOException e) { + e.printStackTrace(); + handler.post(fetchFlairsInSubredditListener::fetchFailed); } }); } - public interface FetchFlairsInSubredditListener { - void fetchSuccessful(ArrayList flairs); - - void fetchFailed(); - } - - private static class ParseFlairsAsyncTask extends AsyncTask, ArrayList> { - private final String response; - private final ParseFlairsAsyncTaskListener parseFlairsAsyncTaskListener; - ParseFlairsAsyncTask(String response, ParseFlairsAsyncTaskListener parseFlairsAsyncTaskListener) { - this.response = response; - this.parseFlairsAsyncTaskListener = parseFlairsAsyncTaskListener; - } - - @Override - protected ArrayList doInBackground(Void... voids) { - try { - JSONArray jsonArray = new JSONArray(response); - ArrayList flairs = new ArrayList<>(); - for (int i = 0; i < jsonArray.length(); i++) { + @WorkerThread + @Nullable + private static List parseFlairs(String response) { + try { + JSONArray jsonArray = new JSONArray(response); + List 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 strings) { - if (strings != null) { - parseFlairsAsyncTaskListener.parseSuccessful(strings); - } else { - parseFlairsAsyncTaskListener.parseFailed(); - } - } + public interface FetchFlairsInSubredditListener { + void fetchSuccessful(List flairs); - interface ParseFlairsAsyncTaskListener { - void parseSuccessful(ArrayList flairs); - - void parseFailed(); - } + void fetchFailed(); } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/subreddit/SubredditRepository.java b/app/src/main/java/ml/docilealligator/infinityforreddit/subreddit/SubredditRepository.java index b31d8c83..5ec33f22 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/subreddit/SubredditRepository.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/subreddit/SubredditRepository.java @@ -17,4 +17,4 @@ public class SubredditRepository { LiveData getSubredditLiveData() { return mSubredditLiveData; } -} +} \ No newline at end of file