package me.ccrama.redditslide.Adapters; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.support.v7.widget.RecyclerView; import android.text.Html; import android.view.HapticFeedbackConstants; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.Toast; import com.cocosw.bottomsheet.BottomSheet; import net.dean.jraw.models.Submission; import net.dean.jraw.models.Thumbnails; import java.util.ArrayList; import me.ccrama.redditslide.Activities.Album; import me.ccrama.redditslide.Activities.AlbumPager; import me.ccrama.redditslide.Activities.CommentsScreen; import me.ccrama.redditslide.Activities.FullscreenVideo; import me.ccrama.redditslide.Activities.Gallery; import me.ccrama.redditslide.Activities.MediaView; import me.ccrama.redditslide.Activities.Tumblr; import me.ccrama.redditslide.Activities.TumblrPager; import me.ccrama.redditslide.ContentType; import me.ccrama.redditslide.PostMatch; import me.ccrama.redditslide.R; import me.ccrama.redditslide.Reddit; import me.ccrama.redditslide.SettingValues; import me.ccrama.redditslide.SubmissionViews.PopulateSubmissionViewHolder; import me.ccrama.redditslide.Visuals.Palette; import me.ccrama.redditslide.util.LinkUtil; public class GalleryView extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private final Gallery main; public boolean paddingBottom; public ArrayList<Submission> posts; public String subreddit; public GalleryView(final Gallery context, ArrayList<Submission> displayer, String subreddit) { main = context; this.posts = displayer; this.subreddit = subreddit; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.gallery_image, parent, false); return new AlbumViewHolder(v); } public double getHeightFromAspectRatio(int imageHeight, int imageWidth, int viewWidth) { double ratio = (double) imageHeight / (double) imageWidth; return (viewWidth * ratio); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder2, final int i) { if (holder2 instanceof AlbumViewHolder) { final AlbumViewHolder holder = (AlbumViewHolder) holder2; final Submission submission = posts.get(i); if (submission.getThumbnails() != null && submission.getThumbnails().getSource() != null) { ((Reddit) main.getApplicationContext()).getImageLoader().displayImage(submission.getThumbnails().getSource().getUrl(), holder.image, ImageGridAdapter.options); } else { ((Reddit) main.getApplicationContext()).getImageLoader().displayImage(submission.getUrl(), holder.image, ImageGridAdapter.options); } double h = 0; int height = 0; if (submission.getThumbnails() != null) { Thumbnails.Image source = submission.getThumbnails().getSource(); if (source != null) { h = getHeightFromAspectRatio(source.getHeight(), source.getWidth(), holder.image.getWidth()); height = source.getHeight(); } } holder.type.setVisibility(View.VISIBLE); switch (ContentType.getContentType(submission)) { case ALBUM: holder.type.setImageResource(R.drawable.album); break; case EXTERNAL: case LINK: case REDDIT: holder.type.setImageResource(R.drawable.world); break; case SELF: holder.type.setImageResource(R.drawable.fontsizedarker); break; case EMBEDDED: case GIF: case STREAMABLE: case VIDEO: case VID_ME: holder.type.setImageResource(R.drawable.play); break; default: holder.type.setVisibility(View.GONE); break; } if (h != 0) { if (h > 3200) { holder.image.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 3200)); } else { holder.image.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, (int) h)); } } else { if (height > 3200) { holder.image.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 3200)); } else { holder.image.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT)); } } holder.comments.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { v.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); Intent i2 = new Intent(main, CommentsScreen.class); i2.putExtra(CommentsScreen.EXTRA_PAGE, main.subredditPosts.getPosts().indexOf(submission)); i2.putExtra(CommentsScreen.EXTRA_SUBREDDIT, subreddit); i2.putExtra("fullname", submission.getFullName()); main.startActivity(i2); } }); holder.image.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if (main != null) { BottomSheet.Builder b = new BottomSheet.Builder(main) .title(submission.getUrl()) .grid(); int[] attrs = new int[]{R.attr.tint}; TypedArray ta = main.obtainStyledAttributes(attrs); int color = ta.getColor(0, Color.WHITE); Drawable open = main.getResources().getDrawable(R.drawable.ic_open_in_browser); open.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); Drawable share = main.getResources().getDrawable(R.drawable.ic_share); share.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); Drawable copy = main.getResources().getDrawable(R.drawable.ic_content_copy); copy.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); ta.recycle(); b.sheet(R.id.open_link, open, main.getResources().getString(R.string.submission_link_extern)); b.sheet(R.id.share_link, share, main.getResources().getString(R.string.share_link)); b.sheet(R.id.copy_link, copy, main.getResources().getString(R.string.submission_link_copy)); b.listener(new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case R.id.open_link: LinkUtil.openExternally(submission.getUrl(), main, true); break; case R.id.share_link: Reddit.defaultShareText("", submission.getUrl(), main); break; case R.id.copy_link: ClipboardManager clipboard = (ClipboardManager) main.getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("Link", submission.getUrl()); clipboard.setPrimaryClip(clip); Toast.makeText(main, R.string.submission_link_copied, Toast.LENGTH_SHORT).show(); break; } } }).show(); return true; } return true; } }); holder.image.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ContentType.Type type = ContentType.getContentType(submission); if (!PostMatch.openExternal(submission.getUrl()) || type == ContentType.Type.VIDEO) { switch (type) { case VID_ME: case STREAMABLE: if (SettingValues.video) { Intent myIntent = new Intent(main, MediaView.class); myIntent.putExtra(MediaView.SUBREDDIT, subreddit); myIntent.putExtra(MediaView.EXTRA_URL, submission.getUrl()); main.startActivity(myIntent); } else { Reddit.defaultShare(submission.getUrl(), main); } break; case IMGUR: PopulateSubmissionViewHolder.openImage(type, main, submission, null, holder.getAdapterPosition()); break; case EMBEDDED: if (SettingValues.video) { String data = Html.fromHtml(submission.getDataNode().get("media_embed").get("content").asText()).toString(); { Intent i = new Intent(main, FullscreenVideo.class); i.putExtra(FullscreenVideo.EXTRA_HTML, data); main.startActivity(i); } } else { Reddit.defaultShare(submission.getUrl(), main); } break; case REDDIT: PopulateSubmissionViewHolder.openRedditContent(submission.getUrl(), main); break; case LINK: LinkUtil.openUrl(submission.getUrl(), Palette.getColor(submission.getSubredditName()), main); break; case ALBUM: if (SettingValues.album) { if (SettingValues.albumSwipe) { Intent i = new Intent(main, AlbumPager.class); i.putExtra(AlbumPager.SUBREDDIT, subreddit); i.putExtra(Album.EXTRA_URL, submission.getUrl()); main.startActivity(i); } else { Intent i = new Intent(main, Album.class); i.putExtra(Album.SUBREDDIT, subreddit); i.putExtra(Album.EXTRA_URL, submission.getUrl()); main.startActivity(i); } } else { Reddit.defaultShare(submission.getUrl(), main); } break; case TUMBLR: if (SettingValues.image) { if (SettingValues.albumSwipe) { Intent i = new Intent(main, TumblrPager.class); i.putExtra(TumblrPager.SUBREDDIT, subreddit); i.putExtra(Album.EXTRA_URL, submission.getUrl()); main.startActivity(i); } else { Intent i = new Intent(main, Tumblr.class); i.putExtra(Tumblr.SUBREDDIT, subreddit); i.putExtra(Album.EXTRA_URL, submission.getUrl()); main.startActivity(i); } } else { Reddit.defaultShare(submission.getUrl(), main); } break; case DEVIANTART: case XKCD: case IMAGE: PopulateSubmissionViewHolder.openImage(type, main, submission, null, holder.getAdapterPosition()); break; case GIF: PopulateSubmissionViewHolder.openGif(main, submission, holder.getAdapterPosition()); break; case NONE: case SELF: holder.comments.callOnClick(); break; case VIDEO: if (Reddit.videoPlugin) { try { Intent sharingIntent = new Intent(Intent.ACTION_SEND); sharingIntent.setClassName("ccrama.me.slideyoutubeplugin", "ccrama.me.slideyoutubeplugin.YouTubeView"); sharingIntent.putExtra("url", submission.getUrl()); main.startActivity(sharingIntent); } catch (Exception e) { Reddit.defaultShare(submission.getUrl(), main); } } else { Reddit.defaultShare(submission.getUrl(), main); } break; } } else { Reddit.defaultShare(submission.getUrl(), main); } } }); } } @Override public int getItemCount() { return posts == null ? 0 : posts.size(); } public class SpacerViewHolder extends RecyclerView.ViewHolder { public SpacerViewHolder(View itemView) { super(itemView); } } public static class AlbumViewHolder extends RecyclerView.ViewHolder { final ImageView image; final ImageView type; final View comments; public AlbumViewHolder(View itemView) { super(itemView); comments = itemView.findViewById(R.id.comments); image = (ImageView) itemView.findViewById(R.id.image); type = (ImageView) itemView.findViewById(R.id.type); } } }