package com.etiennelawlor.loop.adapters; import android.graphics.Typeface; import android.support.v4.view.ViewCompat; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.bumptech.glide.Glide; import com.etiennelawlor.loop.LoopApplication; import com.etiennelawlor.loop.R; import com.etiennelawlor.loop.bus.RxBus; import com.etiennelawlor.loop.bus.events.SearchPerformedEvent; import com.etiennelawlor.loop.network.models.response.User; import com.etiennelawlor.loop.network.models.response.Video; import com.etiennelawlor.loop.ui.AvatarView; import com.etiennelawlor.loop.ui.LoadingImageView; import com.etiennelawlor.loop.utilities.FontCache; import com.etiennelawlor.loop.utilities.Transformers; import com.greenfrvr.hashtagview.HashtagView; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; /** * Created by etiennelawlor on 5/23/15. */ public class RelatedVideosAdapter extends BaseAdapter<Video> { // region Static Variables private static boolean isLikeOn = false; private static boolean isWatchLaterOn = false; private static boolean hasDescription = false; private static boolean hasTags = false; private static Typeface boldFont; // endregion // region Member Variables private Video video; private OnLikeClickListener onLikeClickListener; private OnWatchLaterClickListener onWatchLaterClickListener; private OnCommentsClickListener onCommentsClickListener; private OnInfoClickListener onInfoClickListener; private FooterViewHolder footerViewHolder; // endregion // region Interfaces public interface OnLikeClickListener { void onLikeClick(ImageView imageView); } public interface OnWatchLaterClickListener { void onWatchLaterClick(ImageView imageView); } public interface OnCommentsClickListener { void onCommentsClick(); } public interface OnInfoClickListener { void onInfoClick(ImageView imageView); } // endregion // region Constructors public RelatedVideosAdapter(Video video) { super(); this.video = video; boldFont = FontCache.getTypeface("Ubuntu-Bold.ttf", LoopApplication.getInstance().getApplicationContext()); } // endregion @Override public int getItemViewType(int position) { if(position == 0) return HEADER; else return (isLastPosition(position) && isFooterAdded) ? FOOTER : ITEM; } @Override protected RecyclerView.ViewHolder createHeaderViewHolder(ViewGroup parent) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.video_info, parent, false); final HeaderViewHolder holder = new HeaderViewHolder(v); holder.likeImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(onLikeClickListener != null){ onLikeClickListener.onLikeClick(holder.likeImageView); } } }); holder.watchLaterImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(onWatchLaterClickListener != null){ onWatchLaterClickListener.onWatchLaterClick(holder.watchLaterImageView); } } }); holder.commentsImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(onCommentsClickListener != null){ onCommentsClickListener.onCommentsClick(); } } }); holder.infoImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(onInfoClickListener != null){ onInfoClickListener.onInfoClick(holder.infoImageView); int visibility = holder.additionalInfoLinearLayout.getVisibility(); if(visibility == View.VISIBLE){ holder.additionalInfoLinearLayout.setVisibility(View.GONE); } else if(visibility == View.GONE){ holder.additionalInfoLinearLayout.setVisibility(View.VISIBLE); } } } }); return holder; } @Override protected RecyclerView.ViewHolder createItemViewHolder(ViewGroup parent) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.video_row, parent, false); final VideoViewHolder holder = new VideoViewHolder(v); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int adapterPos = holder.getAdapterPosition(); if(adapterPos != RecyclerView.NO_POSITION){ if (onItemClickListener != null) { onItemClickListener.onItemClick(adapterPos, holder.itemView); } } } }); return holder; } @Override protected RecyclerView.ViewHolder createFooterViewHolder(ViewGroup parent) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_footer, parent, false); final FooterViewHolder holder = new FooterViewHolder(v); holder.reloadButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(onReloadClickListener != null){ onReloadClickListener.onReloadClick(); } } }); return holder; } @Override protected void bindHeaderViewHolder(RecyclerView.ViewHolder viewHolder) { HeaderViewHolder holder = (HeaderViewHolder) viewHolder; if(video != null){ holder.bind(video); } } @Override protected void bindItemViewHolder(RecyclerView.ViewHolder viewHolder, int position) { final VideoViewHolder holder = (VideoViewHolder) viewHolder; final Video video = getItem(position); if (video != null) { holder.bind(video); } } @Override protected void bindFooterViewHolder(RecyclerView.ViewHolder viewHolder) { FooterViewHolder holder = (FooterViewHolder) viewHolder; footerViewHolder = holder; holder.loadingImageView.setMaskOrientation(LoadingImageView.MaskOrientation.LeftToRight); } @Override protected void displayLoadMoreFooter() { if(footerViewHolder!= null){ footerViewHolder.errorRelativeLayout.setVisibility(View.GONE); footerViewHolder.loadingFrameLayout.setVisibility(View.VISIBLE); } } @Override protected void displayErrorFooter() { if(footerViewHolder!= null){ footerViewHolder.loadingFrameLayout.setVisibility(View.GONE); footerViewHolder.errorRelativeLayout.setVisibility(View.VISIBLE); } } @Override public void addFooter() { isFooterAdded = true; add(new Video()); } // region Helper Methods public void addHeader(){ add(new Video()); } public void setOnLikeClickListener(OnLikeClickListener onLikeClickListener) { this.onLikeClickListener = onLikeClickListener; } public void setOnWatchLaterClickListener(OnWatchLaterClickListener onWatchLaterClickListener) { this.onWatchLaterClickListener = onWatchLaterClickListener; } public void setOnCommentsClickListener(OnCommentsClickListener onCommentsClickListener) { this.onCommentsClickListener = onCommentsClickListener; } public void setOnInfoClickListener(OnInfoClickListener onInfoClickListener) { this.onInfoClickListener = onInfoClickListener; } public static boolean isLikeOn() {return isLikeOn; } public static void setIsLikeOn(boolean iLO) { isLikeOn = iLO; } public static boolean isWatchLaterOn() {return isWatchLaterOn; } public static void setIsWatchLaterOn(boolean iWLO) { isWatchLaterOn = iWLO; } // endregion // region Inner Classes public static class HeaderViewHolder extends RecyclerView.ViewHolder { // region Views @BindView(R.id.title_tv) TextView titleTextView; @BindView(R.id.subtitle_tv) TextView subtitleTextView; @BindView(R.id.user_iv) AvatarView userImageView; @BindView(R.id.view_count_tv) TextView viewCountTextView; @BindView(R.id.upload_date_tv) TextView uploadDateTextView; @BindView(R.id.like_iv) ImageView likeImageView; @BindView(R.id.watch_later_iv) ImageView watchLaterImageView; @BindView(R.id.comments_iv) ImageView commentsImageView; @BindView(R.id.info_iv) ImageView infoImageView; @BindView(R.id.htv) HashtagView hashtagView; @BindView(R.id.description_tv) TextView descriptionTextView; @BindView(R.id.additional_info_ll) LinearLayout additionalInfoLinearLayout; // endregion // region Constructors HeaderViewHolder(View view) { super(view); ButterKnife.bind(this, view); } // endregion // region Helper Methods private void bind(Video video){ setUpTitle(titleTextView, video); setUpSubtitle(subtitleTextView, video); setUpViewCount(viewCountTextView, video); setUpLike(likeImageView, video); setUpWatchLater(watchLaterImageView, video); setUpUserImage(userImageView, video); setUpUploadedDate(uploadDateTextView, video); setUpDescription(descriptionTextView, video); setUpTags(hashtagView, video); setUpInfoImage(infoImageView); } private void setUpTitle(TextView tv, Video video) { String name = video.getName(); if (!TextUtils.isEmpty(name)) { tv.setText(name); } } private void setUpSubtitle(TextView tv, Video video) { User user = video.getUser(); if (user != null) { String userName = user.getName(); if (!TextUtils.isEmpty(userName)) { tv.setText(userName); } } } private void setUpLike(ImageView iv, Video video){ boolean isLiked = video.isLiked(); if (isLiked) { setIsLikeOn(true); iv.setImageResource(R.drawable.ic_likes_on); } } private void setUpWatchLater(ImageView iv, Video video){ boolean isAddedToWatchLater = video.isAddedToWatchLater(); if (isAddedToWatchLater) { setIsWatchLaterOn(true); iv.setImageResource(R.drawable.ic_watch_later_on); } } private void setUpUserImage(AvatarView av, Video video) { User user = video.getUser(); if(user != null){ av.bind(user); } else { av.nullify(); } } private void setUpViewCount(TextView tv, Video video) { String formattedViewCount = video.getFormattedViewCount(); if(!TextUtils.isEmpty(formattedViewCount)){ tv.setText(formattedViewCount); tv.setVisibility(View.VISIBLE); } else { tv.setVisibility(View.GONE); } } private void setUpUploadedDate(TextView tv, Video video) { String formattedCreatedTime = video.getFormattedCreatedTime(); if (!TextUtils.isEmpty(formattedCreatedTime)) { tv.setText(formattedCreatedTime); tv.setVisibility(View.VISIBLE); } else { tv.setVisibility(View.GONE); } } private void setUpTags(final HashtagView htv, Video video) { List<String> canonicalTags = video.getCanonicalTags(); if(canonicalTags.size() > 0){ hasTags = true; htv.setData(canonicalTags, Transformers.HASH); htv.setTypeface(boldFont); htv.addOnTagClickListener(new HashtagView.TagsClickListener() { @Override public void onItemClicked(Object item) { String tag = (String) item; // TODO this triggers two events somehow RxBus.getInstance().send(new SearchPerformedEvent(tag)); } }); htv.setVisibility(View.VISIBLE); } else { htv.setVisibility(View.GONE); } } private void setUpDescription(TextView tv, Video video) { String formattedDescription = video.getFormattedDescription(); if (!TextUtils.isEmpty(formattedDescription)) { hasDescription = true; // formattedDescription = formattedDescription.replaceAll("[\\t\\n\\r]+", "\n"); tv.setText(formattedDescription); tv.setVisibility(View.VISIBLE); } else { tv.setVisibility(View.GONE); } } private void setUpInfoImage(ImageView iv){ if(hasDescription || hasTags){ iv.setVisibility(View.VISIBLE); } } // endregion } public static class VideoViewHolder extends RecyclerView.ViewHolder { // region Views @BindView(R.id.video_thumbnail_iv) ImageView videoThumbnailImageView; @BindView(R.id.title_tv) TextView titleTextView; @BindView(R.id.caption_tv) TextView captionTextView; @BindView(R.id.duration_tv) TextView durationTextView; @BindView(R.id.subtitle_tv) TextView subtitleTextView; // endregion // region Constructors VideoViewHolder(View view) { super(view); ButterKnife.bind(this, view); } // endregion // region Helper Methods private void bind(Video video){ setUpTitle(titleTextView, video); setUpSubtitle(subtitleTextView, video); setUpVideoThumbnail(videoThumbnailImageView, video); setUpDuration(durationTextView, video); setUpCaption(captionTextView, video); int adapterPos = getAdapterPosition(); ViewCompat.setTransitionName(subtitleTextView,"myTransition"+adapterPos); } private void setUpTitle(TextView tv, Video video) { String name = video.getName(); if (!TextUtils.isEmpty(name)) { tv.setText(name); } } private void setUpSubtitle(TextView tv, Video video) { User user = video.getUser(); if (user != null) { String userName = user.getName(); if (!TextUtils.isEmpty(userName)) { tv.setText(userName); } } } private void setUpVideoThumbnail(ImageView iv, Video video) { String thumbnailUrl = video.getThumbnailUrl(); if (!TextUtils.isEmpty(thumbnailUrl)) { Glide.with(iv.getContext()) .load(thumbnailUrl) // .placeholder(R.drawable.ic_placeholder) // .error(R.drawable.ic_error) .into(iv); } } private void setUpDuration(TextView tv, Video video) { String formattedDuration = video.getFormattedDuration(); if(!TextUtils.isEmpty(formattedDuration)) tv.setText(formattedDuration); } private void setUpCaption(TextView tv, Video video) { String caption = video.getCaption(); if(!TextUtils.isEmpty(caption)) tv.setText(caption); } // endregion } public static class FooterViewHolder extends RecyclerView.ViewHolder { // region Views @BindView(R.id.loading_fl) FrameLayout loadingFrameLayout; @BindView(R.id.error_rl) RelativeLayout errorRelativeLayout; @BindView(R.id.loading_iv) LoadingImageView loadingImageView; @BindView(R.id.reload_btn) Button reloadButton; // endregion // region Constructors public FooterViewHolder(View view) { super(view); ButterKnife.bind(this, view); } // endregion } // endregion }