Swipe between gallery images in PostFragment.

This commit is contained in:
Docile-Alligator 2022-11-12 17:53:04 +11:00
parent 0f1c4d1e11
commit 03a2784fb8
29 changed files with 832 additions and 84 deletions

View File

@ -13,6 +13,7 @@ import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.r0adkll.slidr.Slidr; import com.r0adkll.slidr.Slidr;
import com.r0adkll.slidr.model.SlidrInterface;
import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.Subscribe;
@ -53,6 +54,7 @@ public class AccountPostsActivity extends BaseActivity implements SortTypeSelect
SharedPreferences mCurrentAccountSharedPreferences; SharedPreferences mCurrentAccountSharedPreferences;
@Inject @Inject
CustomThemeWrapper mCustomThemeWrapper; CustomThemeWrapper mCustomThemeWrapper;
private SlidrInterface mSlidrInterface;
private String mAccessToken; private String mAccessToken;
private String mAccountName; private String mAccountName;
private String mUserWhere; private String mUserWhere;
@ -74,7 +76,7 @@ public class AccountPostsActivity extends BaseActivity implements SortTypeSelect
applyCustomTheme(); applyCustomTheme();
if (mSharedPreferences.getBoolean(SharedPreferencesUtils.SWIPE_RIGHT_TO_GO_BACK, true)) { if (mSharedPreferences.getBoolean(SharedPreferencesUtils.SWIPE_RIGHT_TO_GO_BACK, true)) {
Slidr.attach(this); mSlidrInterface = Slidr.attach(this);
} }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
@ -239,4 +241,18 @@ public class AccountPostsActivity extends BaseActivity implements SortTypeSelect
((PostFragment) mFragment).goBackToTop(); ((PostFragment) mFragment).goBackToTop();
} }
} }
@Override
public void lockSwipeRightToGoBack() {
if (mSlidrInterface != null) {
mSlidrInterface.lock();
}
}
@Override
public void unlockSwipeRightToGoBack() {
if (mSlidrInterface != null) {
mSlidrInterface.unlock();
}
}
} }

View File

@ -229,12 +229,14 @@ public class AccountSavedThingActivity extends BaseActivity implements ActivityT
} }
} }
@Override
public void lockSwipeRightToGoBack() { public void lockSwipeRightToGoBack() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {
mSlidrInterface.lock(); mSlidrInterface.lock();
} }
} }
@Override
public void unlockSwipeRightToGoBack() { public void unlockSwipeRightToGoBack() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {
mSlidrInterface.unlock(); mSlidrInterface.unlock();

View File

@ -391,4 +391,13 @@ public abstract class BaseActivity extends AppCompatActivity implements CustomFo
this.titleTypeface = titleTypeface; this.titleTypeface = titleTypeface;
this.contentTypeface = contentTypeface; this.contentTypeface = contentTypeface;
} }
public void lockSwipeRightToGoBack() {
}
public void unlockSwipeRightToGoBack() {
}
} }

View File

@ -41,12 +41,11 @@ import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.customviews.LinearLayoutManagerBugFixed; import ml.docilealligator.infinityforreddit.customviews.LinearLayoutManagerBugFixed;
import ml.docilealligator.infinityforreddit.customviews.MarkwonLinearLayoutManager; import ml.docilealligator.infinityforreddit.customviews.SwipeLockInterface;
import ml.docilealligator.infinityforreddit.customviews.SwipeLockScrollView; import ml.docilealligator.infinityforreddit.customviews.SwipeLockLinearLayoutManager;
import ml.docilealligator.infinityforreddit.events.SwitchAccountEvent; import ml.docilealligator.infinityforreddit.events.SwitchAccountEvent;
import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils; import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils;
import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
import ml.docilealligator.infinityforreddit.utils.Utils;
public class FullMarkdownActivity extends BaseActivity { public class FullMarkdownActivity extends BaseActivity {
@ -145,7 +144,7 @@ public class FullMarkdownActivity extends BaseActivity {
miscPlugin, markdownColor, spoilerBackgroundColor, null); miscPlugin, markdownColor, spoilerBackgroundColor, null);
MarkwonAdapter markwonAdapter = MarkdownUtils.createTablesAdapter(); MarkwonAdapter markwonAdapter = MarkdownUtils.createTablesAdapter();
LinearLayoutManagerBugFixed linearLayoutManager = new MarkwonLinearLayoutManager(this, new SwipeLockScrollView.SwipeLockInterface() { LinearLayoutManagerBugFixed linearLayoutManager = new SwipeLockLinearLayoutManager(this, new SwipeLockInterface() {
@Override @Override
public void lockSwipe() { public void lockSwipe() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {

View File

@ -227,12 +227,14 @@ public class HistoryActivity extends BaseActivity implements ActivityToolbarInte
} }
} }
@Override
public void lockSwipeRightToGoBack() { public void lockSwipeRightToGoBack() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {
mSlidrInterface.lock(); mSlidrInterface.lock();
} }
} }
@Override
public void unlockSwipeRightToGoBack() { public void unlockSwipeRightToGoBack() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {
mSlidrInterface.unlock(); mSlidrInterface.unlock();

View File

@ -393,13 +393,15 @@ public class InboxActivity extends BaseActivity implements ActivityToolbarInterf
} }
} }
private void lockSwipeRightToGoBack() { @Override
public void lockSwipeRightToGoBack() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {
mSlidrInterface.lock(); mSlidrInterface.lock();
} }
} }
private void unlockSwipeRightToGoBack() { @Override
public void unlockSwipeRightToGoBack() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {
mSlidrInterface.unlock(); mSlidrInterface.unlock();
} }

View File

@ -913,13 +913,15 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect
} }
} }
private void lockSwipeRightToGoBack() { @Override
public void lockSwipeRightToGoBack() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {
mSlidrInterface.lock(); mSlidrInterface.lock();
} }
} }
private void unlockSwipeRightToGoBack() { @Override
public void unlockSwipeRightToGoBack() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {
mSlidrInterface.unlock(); mSlidrInterface.unlock();
} }

View File

@ -449,13 +449,15 @@ public class SubscribedThingListingActivity extends BaseActivity implements Acti
} }
} }
private void lockSwipeRightToGoBack() { @Override
public void lockSwipeRightToGoBack() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {
mSlidrInterface.lock(); mSlidrInterface.lock();
} }
} }
private void unlockSwipeRightToGoBack() { @Override
public void unlockSwipeRightToGoBack() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {
mSlidrInterface.unlock(); mSlidrInterface.unlock();
} }

View File

