package com.kenny.openimgur.ui.adapters; import android.content.Context; import android.content.SharedPreferences; import android.graphics.BitmapFactory; import android.graphics.Color; import android.support.annotation.NonNull; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.kenny.openimgur.R; import com.kenny.openimgur.activities.SettingsActivity; import com.kenny.openimgur.classes.ImgurAlbum; import com.kenny.openimgur.classes.ImgurBaseObject; import com.kenny.openimgur.classes.ImgurPhoto; import com.kenny.openimgur.classes.OpengurApp; import com.kenny.openimgur.collections.SetUniqueList; import com.kenny.openimgur.ui.CenteredDrawable; import com.kenny.openimgur.util.FileUtil; import com.kenny.openimgur.util.ImageUtil; import com.kenny.openimgur.util.LogUtil; import com.nostra13.universalimageloader.core.DisplayImageOptions; import java.util.ArrayList; import java.util.List; import butterknife.BindView; public class GalleryAdapter extends BaseRecyclerAdapter<ImgurBaseObject> { public static final int MAX_ITEMS = 300; private int mUpvoteColor; private int mDownVoteColor; private boolean mAllowNSFWThumb; private View.OnClickListener mClickListener; private View.OnLongClickListener mLongClickListener; private boolean mShowPoints = true; private String mThumbnailQuality; public GalleryAdapter(Context context, SetUniqueList<ImgurBaseObject> objects, View.OnClickListener listener) { super(context, objects, true); mUpvoteColor = getColor(R.color.notoriety_positive); mDownVoteColor = getColor(R.color.notoriety_negative); SharedPreferences pref = OpengurApp.getInstance(context).getPreferences(); mAllowNSFWThumb = pref.getBoolean(SettingsActivity.KEY_NSFW_THUMBNAILS, false); mThumbnailQuality = pref.getString(SettingsActivity.KEY_THUMBNAIL_QUALITY, ImgurPhoto.THUMBNAIL_GALLERY); mClickListener = listener; } public GalleryAdapter(Context context, SetUniqueList<ImgurBaseObject> objects, View.OnClickListener listener, boolean showPoints) { this(context, objects, listener); mShowPoints = showPoints; } public void setOnLongClickPressListener(View.OnLongClickListener listener) { mLongClickListener = listener; if (getItemCount() > 0) notifyDataSetChanged(); } @Override public void onDestroy() { mClickListener = null; mLongClickListener = null; clear(); super.onDestroy(); } /** * Returns a list of objects for the viewing activity. This will return a max of 200 items to avoid memory issues. * 100 before and 100 after the currently selected position. If there are not 100 available before or after, it will go to as many as it can * * @param position The position of the selected items * @return */ public ArrayList<ImgurBaseObject> getItems(int position) { List<ImgurBaseObject> objects; int size = getItemCount(); if (position - MAX_ITEMS / 2 < 0) { objects = getAllItems().subList(0, size > MAX_ITEMS ? position + (MAX_ITEMS / 2) : size); } else { objects = getAllItems().subList(position - (MAX_ITEMS / 2), position + (MAX_ITEMS / 2) <= size ? position + (MAX_ITEMS / 2) : size); } return new ArrayList<>(objects); } @Override public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = inflateView(R.layout.gallery_item, parent); view.setOnClickListener(mClickListener); view.setOnLongClickListener(mLongClickListener); return new GalleryHolder(view); } @Override public void onBindViewHolder(BaseViewHolder holder, int position) { GalleryHolder galleryHolder = (GalleryHolder) holder; ImgurBaseObject obj = getItem(position); // Get the appropriate photo to display if (obj.isNSFW() && !mAllowNSFWThumb) { galleryHolder.image.setImageResource(R.drawable.ic_nsfw); galleryHolder.itemType.setVisibility(View.GONE); } else if (obj instanceof ImgurPhoto) { ImgurPhoto photoObject = ((ImgurPhoto) obj); String photoUrl; // Check if the link is a thumbed version of a large gif if (photoObject.hasVideoLink() && photoObject.isLinkAThumbnail() && ImgurPhoto.IMAGE_TYPE_GIF.equals(photoObject.getType())) { photoUrl = photoObject.getThumbnail(ImgurPhoto.THUMBNAIL_GALLERY, true, FileUtil.EXTENSION_GIF); } else { photoUrl = ((ImgurPhoto) obj).getThumbnail(ImgurPhoto.THUMBNAIL_GALLERY, false, null); } displayImage(galleryHolder.image, photoUrl); if (photoObject.isAnimated()) { galleryHolder.itemType.setVisibility(View.VISIBLE); galleryHolder.itemType.setImageResource(R.drawable.ic_gif_24dp); galleryHolder.itemType.setBackgroundColor(getColor(R.color.black_55)); } else { galleryHolder.itemType.setVisibility(View.GONE); } } else if (obj instanceof ImgurAlbum) { ImgurAlbum album = ((ImgurAlbum) obj); displayImage(galleryHolder.image, album.getCoverUrl(mThumbnailQuality)); int albumSize = album.getAlbumImageCount(); if (albumSize <= 1) { galleryHolder.itemType.setVisibility(View.GONE); galleryHolder.itemType.setBackground(null); } else { int albumImageId; switch (albumSize) { case 2: albumImageId = R.drawable.numeric_2_box_24dp; break; case 3: albumImageId = R.drawable.numeric_3_box_24dp; break; case 4: albumImageId = R.drawable.numeric_4_box_24dp; break; case 5: albumImageId = R.drawable.numeric_5_box_24dp; break; case 6: albumImageId = R.drawable.numeric_6_box_24dp; break; case 7: albumImageId = R.drawable.numeric_7_box_24dp; break; case 8: albumImageId = R.drawable.numeric_8_box_24dp; break; case 9: albumImageId = R.drawable.numeric_9_box_24dp; break; default: albumImageId = R.drawable.numeric_9_plus_box_24dp; break; } galleryHolder.itemType.setImageResource(albumImageId); galleryHolder.itemType.setVisibility(View.VISIBLE); galleryHolder.itemType.setBackground(null); } } else { String url = ImgurBaseObject.getThumbnail(obj.getId(), obj.getLink(), ImgurPhoto.THUMBNAIL_GALLERY); displayImage(galleryHolder.image, url); galleryHolder.itemType.setVisibility(View.GONE); } if (mShowPoints) { int totalPoints = obj.getUpVotes() - obj.getDownVotes(); galleryHolder.score.setText(getResources().getQuantityString(R.plurals.points, totalPoints, totalPoints)); galleryHolder.score.setVisibility(View.VISIBLE); } else { galleryHolder.score.setVisibility(View.GONE); } if (obj.isFavorited() || ImgurBaseObject.VOTE_UP.equals(obj.getVote())) { galleryHolder.score.setTextColor(mUpvoteColor); } else if (ImgurBaseObject.VOTE_DOWN.equals(obj.getVote())) { galleryHolder.score.setTextColor(mDownVoteColor); } else { galleryHolder.score.setTextColor(Color.WHITE); } } @Override protected DisplayImageOptions getDisplayOptions() { // The drawable CAN NOT be Vectors as they do not get converted to bitmap on decoding int drawableRes = isDarkTheme ? R.drawable.ic_broken_image_white_48dp : R.drawable.ic_broken_image_black_48dp; CenteredDrawable dr = new CenteredDrawable(BitmapFactory.decodeResource(getResources(), drawableRes)); return ImageUtil.getDisplayOptionsForGallery().showImageOnFail(dr).build(); } public void setAllowNSFW(boolean allowNSFW) { if (mAllowNSFWThumb != allowNSFW) { mAllowNSFWThumb = allowNSFW; notifyDataSetChanged(); } } public void setThumbnailQuality(@NonNull Context context, String quality) { if (!mThumbnailQuality.equals(quality)) { LogUtil.v(TAG, "Updating thumbnail quality to " + quality); // Clear any memory cache we may have for the new thumbnail ImageUtil.getImageLoader(context).clearMemoryCache(); mThumbnailQuality = quality; notifyDataSetChanged(); } } public static class GalleryHolder extends BaseViewHolder { @BindView(R.id.image) ImageView image; @BindView(R.id.score) TextView score; @BindView(R.id.itemType) ImageView itemType; public GalleryHolder(View view) { super(view); } } }