package com.aptoide.amethyst.adapter.store; import android.app.Activity; import android.content.res.Resources; import android.content.Context; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.PopupMenu; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import com.aptoide.amethyst.R; import com.aptoide.amethyst.adapters.SpannableRecyclerAdapter; import com.aptoide.amethyst.dialogs.AptoideDialog; import com.aptoide.amethyst.dialogs.ReplyCommentDialog; import com.aptoide.amethyst.ui.callbacks.AddCommentCallback; import com.aptoide.amethyst.utils.AptoideUtils; import com.aptoide.amethyst.utils.Logger; import com.aptoide.amethyst.webservices.v2.AddApkCommentVoteRequest; import com.aptoide.models.displayables.CommentItem; import com.aptoide.models.displayables.Displayable; import com.aptoide.models.displayables.HeaderRow; import com.aptoide.models.displayables.ProgressBarRow; import com.aptoide.models.displayables.NoCommentPlaceHolderRow; import com.bumptech.glide.Glide; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.List; import java.util.Locale; import com.aptoide.amethyst.adapter.BaseAdapter; import com.aptoide.amethyst.callbacks.AddCommentVoteCallback; import com.aptoide.amethyst.ui.widget.CircleTransform; import com.aptoide.amethyst.viewholders.BaseViewHolder; import com.aptoide.amethyst.viewholders.ProgressBarRowViewHolder; import com.aptoide.amethyst.viewholders.main.CommentHeaderViewHolder; import com.aptoide.amethyst.viewholders.main.EmptyViewHolder; import com.aptoide.amethyst.viewholders.store.CommentViewHolder; /** * Created by hsousa on 21/07/15. */ public class CommentsStoreAdapter extends BaseAdapter implements SpannableRecyclerAdapter { private final SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault()); private final int colorResId; private final Activity activity; private final boolean appView; private AddCommentCallback addCommentCallback; public CommentsStoreAdapter(List<Displayable> displayableList, Activity activity, int colorResId, boolean appView, AddCommentCallback addCommentCallback) { super(displayableList); this.activity = activity; this.colorResId = colorResId; this.appView = appView; this.addCommentCallback = addCommentCallback; } @Override public BaseViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(viewType, viewGroup, false); BaseViewHolder holder; if (viewType == R.layout.row_appview_comments_header) { holder = new CommentHeaderViewHolder(view, viewType); } else if (viewType == R.layout.comment_row) { holder = new CommentViewHolder(view, viewType, activity, colorResId); } else if (viewType == R.layout.row_appview_create_comment) { holder = new EmptyViewHolder(view, viewType); } else if (viewType == R.layout.row_progress_bar) { return new ProgressBarRowViewHolder(view, viewType); } else { throw new IllegalStateException("CommentsStoreAdapter with unknown viewtype"); } return holder; } @Override public void onBindViewHolder(BaseViewHolder viewHolder, int position) { if (viewHolder.viewType == R.layout.row_appview_comments_header) { HeaderRow row = (HeaderRow) displayableList.get(position); CommentHeaderViewHolder holder = (CommentHeaderViewHolder) viewHolder; holder.title.setText(row.getLabel()); holder.writeComment.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (AptoideUtils.AccountUtils.isLoggedInOrAsk(activity)) { ReplyCommentDialog replyDialog = AptoideDialog.replyCommentDialog(-1, null, addCommentCallback); replyDialog.show(((AppCompatActivity) activity).getSupportFragmentManager(), "replyCommentDialog"); // FlurryAgent.logEvent("App_View_Clicked_On_Reply_Comment"); } } }); } else if (viewHolder.viewType == R.layout.comment_row) { CommentViewHolder item = (CommentViewHolder) viewHolder; final CommentItem commentItem = (CommentItem) displayableList.get(position); if (appView) { item.appname.setVisibility(View.GONE); item.replyComment.setVisibility(View.VISIBLE); item.verticalSeparator.setVisibility(View.VISIBLE); item.replyComment.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (AptoideUtils.AccountUtils.isLoggedInOrAsk(activity)) { ReplyCommentDialog replyDialog = AptoideDialog.replyCommentDialog(commentItem.id.intValue(), commentItem.username, addCommentCallback); replyDialog.show(((AppCompatActivity) activity).getSupportFragmentManager(), "replyCommentDialog"); } } }); } else { item.replyComment.setVisibility(View.GONE); item.appname.setText(commentItem.appname); } String dateString = ""; final Context context = viewHolder.itemView.getContext(); try { dateString = AptoideUtils.DateTimeUtils.getInstance(context).getTimeDiffString(context, dateFormatter.parse(commentItem.timestamp).getTime()); } catch (ParseException e) { Logger.printException(e); } item.timestamp.setText(dateString); item.username.setText(commentItem.username); item.text.setText(commentItem.text); item.appname.setTextColor(colorResId); item.overflow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showPopup(activity, view, commentItem.id.intValue(), commentItem.username, false); } }); if (commentItem.votes != null && commentItem.votes.intValue() != 0) { item.votes.setVisibility(View.VISIBLE); item.votes.setText(AptoideUtils.StringUtils.getFormattedString(context, R.string.votes, commentItem.votes)); } viewHolder.itemView.setOnClickListener(new CommentItemOnClickListener(commentItem)); Glide.with(context).load(commentItem.useravatar).transform(new CircleTransform(context)).into(item.useravatar); if (position == displayableList.size() - 1) { item.verticalSeparator.setVisibility(View.GONE); } Resources r = item.itemView.getResources(); int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, commentItem.commentLevel * 30, r.getDisplayMetrics()); LinearLayout.LayoutParams relativeParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); relativeParams.setMargins(px, 0, 0, 0); item.cardLayout.setLayoutParams(relativeParams); item.cardLayout.requestLayout(); } } public void showPopup(final Activity activity, View view, final int commentId, String author, boolean showReply) { PopupMenu popup = new PopupMenu(view.getContext(), view); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { if (!AptoideUtils.AccountUtils.isLoggedInOrAsk(activity)) return false; if (!(activity instanceof AddCommentVoteCallback)) { throw new IllegalStateException("activity is not an instanceof AddCommentVoteCallback"); } int i = item.getItemId(); if (i == R.id.menu_vote_up) { ((AddCommentVoteCallback) activity).voteComment(commentId, AddApkCommentVoteRequest.CommentVote.up); // FlurryAgent.logEvent("App_View_Voted_Up"); return true; } else if (i == R.id.menu_vote_down) { ((AddCommentVoteCallback) activity).voteComment(commentId, AddApkCommentVoteRequest.CommentVote.down); // FlurryAgent.logEvent("App_View_Voted_Down"); return true; } return false; } }); popup.inflate(R.menu.menu_comments); popup.show(); if (!showReply) { popup.getMenu().findItem(R.id.menu_reply).setVisible(false); } } @Override public int getItemViewType(int position) { if (displayableList.get(position) instanceof HeaderRow) { return R.layout.row_appview_comments_header; } else if (displayableList.get(position) instanceof CommentItem) { return R.layout.comment_row; } else if (displayableList.get(position) instanceof NoCommentPlaceHolderRow) { return R.layout.row_appview_create_comment; } else if (displayableList.get(position) instanceof ProgressBarRow) { return R.layout.row_progress_bar; } else { throw new IllegalStateException("InvalidType"); } } @Override public int getSpanSize(int position) { return displayableList.get(position).getSpanSize(); } @Override public int getItemCount() { return displayableList.size(); } }