@ -916,12 +916,14 @@ public class ViewPostDetailActivity extends BaseActivity implements SortTypeSele
} }
} }
@Override
public void lockSwipeRightToGoBack() { public void lockSwipeRightToGoBack() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {
mSlidrInterface.lock(); mSlidrInterface.lock();
} }
} }
@Override
public void unlockSwipeRightToGoBack() { public void unlockSwipeRightToGoBack() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {
mSlidrInterface.unlock(); mSlidrInterface.unlock();

View File

@ -60,6 +60,7 @@ public class ViewRedditGalleryActivity extends AppCompatActivity implements SetA
public static final String EXTRA_REDDIT_GALLERY = "ERG"; public static final String EXTRA_REDDIT_GALLERY = "ERG";
public static final String EXTRA_SUBREDDIT_NAME = "ESN"; public static final String EXTRA_SUBREDDIT_NAME = "ESN";
public static final String EXTRA_IS_NSFW = "EIN"; public static final String EXTRA_IS_NSFW = "EIN";
public static final String EXTRA_GALLERY_ITEM_INDEX = "EGII";
@BindView(R.id.hauler_view_view_reddit_gallery_activity) @BindView(R.id.hauler_view_view_reddit_gallery_activity)
HaulerView haulerView; HaulerView haulerView;

View File

@ -1547,13 +1547,15 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
InsertReadPost.insertReadPost(mRedditDataRoomDatabase, mExecutor, mAccountName, post.getId()); InsertReadPost.insertReadPost(mRedditDataRoomDatabase, mExecutor, mAccountName, post.getId());
} }
private void lockSwipeRightToGoBack() { @Override
public void lockSwipeRightToGoBack() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {
mSlidrInterface.lock(); mSlidrInterface.lock();
} }
} }
private void unlockSwipeRightToGoBack() { @Override
public void unlockSwipeRightToGoBack() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {
mSlidrInterface.unlock(); mSlidrInterface.unlock();
} }

View File

