package moe.feng.nhentai.ui.adapter; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.ImageView; import android.widget.TextView; import com.lid.lib.LabelView; import java.util.ArrayList; import moe.feng.nhentai.R; import moe.feng.nhentai.api.BookApi; import moe.feng.nhentai.dao.FavoritesManager; import moe.feng.nhentai.dao.HistoryManager; import moe.feng.nhentai.model.Book; import moe.feng.nhentai.ui.common.AbsRecyclerViewAdapter; import moe.feng.nhentai.util.AsyncTask; import moe.feng.nhentai.util.ColorGenerator; import moe.feng.nhentai.util.Settings; import moe.feng.nhentai.util.TextDrawable; import moe.feng.nhentai.util.Utility; public class BookListRecyclerAdapter extends AbsRecyclerViewAdapter { private ArrayList<Book> data; private Settings sets; private ColorGenerator mColorGenerator; public static final String TAG = BookListRecyclerAdapter.class.getSimpleName(); public void update(FavoritesManager fm){ this.data = fm.toArray(); } public void update(HistoryManager hm){ this.data = hm.toArray(); } public BookListRecyclerAdapter(RecyclerView recyclerView, FavoritesManager fm, Settings sets) { this(recyclerView, null, fm, sets); } public BookListRecyclerAdapter(RecyclerView recyclerView, HistoryManager hm, Settings sets) { this(recyclerView, null, hm, sets); } public BookListRecyclerAdapter(RecyclerView recyclerView, ArrayList<Book> data, FavoritesManager fm, Settings sets) { super(recyclerView); if (data == null){ this.data = fm.toArray(); } else this.data = data; this.sets = sets; mColorGenerator = ColorGenerator.MATERIAL; setHasStableIds(true); } public BookListRecyclerAdapter(RecyclerView recyclerView, ArrayList<Book> data, HistoryManager hm, Settings sets) { super(recyclerView); if (data == null){ this.data = hm.toArray(); } else this.data = data; this.sets = sets; mColorGenerator = ColorGenerator.MATERIAL; setHasStableIds(true); } @Override public void onViewRecycled(ClickableViewHolder holder) { super.onViewRecycled(holder); ((ViewHolder) holder).labelView.remove(); ((ViewHolder) holder).mPreviewImageView.setImageBitmap(null); ((ViewHolder) holder).mPreviewImageView.invalidate(); ((ViewHolder) holder).mLangFieldView.setImageBitmap(null); ((ViewHolder) holder).mLangFieldView.invalidate(); } @Override public ClickableViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { bindContext(viewGroup.getContext()); View view = LayoutInflater.from(getContext()).inflate(R.layout.list_item_book_card, viewGroup, false); return new ViewHolder(view, new LabelView(getContext())); } @Override public void onBindViewHolder(final ClickableViewHolder holder, final int position) { super.onBindViewHolder(holder, position); if (holder instanceof ViewHolder) { final ViewHolder mHolder = (ViewHolder) holder; String text = " " + data.get(position).getAvailableTitle(); mHolder.mTitleTextView.setText(text); String previewImageUrl = data.get(position).previewImageUrl; switch (data.get(position).langField) { case Book.LANG_GB: mHolder.mLangFieldView.setImageResource(R.drawable.ic_lang_gb); break; case Book.LANG_CN: mHolder.mLangFieldView.setImageResource(R.drawable.ic_lang_cn); break; case Book.LANG_JP: default: mHolder.mLangFieldView.setImageResource(R.drawable.ic_lang_jp); break; } int color = mColorGenerator.getColor(data.get(position).getAvailableTitle() !=null ? data.get(position).getAvailableTitle() : "Doujin"); TextDrawable drawable = TextDrawable.builder().buildRect(Utility.getFirstCharacter(data.get(position).getAvailableTitle() != null? data.get(position).getAvailableTitle(): "Doujin"), color); mHolder.mPreviewImageView.setImageDrawable(drawable); mHolder.mImagePlaceholder = drawable; if (previewImageUrl != null) { new ImageDownloader().execute(mHolder.getParentView()); } mHolder.book = data.get(position); if (FavoritesManager.getInstance(getContext()).contains(mHolder.book.bookId)) { Log.i(TAG, "Find favorite: " + mHolder.book.bookId); mHolder.labelView.setText(R.string.label_added_to_favorite); mHolder.labelView.setBackgroundResource(R.color.blue_500); mHolder.labelView.setTargetView(mHolder.mPreviewImageView, 10, LabelView.Gravity.RIGHT_TOP); } } } @Override public long getItemId(int position) { return Long.valueOf(data.get(position).galleryId); } @Override public int getItemCount() { return data.size(); } private class ImageDownloader extends AsyncTask<Object, Object, Void> { @Override protected Void doInBackground(Object[] params) { View v = (View) params[0]; ViewHolder h = (ViewHolder) v.getTag(); Book book = h.book; if (!TextUtils.isEmpty(book.previewImageUrl)) { ImageView imageView = h.mPreviewImageView; boolean useHdImage = sets != null && sets.getBoolean(Settings.KEY_LIST_HD_IMAGE, false); Bitmap img = useHdImage ? BookApi.getCover(getContext(), book) : BookApi.getThumb(getContext(), book); if (img != null) { publishProgress(v, img, imageView, book); } } return null; } @Override protected void onProgressUpdate(final Object[] values) { super.onProgressUpdate(values); View v = (View) values[0]; Bitmap img = (Bitmap) values[1]; ImageView imageView = (ImageView) values [2]; if (!(v.getTag() instanceof ViewHolder) || (((ViewHolder) v.getTag()).book != null && !((ViewHolder) v.getTag()).book.bookId.equals(((Book) values[3]).bookId))) { return; } imageView.setVisibility(View.VISIBLE); imageView.setTag(false); imageView.setImageBitmap(img); imageView.invalidate(); } } public class ViewHolder extends ClickableViewHolder { public ImageView mPreviewImageView, mLangFieldView; public TextView mTitleTextView; Drawable mImagePlaceholder; public Book book; LabelView labelView; public ViewHolder(View itemView, LabelView labelView) { super(itemView); mPreviewImageView = (ImageView) itemView.findViewById(R.id.book_preview); mLangFieldView = (ImageView) itemView.findViewById(R.id.book_lang_field); mTitleTextView = (TextView) itemView.findViewById(R.id.book_title); this.labelView = labelView; itemView.setTag(this); } } }