diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewImgurMediaActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewImgurMediaActivity.java index 77ba0fa7..f301fcfa 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewImgurMediaActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewImgurMediaActivity.java @@ -7,9 +7,9 @@ import android.content.SharedPreferences; import android.graphics.Typeface; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.text.Html; import android.view.Menu; import android.view.MenuItem; @@ -17,6 +17,8 @@ import android.view.View; import android.widget.Toast; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; @@ -36,7 +38,6 @@ import javax.inject.Named; import app.futured.hauler.DragDirection; import ml.docilealligator.infinityforreddit.CustomFontReceiver; -import ml.docilealligator.infinityforreddit.post.ImgurMedia; import ml.docilealligator.infinityforreddit.Infinity; import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.SetAsWallpaperCallback; @@ -51,6 +52,7 @@ import ml.docilealligator.infinityforreddit.font.TitleFontFamily; import ml.docilealligator.infinityforreddit.font.TitleFontStyle; import ml.docilealligator.infinityforreddit.fragments.ViewImgurImageFragment; import ml.docilealligator.infinityforreddit.fragments.ViewImgurVideoFragment; +import ml.docilealligator.infinityforreddit.post.ImgurMedia; import ml.docilealligator.infinityforreddit.services.DownloadMediaService; import ml.docilealligator.infinityforreddit.utils.APIUtils; import ml.docilealligator.infinityforreddit.utils.JSONUtils; @@ -72,7 +74,7 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa public Typeface typeface; private SectionsPagerAdapter sectionsPagerAdapter; - private ArrayList images; + private ArrayList mImages; private boolean useBottomAppBar; @Inject @Named("imgur") @@ -82,6 +84,7 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa SharedPreferences sharedPreferences; @Inject Executor executor; + private Handler handler; private ActivityViewImgurMediaBinding binding; @Override @@ -118,6 +121,8 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + handler = new Handler(Looper.getMainLooper()); + useBottomAppBar = sharedPreferences.getBoolean(SharedPreferencesUtils.USE_BOTTOM_TOOLBAR_IN_MEDIA_VIEWER, false); if (!useBottomAppBar) { @@ -137,7 +142,7 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa } if (savedInstanceState != null) { - images = savedInstanceState.getParcelableArrayList(IMGUR_IMAGES_STATE); + mImages = savedInstanceState.getParcelableArrayList(IMGUR_IMAGES_STATE); } if (sharedPreferences.getBoolean(SharedPreferencesUtils.SWIPE_VERTICALLY_TO_GO_BACK_FROM_MEDIA, true)) { @@ -150,7 +155,7 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa binding.getRoot().setDragEnabled(false); } - if (images == null) { + if (mImages == null) { fetchImgurMedia(imgurId); } else { binding.progressBarViewImgurMediaActivity.setVisibility(View.GONE); @@ -174,21 +179,20 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa @Override public void onResponse(@NonNull Call call, @NonNull Response response) { if (response.isSuccessful()) { - new ParseImgurImagesAsyncTask(response.body(), new ParseImgurImagesAsyncTask.ParseImgurImagesAsyncTaskListener() { - @Override - public void success(ArrayList images) { - ViewImgurMediaActivity.this.images = images; - binding.progressBarViewImgurMediaActivity.setVisibility(View.GONE); - binding.loadImageErrorLinearLayoutViewImgurMediaActivity.setVisibility(View.GONE); - setupViewPager(); - } - - @Override - public void failed() { - binding.progressBarViewImgurMediaActivity.setVisibility(View.GONE); - binding.loadImageErrorLinearLayoutViewImgurMediaActivity.setVisibility(View.VISIBLE); - } - }).execute(); + executor.execute(() -> { + ArrayList images = parseImgurImages(response.body()); + handler.post(() -> { + if (images != null) { + mImages = images; + binding.progressBarViewImgurMediaActivity.setVisibility(View.GONE); + binding.loadImageErrorLinearLayoutViewImgurMediaActivity.setVisibility(View.GONE); + setupViewPager(); + } else { + binding.progressBarViewImgurMediaActivity.setVisibility(View.GONE); + binding.loadImageErrorLinearLayoutViewImgurMediaActivity.setVisibility(View.VISIBLE); + } + }); + }); } else { binding.progressBarViewImgurMediaActivity.setVisibility(View.GONE); binding.loadImageErrorLinearLayoutViewImgurMediaActivity.setVisibility(View.VISIBLE); @@ -208,21 +212,20 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa @Override public void onResponse(@NonNull Call call, @NonNull Response response) { if (response.isSuccessful()) { - new ParseImgurImagesAsyncTask(response.body(), new ParseImgurImagesAsyncTask.ParseImgurImagesAsyncTaskListener() { - @Override - public void success(ArrayList images) { - ViewImgurMediaActivity.this.images = images; - binding.progressBarViewImgurMediaActivity.setVisibility(View.GONE); - binding.loadImageErrorLinearLayoutViewImgurMediaActivity.setVisibility(View.GONE); - setupViewPager(); - } - - @Override - public void failed() { - binding.progressBarViewImgurMediaActivity.setVisibility(View.GONE); - binding.loadImageErrorLinearLayoutViewImgurMediaActivity.setVisibility(View.VISIBLE); - } - }).execute(); + executor.execute(() -> { + ArrayList images = parseImgurImages(response.body()); + handler.post(() -> { + if (images != null) { + mImages = images; + binding.progressBarViewImgurMediaActivity.setVisibility(View.GONE); + binding.loadImageErrorLinearLayoutViewImgurMediaActivity.setVisibility(View.GONE); + setupViewPager(); + } else { + binding.progressBarViewImgurMediaActivity.setVisibility(View.GONE); + binding.loadImageErrorLinearLayoutViewImgurMediaActivity.setVisibility(View.VISIBLE); + } + }); + }); } else { binding.progressBarViewImgurMediaActivity.setVisibility(View.GONE); binding.loadImageErrorLinearLayoutViewImgurMediaActivity.setVisibility(View.VISIBLE); @@ -242,22 +245,21 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa @Override public void onResponse(@NonNull Call call, @NonNull Response response) { if (response.isSuccessful()) { - new ParseImgurImageAsyncTask(response.body(), new ParseImgurImageAsyncTask.ParseImgurImageAsyncTaskListener() { - @Override - public void success(ImgurMedia image) { - ViewImgurMediaActivity.this.images = new ArrayList<>(); - ViewImgurMediaActivity.this.images.add(image); - binding.progressBarViewImgurMediaActivity.setVisibility(View.GONE); - binding.loadImageErrorLinearLayoutViewImgurMediaActivity.setVisibility(View.GONE); - setupViewPager(); - } - - @Override - public void failed() { - binding.progressBarViewImgurMediaActivity.setVisibility(View.GONE); - binding.loadImageErrorLinearLayoutViewImgurMediaActivity.setVisibility(View.VISIBLE); - } - }).execute(); + executor.execute(() -> { + ImgurMedia image = parseImgurImage(response.body()); + handler.post(() -> { + if (image != null) { + mImages = new ArrayList<>(); + mImages.add(image); + binding.progressBarViewImgurMediaActivity.setVisibility(View.GONE); + binding.loadImageErrorLinearLayoutViewImgurMediaActivity.setVisibility(View.GONE); + setupViewPager(); + } else { + binding.progressBarViewImgurMediaActivity.setVisibility(View.GONE); + binding.loadImageErrorLinearLayoutViewImgurMediaActivity.setVisibility(View.VISIBLE); + } + }); + }); } else { binding.progressBarViewImgurMediaActivity.setVisibility(View.GONE); binding.loadImageErrorLinearLayoutViewImgurMediaActivity.setVisibility(View.VISIBLE); @@ -290,11 +292,11 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa } private void setToolbarTitle(int position) { - if (images != null && position >= 0 && position < images.size()) { - if (images.get(position).getType() == ImgurMedia.TYPE_VIDEO) { - setTitle(Utils.getTabTextWithCustomFont(typeface, Html.fromHtml("" + getString(R.string.view_imgur_media_activity_video_label, position + 1, images.size()) + ""))); + if (mImages != null && position >= 0 && position < mImages.size()) { + if (mImages.get(position).getType() == ImgurMedia.TYPE_VIDEO) { + setTitle(Utils.getTabTextWithCustomFont(typeface, Html.fromHtml("" + getString(R.string.view_imgur_media_activity_video_label, position + 1, mImages.size()) + ""))); } else { - setTitle(Utils.getTabTextWithCustomFont(typeface, Html.fromHtml("" + getString(R.string.view_imgur_media_activity_image_label, position + 1, images.size()) + ""))); + setTitle(Utils.getTabTextWithCustomFont(typeface, Html.fromHtml("" + getString(R.string.view_imgur_media_activity_image_label, position + 1, mImages.size()) + ""))); } } } @@ -315,7 +317,7 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa return true; } else if (item.getItemId() == R.id.action_download_all_imgur_album_media_view_imgur_media_activity) { //TODO: contentEstimatedBytes - JobInfo jobInfo = DownloadMediaService.constructImgurAlbumDownloadAllMediaJobInfo(this, 5000000L * images.size(), images); + JobInfo jobInfo = DownloadMediaService.constructImgurAlbumDownloadAllMediaJobInfo(this, 5000000L * mImages.size(), mImages); ((JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE)).schedule(jobInfo); Toast.makeText(this, R.string.download_started, Toast.LENGTH_SHORT).show(); @@ -328,13 +330,13 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa @Override protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); - outState.putParcelableArrayList(IMGUR_IMAGES_STATE, images); + outState.putParcelableArrayList(IMGUR_IMAGES_STATE, mImages); } @Override public void setToHomeScreen(int viewPagerPosition) { - if (images != null && viewPagerPosition >= 0 && viewPagerPosition < images.size()) { - WallpaperSetter.set(executor, new Handler(), images.get(viewPagerPosition).getLink(), WallpaperSetter.HOME_SCREEN, this, + if (mImages != null && viewPagerPosition >= 0 && viewPagerPosition < mImages.size()) { + WallpaperSetter.set(executor, new Handler(), mImages.get(viewPagerPosition).getLink(), WallpaperSetter.HOME_SCREEN, this, new WallpaperSetter.SetWallpaperListener() { @Override public void success() { @@ -351,8 +353,8 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa @Override public void setToLockScreen(int viewPagerPosition) { - if (images != null && viewPagerPosition >= 0 && viewPagerPosition < images.size()) { - WallpaperSetter.set(executor, new Handler(), images.get(viewPagerPosition).getLink(), WallpaperSetter.LOCK_SCREEN, this, + if (mImages != null && viewPagerPosition >= 0 && viewPagerPosition < mImages.size()) { + WallpaperSetter.set(executor, new Handler(), mImages.get(viewPagerPosition).getLink(), WallpaperSetter.LOCK_SCREEN, this, new WallpaperSetter.SetWallpaperListener() { @Override public void success() { @@ -369,8 +371,8 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa @Override public void setToBoth(int viewPagerPosition) { - if (images != null && viewPagerPosition >= 0 && viewPagerPosition < images.size()) { - WallpaperSetter.set(executor, new Handler(), images.get(viewPagerPosition).getLink(), WallpaperSetter.BOTH_SCREENS, this, + if (mImages != null && viewPagerPosition >= 0 && viewPagerPosition < mImages.size()) { + WallpaperSetter.set(executor, new Handler(), mImages.get(viewPagerPosition).getLink(), WallpaperSetter.BOTH_SCREENS, this, new WallpaperSetter.SetWallpaperListener() { @Override public void success() { @@ -389,6 +391,60 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa return binding.viewPagerViewImgurMediaActivity.getCurrentItem(); } + @WorkerThread + @Nullable + private static ArrayList parseImgurImages(String response) { + try { + JSONArray jsonArray = new JSONObject(response).getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.IMAGES_KEY); + ArrayList images = new ArrayList<>(); + for (int i = 0; i < jsonArray.length(); i++) { + try { + JSONObject image = jsonArray.getJSONObject(i); + String type = image.getString(JSONUtils.TYPE_KEY); + if (type.contains("gif")) { + images.add(new ImgurMedia(image.getString(JSONUtils.ID_KEY), + image.getString(JSONUtils.TITLE_KEY), image.getString(JSONUtils.DESCRIPTION_KEY), + "video/mp4", image.getString(JSONUtils.MP4_KEY))); + } else { + images.add(new ImgurMedia(image.getString(JSONUtils.ID_KEY), + image.getString(JSONUtils.TITLE_KEY), image.getString(JSONUtils.DESCRIPTION_KEY), + type, image.getString(JSONUtils.LINK_KEY))); + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + + return images; + } catch (JSONException e) { + e.printStackTrace(); + } + + return null; + } + + @WorkerThread + @Nullable + private static ImgurMedia parseImgurImage(String response) { + try { + JSONObject image = new JSONObject(response).getJSONObject(JSONUtils.DATA_KEY); + String type = image.getString(JSONUtils.TYPE_KEY); + if (type.contains("gif")) { + return new ImgurMedia(image.getString(JSONUtils.ID_KEY), + image.getString(JSONUtils.TITLE_KEY), image.getString(JSONUtils.DESCRIPTION_KEY), + "video/mp4", image.getString(JSONUtils.MP4_KEY)); + } else { + return new ImgurMedia(image.getString(JSONUtils.ID_KEY), + image.getString(JSONUtils.TITLE_KEY), image.getString(JSONUtils.DESCRIPTION_KEY), + type, image.getString(JSONUtils.LINK_KEY)); + } + } catch (JSONException e) { + e.printStackTrace(); + } + + return null; + } + @Override public void setCustomFont(Typeface typeface, Typeface titleTypeface, Typeface contentTypeface) { this.typeface = typeface; @@ -403,13 +459,13 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa @NonNull @Override public Fragment getItem(int position) { - ImgurMedia imgurMedia = images.get(position); + ImgurMedia imgurMedia = mImages.get(position); if (imgurMedia.getType() == ImgurMedia.TYPE_VIDEO) { ViewImgurVideoFragment fragment = new ViewImgurVideoFragment(); Bundle bundle = new Bundle(); bundle.putParcelable(ViewImgurVideoFragment.EXTRA_IMGUR_VIDEO, imgurMedia); bundle.putInt(ViewImgurVideoFragment.EXTRA_INDEX, position); - bundle.putInt(ViewImgurVideoFragment.EXTRA_MEDIA_COUNT, images.size()); + bundle.putInt(ViewImgurVideoFragment.EXTRA_MEDIA_COUNT, mImages.size()); fragment.setArguments(bundle); return fragment; } else { @@ -417,7 +473,7 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa Bundle bundle = new Bundle(); bundle.putParcelable(ViewImgurImageFragment.EXTRA_IMGUR_IMAGES, imgurMedia); bundle.putInt(ViewImgurImageFragment.EXTRA_INDEX, position); - bundle.putInt(ViewImgurImageFragment.EXTRA_MEDIA_COUNT, images.size()); + bundle.putInt(ViewImgurImageFragment.EXTRA_MEDIA_COUNT, mImages.size()); fragment.setArguments(bundle); return fragment; } @@ -425,113 +481,7 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa @Override public int getCount() { - return images.size(); - } - } - - private static class ParseImgurImagesAsyncTask extends AsyncTask { - - private final String response; - private ArrayList images; - private boolean parseFailed = false; - private final ParseImgurImagesAsyncTaskListener parseImgurImagesAsyncTaskListener; - - interface ParseImgurImagesAsyncTaskListener { - void success(ArrayList images); - - void failed(); - } - - ParseImgurImagesAsyncTask(String response, ParseImgurImagesAsyncTaskListener parseImgurImagesAsyncTaskListener) { - this.response = response; - this.parseImgurImagesAsyncTaskListener = parseImgurImagesAsyncTaskListener; - } - - @Override - protected Void doInBackground(Void... voids) { - try { - JSONArray jsonArray = new JSONObject(response).getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.IMAGES_KEY); - images = new ArrayList<>(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject image = jsonArray.getJSONObject(i); - String type = image.getString(JSONUtils.TYPE_KEY); - if (type.contains("gif")) { - images.add(new ImgurMedia(image.getString(JSONUtils.ID_KEY), - image.getString(JSONUtils.TITLE_KEY), image.getString(JSONUtils.DESCRIPTION_KEY), - "video/mp4", image.getString(JSONUtils.MP4_KEY))); - } else { - images.add(new ImgurMedia(image.getString(JSONUtils.ID_KEY), - image.getString(JSONUtils.TITLE_KEY), image.getString(JSONUtils.DESCRIPTION_KEY), - type, image.getString(JSONUtils.LINK_KEY))); - } - } - } catch (JSONException e) { - e.printStackTrace(); - parseFailed = true; - } - - return null; - } - - @Override - protected void onPostExecute(Void aVoid) { - super.onPostExecute(aVoid); - if (parseFailed) { - parseImgurImagesAsyncTaskListener.failed(); - } else { - parseImgurImagesAsyncTaskListener.success(images); - } - } - } - - private static class ParseImgurImageAsyncTask extends AsyncTask { - - private final String response; - private ImgurMedia image; - private boolean parseFailed = false; - private final ParseImgurImageAsyncTaskListener parseImgurImageAsyncTaskListener; - - interface ParseImgurImageAsyncTaskListener { - void success(ImgurMedia image); - - void failed(); - } - - ParseImgurImageAsyncTask(String response, ParseImgurImageAsyncTaskListener parseImgurImageAsyncTaskListener) { - this.response = response; - this.parseImgurImageAsyncTaskListener = parseImgurImageAsyncTaskListener; - } - - @Override - protected Void doInBackground(Void... voids) { - try { - JSONObject image = new JSONObject(response).getJSONObject(JSONUtils.DATA_KEY); - String type = image.getString(JSONUtils.TYPE_KEY); - if (type.contains("gif")) { - this.image = new ImgurMedia(image.getString(JSONUtils.ID_KEY), - image.getString(JSONUtils.TITLE_KEY), image.getString(JSONUtils.DESCRIPTION_KEY), - "video/mp4", image.getString(JSONUtils.MP4_KEY)); - } else { - this.image = new ImgurMedia(image.getString(JSONUtils.ID_KEY), - image.getString(JSONUtils.TITLE_KEY), image.getString(JSONUtils.DESCRIPTION_KEY), - type, image.getString(JSONUtils.LINK_KEY)); - } - } catch (JSONException e) { - e.printStackTrace(); - parseFailed = true; - } - - return null; - } - - @Override - protected void onPostExecute(Void aVoid) { - super.onPostExecute(aVoid); - if (parseFailed) { - parseImgurImageAsyncTaskListener.failed(); - } else { - parseImgurImageAsyncTaskListener.success(image); - } + return mImages.size(); } } }