@ -1748,12 +1748,14 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
} }
} }
@Override
public void lockSwipeRightToGoBack() { public void lockSwipeRightToGoBack() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {
mSlidrInterface.lock(); mSlidrInterface.lock();
} }
} }
@Override
public void unlockSwipeRightToGoBack() { public void unlockSwipeRightToGoBack() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {
mSlidrInterface.unlock(); mSlidrInterface.unlock();

View File

@ -50,8 +50,8 @@ import ml.docilealligator.infinityforreddit.apis.RedditAPI;
import ml.docilealligator.infinityforreddit.bottomsheetfragments.UrlMenuBottomSheetFragment; import ml.docilealligator.infinityforreddit.bottomsheetfragments.UrlMenuBottomSheetFragment;
import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.customviews.LinearLayoutManagerBugFixed; import ml.docilealligator.infinityforreddit.customviews.LinearLayoutManagerBugFixed;
import ml.docilealligator.infinityforreddit.customviews.MarkwonLinearLayoutManager; import ml.docilealligator.infinityforreddit.customviews.SwipeLockInterface;
import ml.docilealligator.infinityforreddit.customviews.SwipeLockScrollView; import ml.docilealligator.infinityforreddit.customviews.SwipeLockLinearLayoutManager;
import ml.docilealligator.infinityforreddit.events.SwitchAccountEvent; import ml.docilealligator.infinityforreddit.events.SwitchAccountEvent;
import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils; import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils;
import ml.docilealligator.infinityforreddit.utils.JSONUtils; import ml.docilealligator.infinityforreddit.utils.JSONUtils;
@ -178,7 +178,7 @@ public class WikiActivity extends BaseActivity {
miscPlugin, markdownColor, spoilerBackgroundColor, onLinkLongClickListener); miscPlugin, markdownColor, spoilerBackgroundColor, onLinkLongClickListener);
markwonAdapter = MarkdownUtils.createTablesAdapter(); markwonAdapter = MarkdownUtils.createTablesAdapter();
LinearLayoutManagerBugFixed linearLayoutManager = new MarkwonLinearLayoutManager(this, new SwipeLockScrollView.SwipeLockInterface() { LinearLayoutManagerBugFixed linearLayoutManager = new SwipeLockLinearLayoutManager(this, new SwipeLockInterface() {
@Override @Override
public void lockSwipe() { public void lockSwipe() {
if (mSlidrInterface != null) { if (mSlidrInterface != null) {

View File

@ -53,9 +53,9 @@ import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.customviews.CommentIndentationView; import ml.docilealligator.infinityforreddit.customviews.CommentIndentationView;
import ml.docilealligator.infinityforreddit.customviews.CustomMarkwonAdapter; import ml.docilealligator.infinityforreddit.customviews.CustomMarkwonAdapter;
import ml.docilealligator.infinityforreddit.customviews.LinearLayoutManagerBugFixed; import ml.docilealligator.infinityforreddit.customviews.LinearLayoutManagerBugFixed;
import ml.docilealligator.infinityforreddit.customviews.MarkwonLinearLayoutManager;
import ml.docilealligator.infinityforreddit.customviews.SpoilerOnClickTextView; import ml.docilealligator.infinityforreddit.customviews.SpoilerOnClickTextView;
import ml.docilealligator.infinityforreddit.customviews.SwipeLockScrollView; import ml.docilealligator.infinityforreddit.customviews.SwipeLockInterface;
import ml.docilealligator.infinityforreddit.customviews.SwipeLockLinearLayoutManager;
import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils; import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils;
import ml.docilealligator.infinityforreddit.utils.APIUtils; import ml.docilealligator.infinityforreddit.utils.APIUtils;
import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
@ -502,7 +502,7 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
}); });
commentMarkdownView.setRecycledViewPool(recycledViewPool); commentMarkdownView.setRecycledViewPool(recycledViewPool);
LinearLayoutManagerBugFixed linearLayoutManager = new MarkwonLinearLayoutManager(mActivity, new SwipeLockScrollView.SwipeLockInterface() { LinearLayoutManagerBugFixed linearLayoutManager = new SwipeLockLinearLayoutManager(mActivity, new SwipeLockInterface() {
@Override @Override
public void lockSwipe() { public void lockSwipe() {
if (mActivity instanceof AccountSavedThingActivity) { if (mActivity instanceof AccountSavedThingActivity) {

View File

@ -62,9 +62,9 @@ import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.customviews.CommentIndentationView; import ml.docilealligator.infinityforreddit.customviews.CommentIndentationView;
import ml.docilealligator.infinityforreddit.customviews.CustomMarkwonAdapter; import ml.docilealligator.infinityforreddit.customviews.CustomMarkwonAdapter;
import ml.docilealligator.infinityforreddit.customviews.LinearLayoutManagerBugFixed; import ml.docilealligator.infinityforreddit.customviews.LinearLayoutManagerBugFixed;
import ml.docilealligator.infinityforreddit.customviews.MarkwonLinearLayoutManager;
import ml.docilealligator.infinityforreddit.customviews.SpoilerOnClickTextView; import ml.docilealligator.infinityforreddit.customviews.SpoilerOnClickTextView;
import ml.docilealligator.infinityforreddit.customviews.SwipeLockScrollView; import ml.docilealligator.infinityforreddit.customviews.SwipeLockInterface;
import ml.docilealligator.infinityforreddit.customviews.SwipeLockLinearLayoutManager;
import ml.docilealligator.infinityforreddit.fragments.ViewPostDetailFragment; import ml.docilealligator.infinityforreddit.fragments.ViewPostDetailFragment;
import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils; import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils;
import ml.docilealligator.infinityforreddit.post.Post; import ml.docilealligator.infinityforreddit.post.Post;
@ -1268,7 +1268,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
} }
commentMarkdownView.setRecycledViewPool(recycledViewPool); commentMarkdownView.setRecycledViewPool(recycledViewPool);
LinearLayoutManagerBugFixed linearLayoutManager = new MarkwonLinearLayoutManager(mActivity, new SwipeLockScrollView.SwipeLockInterface() { LinearLayoutManagerBugFixed linearLayoutManager = new SwipeLockLinearLayoutManager(mActivity, new SwipeLockInterface() {
@Override @Override
public void lockSwipe() { public void lockSwipe() {
((ViewPostDetailActivity) mActivity).lockSwipeRightToGoBack(); ((ViewPostDetailActivity) mActivity).lockSwipeRightToGoBack();

View File

@ -89,8 +89,8 @@ import ml.docilealligator.infinityforreddit.bottomsheetfragments.ShareLinkBottom
import ml.docilealligator.infinityforreddit.bottomsheetfragments.UrlMenuBottomSheetFragment; import ml.docilealligator.infinityforreddit.bottomsheetfragments.UrlMenuBottomSheetFragment;
import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.customviews.AspectRatioGifImageView; import ml.docilealligator.infinityforreddit.customviews.AspectRatioGifImageView;
import ml.docilealligator.infinityforreddit.customviews.MarkwonLinearLayoutManager; import ml.docilealligator.infinityforreddit.customviews.SwipeLockInterface;
import ml.docilealligator.infinityforreddit.customviews.SwipeLockScrollView; import ml.docilealligator.infinityforreddit.customviews.SwipeLockLinearLayoutManager;
import ml.docilealligator.infinityforreddit.fragments.ViewPostDetailFragment; import ml.docilealligator.infinityforreddit.fragments.ViewPostDetailFragment;
import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils; import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils;
import ml.docilealligator.infinityforreddit.post.Post; import ml.docilealligator.infinityforreddit.post.Post;
@ -1191,7 +1191,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
mActivity.startActivity(intent); mActivity.startActivity(intent);
}); });
mContentMarkdownView.setLayoutManager(new MarkwonLinearLayoutManager(mActivity, new SwipeLockScrollView.SwipeLockInterface() { mContentMarkdownView.setLayoutManager(new SwipeLockLinearLayoutManager(mActivity, new SwipeLockInterface() {
@Override @Override
public void lockSwipe() { public void lockSwipe() {
((ViewPostDetailActivity) mActivity).lockSwipeRightToGoBack(); ((ViewPostDetailActivity) mActivity).lockSwipeRightToGoBack();

View File

@ -0,0 +1,155 @@
package ml.docilealligator.infinityforreddit.adapters;
import android.content.res.ColorStateList;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.RequestBuilder;
import com.bumptech.glide.RequestManager;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.Target;
import java.util.ArrayList;
import jp.wasabeef.glide.transformations.BlurTransformation;
import ml.docilealligator.infinityforreddit.SaveMemoryCenterInisdeDownsampleStrategy;
import ml.docilealligator.infinityforreddit.databinding.ItemGalleryImageInPostFeedBinding;
import ml.docilealligator.infinityforreddit.post.Post;
public class PostGalleryTypeImageRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private RequestManager glide;
private Typeface typeface;
private SaveMemoryCenterInisdeDownsampleStrategy saveMemoryCenterInisdeDownsampleStrategy;
private int mColorAccent;
private int mPrimaryTextColor;
private float mScale;
private ArrayList<Post.Gallery> galleryImages;
private boolean blurImage;
private float ratio;
private OnItemClickListener onItemClickListener;
public PostGalleryTypeImageRecyclerViewAdapter(RequestManager glide, Typeface typeface,
SaveMemoryCenterInisdeDownsampleStrategy saveMemoryCenterInisdeDownsampleStrategy,
int mColorAccent, int mPrimaryTextColor, float scale,
OnItemClickListener onItemClickListener) {
this.glide = glide;
this.typeface = typeface;
this.saveMemoryCenterInisdeDownsampleStrategy = saveMemoryCenterInisdeDownsampleStrategy;
this.mColorAccent = mColorAccent;
this.mPrimaryTextColor = mPrimaryTextColor;
this.mScale = scale;
this.onItemClickListener = onItemClickListener;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ImageViewHolder(ItemGalleryImageInPostFeedBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ImageViewHolder) {
if (ratio < 0) {
int height = (int) (400 * mScale);
((ImageViewHolder) holder).binding.imageViewItemGalleryImageInPostFeed.setScaleType(ImageView.ScaleType.CENTER_CROP);
((ImageViewHolder) holder).binding.imageViewItemGalleryImageInPostFeed.getLayoutParams().height = height;
} else {
((ImageViewHolder) holder).binding.imageViewItemGalleryImageInPostFeed.setRatio(ratio);
}
((ImageViewHolder) holder).binding.errorTextViewItemGalleryImageInPostFeed.setVisibility(View.GONE);
((ImageViewHolder) holder).binding.progressBarItemGalleryImageInPostFeed.setVisibility(View.VISIBLE);
loadImage((ImageViewHolder) holder);
}
}
@Override
public int getItemCount() {
return galleryImages == null ? 0 : galleryImages.size();
}
@Override
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
super.onViewRecycled(holder);
}
private void loadImage(ImageViewHolder holder) {
holder.binding.imageViewItemGalleryImageInPostFeed.setRatio(ratio);
RequestBuilder<Drawable> imageRequestBuilder = glide.load(galleryImages.get(holder.getBindingAdapterPosition()).url).listener(new RequestListener<>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
holder.binding.progressBarItemGalleryImageInPostFeed.setVisibility(View.GONE);
holder.binding.errorTextViewItemGalleryImageInPostFeed.setVisibility(View.VISIBLE);
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
holder.binding.errorTextViewItemGalleryImageInPostFeed.setVisibility(View.GONE);
holder.binding.progressBarItemGalleryImageInPostFeed.setVisibility(View.GONE);
return false;
}
});
if (blurImage) {
imageRequestBuilder.apply(RequestOptions.bitmapTransform(new BlurTransformation(50, 10)))
.into(holder.binding.imageViewItemGalleryImageInPostFeed);
} else {
imageRequestBuilder.centerInside().downsample(saveMemoryCenterInisdeDownsampleStrategy).into(holder.binding.imageViewItemGalleryImageInPostFeed);
}
}
public void setGalleryImages(ArrayList<Post.Gallery> galleryImages) {
this.galleryImages = galleryImages;
notifyDataSetChanged();
}
public void setBlurImage(boolean blurImage) {
this.blurImage = blurImage;
}
public void setRatio(float ratio) {
this.ratio = ratio;
}
class ImageViewHolder extends RecyclerView.ViewHolder {
ItemGalleryImageInPostFeedBinding binding;
public ImageViewHolder(ItemGalleryImageInPostFeedBinding binding) {
super(binding.getRoot());
this.binding = binding;
if (typeface != null) {
binding.errorTextViewItemGalleryImageInPostFeed.setTypeface(typeface);
}
binding.progressBarItemGalleryImageInPostFeed.setIndeterminateTintList(ColorStateList.valueOf(mColorAccent));
binding.errorTextViewItemGalleryImageInPostFeed.setTextColor(mPrimaryTextColor);
binding.imageViewItemGalleryImageInPostFeed.setOnClickListener(view -> {
onItemClickListener.onClick(getBindingAdapterPosition());
});
binding.errorTextViewItemGalleryImageInPostFeed.setOnClickListener(view -> {
binding.progressBarItemGalleryImageInPostFeed.setVisibility(View.VISIBLE);
binding.errorTextViewItemGalleryImageInPostFeed.setVisibility(View.GONE);
loadImage(this);
});
}
}
public interface OnItemClickListener {
void onClick(int galleryItemIndex);
}
}

View File

@ -11,7 +11,9 @@ import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.FrameLayout; import android.widget.FrameLayout;
@ -32,6 +34,8 @@ import androidx.core.content.ContextCompat;
import androidx.paging.PagingDataAdapter; import androidx.paging.PagingDataAdapter;
import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearSnapHelper;
import androidx.recyclerview.widget.PagerSnapHelper;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
@ -81,6 +85,9 @@ import ml.docilealligator.infinityforreddit.apis.StreamableAPI;
import ml.docilealligator.infinityforreddit.bottomsheetfragments.ShareLinkBottomSheetFragment; import ml.docilealligator.infinityforreddit.bottomsheetfragments.ShareLinkBottomSheetFragment;
import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.customviews.AspectRatioGifImageView; import ml.docilealligator.infinityforreddit.customviews.AspectRatioGifImageView;
import ml.docilealligator.infinityforreddit.customviews.SwipeLockInterface;
import ml.docilealligator.infinityforreddit.customviews.SwipeLockLinearLayoutManager;
import ml.docilealligator.infinityforreddit.databinding.ItemPostGalleryTypeBinding;
import ml.docilealligator.infinityforreddit.events.PostUpdateEventToPostDetailFragment; import ml.docilealligator.infinityforreddit.events.PostUpdateEventToPostDetailFragment;
import ml.docilealligator.infinityforreddit.fragments.PostFragment; import ml.docilealligator.infinityforreddit.fragments.PostFragment;
import ml.docilealligator.infinityforreddit.post.Post; import ml.docilealligator.infinityforreddit.post.Post;
@ -107,12 +114,13 @@ import retrofit2.Retrofit;
public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerView.ViewHolder> implements CacheManager { public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerView.ViewHolder> implements CacheManager {
private static final int VIEW_TYPE_POST_CARD_VIDEO_AUTOPLAY_TYPE = 1; private static final int VIEW_TYPE_POST_CARD_VIDEO_AUTOPLAY_TYPE = 1;
private static final int VIEW_TYPE_POST_CARD_WITH_PREVIEW_TYPE = 2; private static final int VIEW_TYPE_POST_CARD_WITH_PREVIEW_TYPE = 2;
private static final int VIEW_TYPE_POST_CARD_TEXT_TYPE = 3; private static final int VIEW_TYPE_POST_CARD_GALLERY_TYPE = 3;
private static final int VIEW_TYPE_POST_COMPACT = 4; private static final int VIEW_TYPE_POST_CARD_TEXT_TYPE = 4;
private static final int VIEW_TYPE_POST_GALLERY = 5; private static final int VIEW_TYPE_POST_COMPACT = 5;
private static final int VIEW_TYPE_POST_CARD_2_VIDEO_AUTOPLAY_TYPE = 6; private static final int VIEW_TYPE_POST_GALLERY = 6;
private static final int VIEW_TYPE_POST_CARD_2_WITH_PREVIEW_TYPE = 7; private static final int VIEW_TYPE_POST_CARD_2_VIDEO_AUTOPLAY_TYPE = 7;
private static final int VIEW_TYPE_POST_CARD_2_TEXT_TYPE = 8; private static final int VIEW_TYPE_POST_CARD_2_WITH_PREVIEW_TYPE = 8;
private static final int VIEW_TYPE_POST_CARD_2_TEXT_TYPE = 9;
private static final DiffUtil.ItemCallback<Post> DIFF_CALLBACK = new DiffUtil.ItemCallback<Post>() { private static final DiffUtil.ItemCallback<Post> DIFF_CALLBACK = new DiffUtil.ItemCallback<Post>() {
@Override @Override
@ -217,6 +225,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
private ExoCreator mExoCreator; private ExoCreator mExoCreator;
private Callback mCallback; private Callback mCallback;
private boolean canPlayVideo = true; private boolean canPlayVideo = true;
private RecyclerView.RecycledViewPool mGalleryRecycledViewPool;
public PostRecyclerViewAdapter(BaseActivity activity, PostFragment fragment, Executor executor, Retrofit oauthRetrofit, public PostRecyclerViewAdapter(BaseActivity activity, PostFragment fragment, Executor executor, Retrofit oauthRetrofit,
Retrofit gfycatRetrofit, Retrofit redgifsRetrofit, Retrofit streambleRetrofit, Retrofit gfycatRetrofit, Retrofit redgifsRetrofit, Retrofit streambleRetrofit,
@ -345,6 +354,8 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
mLocale = locale; mLocale = locale;
mExoCreator = exoCreator; mExoCreator = exoCreator;
mCallback = callback; mCallback = callback;
mGalleryRecycledViewPool = new RecyclerView.RecycledViewPool();
} }
} }
@ -368,8 +379,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
return VIEW_TYPE_POST_CARD_WITH_PREVIEW_TYPE; return VIEW_TYPE_POST_CARD_WITH_PREVIEW_TYPE;
case Post.GIF_TYPE: case Post.GIF_TYPE:
case Post.IMAGE_TYPE: case Post.IMAGE_TYPE:
case Post.GALLERY_TYPE:
return VIEW_TYPE_POST_CARD_WITH_PREVIEW_TYPE; return VIEW_TYPE_POST_CARD_WITH_PREVIEW_TYPE;
case Post.GALLERY_TYPE:
return VIEW_TYPE_POST_CARD_GALLERY_TYPE;
case Post.LINK_TYPE: case Post.LINK_TYPE:
case Post.NO_PREVIEW_LINK_TYPE: case Post.NO_PREVIEW_LINK_TYPE:
switch (mDefaultLinkPostLayout) { switch (mDefaultLinkPostLayout) {
@ -448,6 +460,8 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
return new PostVideoAutoplayViewHolder(LayoutInflater.from(parent.getContext()).inflate(mLegacyAutoplayVideoControllerUI ? R.layout.item_post_video_type_autoplay_legacy_controller : R.layout.item_post_video_type_autoplay, parent, false)); return new PostVideoAutoplayViewHolder(LayoutInflater.from(parent.getContext()).inflate(mLegacyAutoplayVideoControllerUI ? R.layout.item_post_video_type_autoplay_legacy_controller : R.layout.item_post_video_type_autoplay, parent, false));
} else if (viewType == VIEW_TYPE_POST_CARD_WITH_PREVIEW_TYPE) { } else if (viewType == VIEW_TYPE_POST_CARD_WITH_PREVIEW_TYPE) {
return new PostWithPreviewTypeViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post_with_preview, parent, false)); return new PostWithPreviewTypeViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post_with_preview, parent, false));
} else if (viewType == VIEW_TYPE_POST_CARD_GALLERY_TYPE) {
return new PostGalleryTypeViewHolder(ItemPostGalleryTypeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
} else if (viewType == VIEW_TYPE_POST_CARD_TEXT_TYPE) { } else if (viewType == VIEW_TYPE_POST_CARD_TEXT_TYPE) {
return new PostTextTypeViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post_text, parent, false)); return new PostTextTypeViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post_text, parent, false));
} else if (viewType == VIEW_TYPE_POST_COMPACT) { } else if (viewType == VIEW_TYPE_POST_COMPACT) {
@ -781,10 +795,6 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
((PostWithPreviewTypeViewHolder) holder).noPreviewLinkImageView.setVisibility(View.VISIBLE); ((PostWithPreviewTypeViewHolder) holder).noPreviewLinkImageView.setVisibility(View.VISIBLE);
((PostWithPreviewTypeViewHolder) holder).noPreviewLinkImageView.setImageResource(R.drawable.ic_link); ((PostWithPreviewTypeViewHolder) holder).noPreviewLinkImageView.setImageResource(R.drawable.ic_link);
} }
} else if (post.getPostType() == Post.GALLERY_TYPE) {
((PostWithPreviewTypeViewHolder) holder).typeTextView.setText(mActivity.getString(R.string.gallery));
((PostWithPreviewTypeViewHolder) holder).videoOrGifIndicatorImageView.setVisibility(View.VISIBLE);
((PostWithPreviewTypeViewHolder) holder).videoOrGifIndicatorImageView.setImageDrawable(ContextCompat.getDrawable(mActivity, R.drawable.ic_gallery_24dp));
} }
if (post.getPostType() != Post.NO_PREVIEW_LINK_TYPE) { if (post.getPostType() != Post.NO_PREVIEW_LINK_TYPE) {
@ -801,8 +811,6 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
((PostWithPreviewTypeViewHolder) holder).videoOrGifIndicatorImageView.setVisibility(View.GONE); ((PostWithPreviewTypeViewHolder) holder).videoOrGifIndicatorImageView.setVisibility(View.GONE);
} else if (post.getPostType() == Post.LINK_TYPE) { } else if (post.getPostType() == Post.LINK_TYPE) {
((PostWithPreviewTypeViewHolder) holder).noPreviewLinkImageView.setImageResource(R.drawable.ic_link); ((PostWithPreviewTypeViewHolder) holder).noPreviewLinkImageView.setImageResource(R.drawable.ic_link);
} else if (post.getPostType() == Post.GALLERY_TYPE) {
((PostWithPreviewTypeViewHolder) holder).noPreviewLinkImageView.setImageResource(R.drawable.ic_gallery_24dp);
} }
} else if (mDataSavingMode && mOnlyDisablePreviewInVideoAndGifPosts && (post.getPostType() == Post.VIDEO_TYPE || post.getPostType() == Post.GIF_TYPE)) { } else if (mDataSavingMode && mOnlyDisablePreviewInVideoAndGifPosts && (post.getPostType() == Post.VIDEO_TYPE || post.getPostType() == Post.GIF_TYPE)) {
((PostWithPreviewTypeViewHolder) holder).noPreviewLinkImageView.setVisibility(View.VISIBLE); ((PostWithPreviewTypeViewHolder) holder).noPreviewLinkImageView.setVisibility(View.VISIBLE);
@ -850,6 +858,26 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
} }
} }
} }
} else if (holder instanceof PostGalleryTypeViewHolder) {
if (mDataSavingMode && mDisableImagePreview) {
((PostGalleryTypeViewHolder) holder).binding.noPreviewImageViewItemPostGalleryType.setVisibility(View.VISIBLE);
((PostGalleryTypeViewHolder) holder).binding.noPreviewImageViewItemPostGalleryType.setImageResource(R.drawable.ic_gallery_24dp);
} else {
((PostGalleryTypeViewHolder) holder).binding.galleryRecyclerViewItemPostGalleryType.setVisibility(View.VISIBLE);
Post.Preview preview = getSuitablePreview(post.getPreviews());
if (preview != null) {
if (mFixedHeightPreviewInCard || (preview.getPreviewWidth() <= 0 || preview.getPreviewHeight() <= 0)) {
((PostGalleryTypeViewHolder) holder).adapter.setRatio(-1);
} else {
((PostGalleryTypeViewHolder) holder).adapter.setRatio((float) preview.getPreviewHeight() / preview.getPreviewWidth());
}
} else {
((PostGalleryTypeViewHolder) holder).adapter.setRatio(-1);
}
((PostGalleryTypeViewHolder) holder).adapter.setGalleryImages(post.getGallery());
((PostGalleryTypeViewHolder) holder).adapter.setBlurImage(
(post.isNSFW() && mNeedBlurNsfw && !(mDoNotBlurNsfwInNsfwSubreddits && mFragment != null && mFragment.getIsNsfwSubreddit())) || (post.isSpoiler() && mNeedBlurSpoiler));
}
} else if (holder instanceof PostTextTypeViewHolder) { } else if (holder instanceof PostTextTypeViewHolder) {
if (!mHideTextPostContent && !post.isSpoiler() && post.getSelfTextPlainTrimmed() != null && !post.getSelfTextPlainTrimmed().equals("")) { if (!mHideTextPostContent && !post.isSpoiler() && post.getSelfTextPlainTrimmed() != null && !post.getSelfTextPlainTrimmed().equals("")) {
((PostTextTypeViewHolder) holder).contentTextView.setVisibility(View.VISIBLE); ((PostTextTypeViewHolder) holder).contentTextView.setVisibility(View.VISIBLE);
@ -1861,6 +1889,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
((PostWithPreviewTypeViewHolder) holder).progressBar.setVisibility(View.GONE); ((PostWithPreviewTypeViewHolder) holder).progressBar.setVisibility(View.GONE);
((PostWithPreviewTypeViewHolder) holder).videoOrGifIndicatorImageView.setVisibility(View.GONE); ((PostWithPreviewTypeViewHolder) holder).videoOrGifIndicatorImageView.setVisibility(View.GONE);
((PostWithPreviewTypeViewHolder) holder).linkTextView.setVisibility(View.GONE); ((PostWithPreviewTypeViewHolder) holder).linkTextView.setVisibility(View.GONE);
} else if (holder instanceof PostGalleryTypeViewHolder) {
((PostGalleryTypeViewHolder) holder).binding.galleryRecyclerViewItemPostGalleryType.setVisibility(View.GONE);
((PostGalleryTypeViewHolder) holder).binding.noPreviewImageViewItemPostGalleryType.setVisibility(View.GONE);
} else if (holder instanceof PostTextTypeViewHolder) { } else if (holder instanceof PostTextTypeViewHolder) {
((PostTextTypeViewHolder) holder).contentTextView.setText(""); ((PostTextTypeViewHolder) holder).contentTextView.setText("");
((PostTextTypeViewHolder) holder).contentTextView.setTextColor(mPostContentColor); ((PostTextTypeViewHolder) holder).contentTextView.setTextColor(mPostContentColor);
@ -2032,6 +2063,10 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
} }
private void openMedia(Post post) { private void openMedia(Post post) {
openMedia(post, 0);
}
private void openMedia(Post post, int galleryItemIndex) {
if (canStartActivity) { if (canStartActivity) {
canStartActivity = false; canStartActivity = false;
if (post.getPostType() == Post.VIDEO_TYPE) { if (post.getPostType() == Post.VIDEO_TYPE) {
@ -2086,6 +2121,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
intent.putParcelableArrayListExtra(ViewRedditGalleryActivity.EXTRA_REDDIT_GALLERY, post.getGallery()); intent.putParcelableArrayListExtra(ViewRedditGalleryActivity.EXTRA_REDDIT_GALLERY, post.getGallery());
intent.putExtra(ViewRedditGalleryActivity.EXTRA_SUBREDDIT_NAME, post.getSubredditName()); intent.putExtra(ViewRedditGalleryActivity.EXTRA_SUBREDDIT_NAME, post.getSubredditName());
intent.putExtra(ViewRedditGalleryActivity.EXTRA_IS_NSFW, post.isNSFW()); intent.putExtra(ViewRedditGalleryActivity.EXTRA_IS_NSFW, post.isNSFW());
intent.putExtra(ViewRedditGalleryActivity.EXTRA_GALLERY_ITEM_INDEX, galleryItemIndex);
mActivity.startActivity(intent); mActivity.startActivity(intent);
} }
} }
@ -3067,6 +3103,100 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
} }
} }
public class PostGalleryTypeViewHolder extends PostBaseViewHolder {
ItemPostGalleryTypeBinding binding;
PostGalleryTypeImageRecyclerViewAdapter adapter;
private boolean swipeLocked;
PostGalleryTypeViewHolder(ItemPostGalleryTypeBinding binding) {
super(binding.getRoot());
this.binding = binding;
setBaseView(
binding.iconGifImageViewItemPostGalleryType,
binding.subredditNameTextViewItemPostGalleryType,
binding.userTextViewItemPostGalleryType,
binding.stickiedPostImageViewItemPostGalleryType,
binding.postTimeTextViewItemPostGalleryType,
binding.titleTextViewItemPostGalleryType,
binding.typeTextViewItemPostGalleryType,
binding.archivedImageViewItemPostGalleryType,
binding.lockedImageViewItemPostGalleryType,
binding.crosspostImageViewItemPostGalleryType,
binding.nsfwTextViewItemPostGalleryType,
binding.spoilerTextViewItemPostGalleryType,
binding.flairTextViewItemPostGalleryType,
binding.awardsTextViewItemPostGalleryType,
binding.bottomConstraintLayoutItemPostGalleryType,
binding.upvoteButtonItemPostGalleryType,
binding.scoreTextViewItemPostGalleryType,
binding.downvoteButtonItemPostGalleryType,
binding.commentsCountTextViewItemPostGalleryType,
binding.saveButtonItemPostGalleryType,
binding.shareButtonItemPostGalleryType);
adapter = new PostGalleryTypeImageRecyclerViewAdapter(mGlide, mActivity.typeface,
mSaveMemoryCenterInsideDownsampleStrategy, mColorAccent, mPrimaryTextColor, mScale,
galleryItemIndex -> {
int position = getBindingAdapterPosition();
if (position < 0) {
return;
}
if (post != null) {
markPostRead(post, true);
openMedia(post, galleryItemIndex);
}
});
binding.galleryRecyclerViewItemPostGalleryType.setAdapter(adapter);
new PagerSnapHelper().attachToRecyclerView(binding.galleryRecyclerViewItemPostGalleryType);
binding.galleryRecyclerViewItemPostGalleryType.setRecycledViewPool(mGalleryRecycledViewPool);
binding.galleryRecyclerViewItemPostGalleryType.setLayoutManager(new SwipeLockLinearLayoutManager(
mActivity, RecyclerView.HORIZONTAL, false, new SwipeLockInterface() {
@Override
public void lockSwipe() {
mActivity.lockSwipeRightToGoBack();
swipeLocked = true;
}
@Override
public void unlockSwipe() {
mActivity.unlockSwipeRightToGoBack();
swipeLocked = false;
}
@Override
public void setSwipeLocked(boolean swipeLocked) {
PostGalleryTypeViewHolder.this.swipeLocked = swipeLocked;
}
}));
binding.getRoot().setOnTouchListener((view, motionEvent) -> {
swipeLocked = false;
return false;
});
binding.bottomConstraintLayoutItemPostGalleryType.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
swipeLocked = false;
return false;
}
});
binding.noPreviewImageViewItemPostGalleryType.setOnClickListener(view -> {
int position = getBindingAdapterPosition();
if (position < 0) {
return;
}
if (post != null) {
markPostRead(post, true);
openMedia(post, 0);
}
});
}
public boolean isSwipeLocked() {
return swipeLocked;
}
}
class PostTextTypeViewHolder extends PostBaseViewHolder { class PostTextTypeViewHolder extends PostBaseViewHolder {
@BindView(R.id.icon_gif_image_view_item_post_text_type) @BindView(R.id.icon_gif_image_view_item_post_text_type)
AspectRatioGifImageView iconGifImageView; AspectRatioGifImageView iconGifImageView;

View File

@ -31,11 +31,9 @@ import ml.docilealligator.infinityforreddit.activities.BaseActivity;
import ml.docilealligator.infinityforreddit.activities.LinkResolverActivity; import ml.docilealligator.infinityforreddit.activities.LinkResolverActivity;
import ml.docilealligator.infinityforreddit.bottomsheetfragments.UrlMenuBottomSheetFragment; import ml.docilealligator.infinityforreddit.bottomsheetfragments.UrlMenuBottomSheetFragment;
import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.customviews.LinearLayoutManagerBugFixed; import ml.docilealligator.infinityforreddit.customviews.SwipeLockInterface;
import ml.docilealligator.infinityforreddit.customviews.MarkwonLinearLayoutManager; import ml.docilealligator.infinityforreddit.customviews.SwipeLockLinearLayoutManager;
import ml.docilealligator.infinityforreddit.customviews.SwipeLockScrollView;
import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils; import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils;
import ml.docilealligator.infinityforreddit.utils.Utils;
public class RulesRecyclerViewAdapter extends RecyclerView.Adapter<RulesRecyclerViewAdapter.RuleViewHolder> { public class RulesRecyclerViewAdapter extends RecyclerView.Adapter<RulesRecyclerViewAdapter.RuleViewHolder> {
private BaseActivity activity; private BaseActivity activity;
@ -140,8 +138,8 @@ public class RulesRecyclerViewAdapter extends RecyclerView.Adapter<RulesRecycler
shortNameTextView.setTypeface(activity.typeface); shortNameTextView.setTypeface(activity.typeface);
} }
markwonAdapter = MarkdownUtils.createTablesAdapter(); markwonAdapter = MarkdownUtils.createTablesAdapter();
LinearLayoutManagerBugFixed linearLayoutManager = new MarkwonLinearLayoutManager(activity, SwipeLockLinearLayoutManager swipeLockLinearLayoutManager = new SwipeLockLinearLayoutManager(activity,
new SwipeLockScrollView.SwipeLockInterface() { new SwipeLockInterface() {
@Override @Override
public void lockSwipe() { public void lockSwipe() {
if (slidrInterface != null) { if (slidrInterface != null) {
@ -156,7 +154,7 @@ public class RulesRecyclerViewAdapter extends RecyclerView.Adapter<RulesRecycler
} }
} }
}); });
descriptionMarkwonView.setLayoutManager(linearLayoutManager); descriptionMarkwonView.setLayoutManager(swipeLockLinearLayoutManager);
descriptionMarkwonView.setAdapter(markwonAdapter); descriptionMarkwonView.setAdapter(markwonAdapter);
} }
} }

View File

@ -1,26 +0,0 @@
package ml.docilealligator.infinityforreddit.customviews;
import android.content.Context;
import android.view.View;
import androidx.annotation.Nullable;
public class MarkwonLinearLayoutManager extends LinearLayoutManagerBugFixed {
@Nullable
private final SwipeLockScrollView.SwipeLockInterface swipeLockInterface;
public MarkwonLinearLayoutManager(Context context,
@Nullable SwipeLockScrollView.SwipeLockInterface swipeLockInterface) {
super(context);
this.swipeLockInterface = swipeLockInterface;
}
@Override
public void addView(View child) {
super.addView(child);
if (child instanceof SwipeLockScrollView) {
((SwipeLockScrollView) child).setSwipeLockInterface(swipeLockInterface);
}
}
}

View File

@ -0,0 +1,76 @@
package ml.docilealligator.infinityforreddit.customviews;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class SwipeLockFrameLayout extends FrameLayout implements SwipeLockView {
@Nullable
private SwipeLockInterface swipeLockInterface = null;
private boolean locked = false;
public SwipeLockFrameLayout(@NonNull Context context) {
super(context);
}
public SwipeLockFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public SwipeLockFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public SwipeLockFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public void setSwipeLockInterface(@Nullable SwipeLockInterface swipeLockInterface) {
this.swipeLockInterface = swipeLockInterface;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
updateSwipeLock(ev);
return true;
}
@SuppressLint("ClickableViewAccessibility") // we are just listening to touch events
@Override
public boolean onTouchEvent(MotionEvent ev) {
updateSwipeLock(ev);
return super.onTouchEvent(ev);
}
/**
* Unlocks swipe if the view cannot be scrolled right anymore or if {@code ev} is
* {@link MotionEvent#ACTION_UP} or {@link MotionEvent#ACTION_CANCEL}
*/
private void updateSwipeLock(MotionEvent ev) {
if (swipeLockInterface != null) {
int action = ev.getAction();
if (action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_CANCEL) {
// calling SlidrInterface#unlock aborts the swipe
// so don't call unlock if it is already unlocked
if (locked) {
swipeLockInterface.unlockSwipe();
locked = false;
}
} else {
if (!locked) {
swipeLockInterface.lockSwipe();
locked = true;
}
}
swipeLockInterface.setSwipeLocked(locked);
}
}
}

View File

@ -0,0 +1,7 @@
package ml.docilealligator.infinityforreddit.customviews;
public interface SwipeLockInterface {
void lockSwipe();
void unlockSwipe();
default void setSwipeLocked(boolean swipeLocked) {}
}

View File

@ -0,0 +1,31 @@
package ml.docilealligator.infinityforreddit.customviews;
import android.content.Context;
import android.view.View;
import androidx.annotation.Nullable;
public class SwipeLockLinearLayoutManager extends LinearLayoutManagerBugFixed {
@Nullable
private final SwipeLockInterface swipeLockInterface;
public SwipeLockLinearLayoutManager(Context context,
@Nullable SwipeLockInterface swipeLockInterface) {
super(context);
this.swipeLockInterface = swipeLockInterface;
}
public SwipeLockLinearLayoutManager(Context context, int orientation, boolean reverseLayout, @Nullable SwipeLockInterface swipeLockInterface) {
super(context, orientation, reverseLayout);
this.swipeLockInterface = swipeLockInterface;
}
@Override
public void addView(View child) {
super.addView(child);
if (child instanceof SwipeLockView) {
((SwipeLockView) child).setSwipeLockInterface(swipeLockInterface);
}
}
}

View File

@ -12,7 +12,7 @@ import androidx.annotation.Nullable;
* if it can be scrolled to the right. {@link SwipeLockInterface} must be set for * if it can be scrolled to the right. {@link SwipeLockInterface} must be set for
* locking to work. * locking to work.
*/ */
public class SwipeLockScrollView extends HorizontalScrollView { public class SwipeLockScrollView extends HorizontalScrollView implements SwipeLockView {
@Nullable @Nullable
private SwipeLockInterface swipeLockInterface = null; private SwipeLockInterface swipeLockInterface = null;
private boolean locked = false; private boolean locked = false;
@ -29,6 +29,7 @@ public class SwipeLockScrollView extends HorizontalScrollView {
super(context, attrs, defStyleAttr); super(context, attrs, defStyleAttr);
} }
@Override
public void setSwipeLockInterface(@Nullable SwipeLockInterface swipeLockInterface) { public void setSwipeLockInterface(@Nullable SwipeLockInterface swipeLockInterface) {
this.swipeLockInterface = swipeLockInterface; this.swipeLockInterface = swipeLockInterface;
} }
@ -54,8 +55,7 @@ public class SwipeLockScrollView extends HorizontalScrollView {
if (swipeLockInterface != null) { if (swipeLockInterface != null) {
int action = ev.getAction(); int action = ev.getAction();
if (action == MotionEvent.ACTION_UP || if (action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_CANCEL) {
getScrollX() == 0) {
// calling SlidrInterface#unlock aborts the swipe // calling SlidrInterface#unlock aborts the swipe
// so don't call unlock if it is already unlocked // so don't call unlock if it is already unlocked
if (locked) { if (locked) {
@ -70,9 +70,4 @@ public class SwipeLockScrollView extends HorizontalScrollView {
} }
} }
} }
public interface SwipeLockInterface {
void lockSwipe();
void unlockSwipe();
}
} }

View File

@ -0,0 +1,7 @@
package ml.docilealligator.infinityforreddit.customviews;
import androidx.annotation.Nullable;
public interface SwipeLockView {
void setSwipeLockInterface(@Nullable SwipeLockInterface swipeLockInterface);
}

View File

@ -1057,6 +1057,11 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
if (!(viewHolder instanceof PostRecyclerViewAdapter.PostBaseViewHolder) && if (!(viewHolder instanceof PostRecyclerViewAdapter.PostBaseViewHolder) &&
!(viewHolder instanceof PostRecyclerViewAdapter.PostCompactBaseViewHolder)) { !(viewHolder instanceof PostRecyclerViewAdapter.PostCompactBaseViewHolder)) {
return makeMovementFlags(0, 0); return makeMovementFlags(0, 0);
} else if (viewHolder instanceof PostRecyclerViewAdapter.PostGalleryTypeViewHolder) {
if (((PostRecyclerViewAdapter.PostGalleryTypeViewHolder) viewHolder).isSwipeLocked()) {
return makeMovementFlags(0, 0);
}
} }
int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
return makeMovementFlags(0, swipeFlags); return makeMovementFlags(0, swipeFlags);
@ -1139,13 +1144,11 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
exceedThreshold = false; exceedThreshold = false;
} }
} }
} }
@Override @Override
public float getSwipeThreshold(@NonNull RecyclerView.ViewHolder viewHolder) { public float getSwipeThreshold(@NonNull RecyclerView.ViewHolder viewHolder) {
return 100; return 1;
} }
}); });

View File

@ -3,7 +3,6 @@ package ml.docilealligator.infinityforreddit.settings;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import androidx.preference.Preference;
import androidx.preference.SeekBarPreference; import androidx.preference.SeekBarPreference;
import javax.inject.Inject; import javax.inject.Inject;
@ -31,7 +30,7 @@ public class CommentPreferenceFragment extends CustomFontPreferenceFragmentCompa
if (showFewerToolbarOptionsThresholdSeekBarPreference != null) { if (showFewerToolbarOptionsThresholdSeekBarPreference != null) {
showFewerToolbarOptionsThresholdSeekBarPreference.setSummary(getString(R.string.settings_show_fewer_toolbar_options_threshold_summary, sharedPreferences.getInt(SharedPreferencesUtils.SHOW_FEWER_TOOLBAR_OPTIONS_THRESHOLD, 5))); showFewerToolbarOptionsThresholdSeekBarPreference.setSummary(getString(R.string.settings_show_fewer_toolbar_options_threshold_summary, sharedPreferences.getInt(SharedPreferencesUtils.SHOW_FEWER_TOOLBAR_OPTIONS_THRESHOLD, 5)));
showFewerToolbarOptionsThresholdSeekBarPreference.setOnPreferenceChangeListener((Preference.OnPreferenceChangeListener) (preference, newValue) -> { showFewerToolbarOptionsThresholdSeekBarPreference.setOnPreferenceChangeListener((preference, newValue) -> {
showFewerToolbarOptionsThresholdSeekBarPreference.setSummary( showFewerToolbarOptionsThresholdSeekBarPreference.setSummary(
getString(R.string.settings_show_fewer_toolbar_options_threshold_summary, (Integer) newValue)); getString(R.string.settings_show_fewer_toolbar_options_threshold_summary, (Integer) newValue));
return true; return true;

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<ml.docilealligator.infinityforreddit.customviews.SwipeLockFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ml.docilealligator.infinityforreddit.customviews.AspectRatioGifImageView
android:id="@+id/image_view_item_gallery_image_in_post_feed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true" />
<ProgressBar
android:id="@+id/progress_bar_item_gallery_image_in_post_feed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
<TextView
android:id="@+id/error_text_view_item_gallery_image_in_post_feed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_error_outline_black_24dp"
android:layout_gravity="center"
android:gravity="center"
android:text="@string/error_loading_image_tap_to_retry"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"
android:visibility="gone" />
</ml.docilealligator.infinityforreddit.customviews.SwipeLockFrameLayout>

View File

@ -0,0 +1,302 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:cardElevation="2dp"
app:cardCornerRadius="16dp"
style="?attr/materialCardViewElevatedStyle">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp">
<ml.docilealligator.infinityforreddit.customviews.AspectRatioGifImageView
android:id="@+id/icon_gif_image_view_item_post_gallery_type"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<TextView
android:id="@+id/subreddit_name_text_view_item_post_gallery_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginStart="16dp"
android:layout_marginEnd="8dp"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"
app:layout_constraintBottom_toTopOf="@id/user_text_view_item_post_gallery_type"
app:layout_constraintStart_toEndOf="@id/icon_gif_image_view_item_post_gallery_type"
app:layout_constraintEnd_toStartOf="@id/stickied_post_image_view_item_post_gallery_type"
app:layout_constraintTop_toTopOf="parent"
app:layout_constrainedWidth="true"
app:layout_constraintHorizontal_bias="0"/>
<TextView
android:id="@+id/user_text_view_item_post_gallery_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="8dp"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/icon_gif_image_view_item_post_gallery_type"
app:layout_constraintEnd_toStartOf="@id/stickied_post_image_view_item_post_gallery_type"
app:layout_constraintTop_toBottomOf="@+id/subreddit_name_text_view_item_post_gallery_type"
app:layout_constraintHorizontal_bias="0"
app:layout_constrainedWidth="true" />
<ImageView
android:id="@+id/stickied_post_image_view_item_post_gallery_type"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="8dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline2"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible" />
<TextView
android:id="@+id/post_time_text_view_item_post_gallery_type"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="end"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/guideline2"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.6" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/title_text_view_item_post_gallery_type"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:textSize="?attr/title_font_18"
android:fontFamily="?attr/title_font_family" />
<com.nex3z.flowlayout.FlowLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
app:flChildSpacing="16dp"
app:flChildSpacingForLastRow="align"
app:flRowSpacing="8dp">
<com.libRG.CustomTextView
android:id="@+id/type_text_view_item_post_gallery_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="4dp"
android:text="@string/gallery"
android:textSize="?attr/font_12"
android:fontFamily="?attr/font_family"
app:lib_setRadius="6dp"
app:lib_setRoundedView="true"
app:lib_setShape="rectangle" />
<com.libRG.CustomTextView
android:id="@+id/spoiler_text_view_item_post_gallery_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/spoiler"
android:textSize="?attr/font_12"
android:fontFamily="?attr/font_family"
android:padding="4dp"
android:visibility="gone"
app:lib_setRadius="6dp"
app:lib_setRoundedView="true"
app:lib_setShape="rectangle" />
<com.libRG.CustomTextView
android:id="@+id/nsfw_text_view_item_post_gallery_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="4dp"
android:text="@string/nsfw"
android:textSize="?attr/font_12"
android:fontFamily="?attr/font_family"
android:visibility="gone"
app:lib_setRadius="6dp"
app:lib_setRoundedView="true"
app:lib_setShape="rectangle" />
<com.libRG.CustomTextView
android:id="@+id/flair_text_view_item_post_gallery_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="?attr/font_12"
android:fontFamily="?attr/font_family"
android:padding="4dp"
android:visibility="gone"
app:lib_setRadius="6dp"
app:lib_setRoundedView="true"
app:lib_setShape="rectangle" />
<com.libRG.CustomTextView
android:id="@+id/awards_text_view_item_post_gallery_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="4dp"
android:textSize="?attr/font_12"
android:fontFamily="?attr/font_family"
android:visibility="gone"
app:lib_setRadius="6dp"
app:lib_setRoundedView="true"
app:lib_setShape="rectangle" />
<ImageView
android:id="@+id/archived_image_view_item_post_gallery_type"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/ic_archive_outline"
android:visibility="gone" />
<ImageView
android:id="@+id/locked_image_view_item_post_gallery_type"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/ic_outline_lock_24dp"
android:visibility="gone" />
<ImageView
android:id="@+id/crosspost_image_view_item_post_gallery_type"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/crosspost"
android:visibility="gone" />
</com.nex3z.flowlayout.FlowLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/gallery_recycler_view_item_post_gallery_type"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" />
<ImageView
android:id="@+id/no_preview_image_view_item_post_gallery_type"
android:layout_width="match_parent"
android:layout_height="150dp"
android:src="@drawable/ic_gallery_24dp"
android:scaleType="center"
android:visibility="gone" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/bottom_constraint_layout_item_post_gallery_type"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/upvote_button_item_post_gallery_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="12dp"
android:src="@drawable/ic_arrow_upward_grey_24dp"
android:background="?actionBarItemBackground"
android:clickable="true"
android:focusable="true"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/score_text_view_item_post_gallery_type"
android:layout_width="64dp"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="?attr/font_12"
android:textStyle="bold"
android:fontFamily="?attr/font_family"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/upvote_button_item_post_gallery_type" />
<ImageView
android:id="@+id/downvote_button_item_post_gallery_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="12dp"
android:src="@drawable/ic_arrow_downward_grey_24dp"
android:background="?actionBarItemBackground"
android:clickable="true"
android:focusable="true"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/score_text_view_item_post_gallery_type" />
<TextView
android:id="@+id/comments_count_text_view_item_post_gallery_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="12dp"
android:gravity="center_vertical"
android:textSize="?attr/font_12"
android:textStyle="bold"
android:fontFamily="?attr/font_family"
android:drawableStart="@drawable/ic_comment_grey_24dp"
android:drawablePadding="12dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/downvote_button_item_post_gallery_type" />
<ImageView
android:id="@+id/save_button_item_post_gallery_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="12dp"
android:background="?actionBarItemBackground"
android:clickable="true"
android:focusable="true"
app:layout_constraintHorizontal_bias="1"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/comments_count_text_view_item_post_gallery_type"
app:layout_constraintEnd_toStartOf="@id/share_button_item_post_gallery_type" />
<ImageView
android:id="@+id/share_button_item_post_gallery_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="12dp"
android:src="@drawable/ic_share_grey_24dp"
android:background="?actionBarItemBackground"
android:clickable="true"
android:focusable="true"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>