package com.gh.common.util; import android.app.Dialog; import android.content.ClipboardManager; import android.content.Context; import android.graphics.Color; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.text.TextUtils; import android.view.View; import android.view.Window; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.gh.gamecenter.CommentDetailActivity; import com.gh.gamecenter.MessageDetailActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.OnCommentCallBackListener; import com.gh.gamecenter.adapter.viewholder.CommentViewHolder; import com.gh.gamecenter.entity.CommentEntity; import com.gh.gamecenter.entity.MeEntity; import com.gh.gamecenter.entity.RatingComment; import com.gh.gamecenter.entity.UserInfoEntity; import com.gh.gamecenter.manager.UserManager; import com.gh.gamecenter.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; import com.lightgame.utils.Utils; import org.json.JSONException; import org.json.JSONObject; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; import okhttp3.MediaType; import okhttp3.RequestBody; import okhttp3.ResponseBody; import retrofit2.HttpException; /** * Created by khy on 2017/3/22. */ public class CommentUtils { public static void setCommentTime(TextView textView, long time) { SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd", Locale.getDefault()); try { long today = format.parse(format.format(new Date())).getTime(); long day = time * 1000; if (day >= today && day < today + 86400 * 1000) { long min = new Date().getTime() / 1000 - day / 1000; int hour = (int) (min / (60 * 60)); if (hour == 0) { if (min < 60) { textView.setText("刚刚"); } else { textView.setText(String.format(Locale.getDefault(), "%d分钟前", (int) (min / 60))); } } else { textView.setText(String.format(Locale.getDefault(), "%d小时前", hour)); } } else if (day >= today - 86400 * 1000 && day < today) { format.applyPattern("HH:mm"); textView.setText("昨天 "); } else { format.applyPattern("yyyy-MM-dd"); textView.setText(format.format(day)); } } catch (ParseException e) { e.printStackTrace(); format.applyPattern("yyyy-MM-dd"); textView.setText(format.format(time * 1000)); } } public static void showGameCommentOptions(final Context context, final RatingComment comment, final String gameId) { final Dialog dialog = new Dialog(context); LinearLayout container = new LinearLayout(context); container.setOrientation(LinearLayout.VERTICAL); container.setBackgroundColor(Color.WHITE); container.setPadding(0, DisplayUtils.dip2px(context, 12), 0, DisplayUtils.dip2px(context, 12)); List dialogType = new ArrayList<>(); dialogType.add("复制"); dialogType.add("举报"); for (String s : dialogType) { final TextView reportTv = new TextView(context); reportTv.setText(s); reportTv.setTextSize(17); reportTv.setTextColor(ContextCompat.getColor(context, R.color.title)); reportTv.setBackgroundResource(R.drawable.textview_white_style); int widthPixels = context.getResources().getDisplayMetrics().widthPixels; reportTv.setLayoutParams(new LinearLayout.LayoutParams((widthPixels * 9) / 10, LinearLayout.LayoutParams.WRAP_CONTENT)); reportTv.setPadding(DisplayUtils.dip2px(context, 20), DisplayUtils.dip2px(context, 12), 0, DisplayUtils.dip2px(context, 12)); container.addView(reportTv); reportTv.setOnClickListener(v -> { dialog.cancel(); switch (reportTv.getText().toString()) { case "复制": copyText(comment.getContent(), context); break; case "举报": CheckLoginUtils.checkLogin(context, () -> showGameCommentReportDialog(gameId, comment, context)); break; } }); } dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(container); dialog.show(); } private static void showGameCommentReportDialog(final String gameId, final RatingComment comment, final Context context) { final String[] arrReportType = new String[]{"垃圾广告营销", "恶意攻击谩骂", "淫秽色情信息", "违法有害信息", "其它"}; int widthPixels = context.getResources().getDisplayMetrics().widthPixels; final Dialog reportTypeDialog = new Dialog(context); LinearLayout container = new LinearLayout(context); container.setOrientation(LinearLayout.VERTICAL); container.setPadding(0, DisplayUtils.dip2px(context, 12), 0, DisplayUtils.dip2px(context, 12)); container.setBackgroundColor(Color.WHITE); for (final String s : arrReportType) { TextView reportTypeTv = new TextView(context); reportTypeTv.setText(s); reportTypeTv.setTextSize(17); reportTypeTv.setTextColor(ContextCompat.getColor(context, R.color.title)); reportTypeTv.setBackgroundResource(R.drawable.textview_white_style); reportTypeTv.setLayoutParams(new LinearLayout.LayoutParams((widthPixels * 9) / 10, LinearLayout.LayoutParams.WRAP_CONTENT)); reportTypeTv.setPadding(DisplayUtils.dip2px(context, 20), DisplayUtils.dip2px(context, 12), 0, DisplayUtils.dip2px(context, 12)); container.addView(reportTypeTv); reportTypeTv.setOnClickListener(v -> { JSONObject jsonObject = new JSONObject(); try { jsonObject.put("reason", s); } catch (JSONException e) { e.printStackTrace(); } RequestBody body = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString()); RetrofitManager.getInstance(context).getApi() .reportGameComment(gameId, comment.getId(), body) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Response() { @Override public void onResponse(@Nullable ResponseBody response) { Utils.toast(context, "感谢您的举报"); } @Override public void onFailure(@Nullable HttpException e) { Utils.toast(context, "举报失败,请先检查网络设置"); } }); reportTypeDialog.cancel(); }); } reportTypeDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); reportTypeDialog.setContentView(container); reportTypeDialog.show(); } public static void showReportDialog(final CommentEntity commentEntity, final Context context, final boolean showConversation, final OnCommentCallBackListener listener, final String newsId) { final Dialog dialog = new Dialog(context); LinearLayout container = new LinearLayout(context); container.setOrientation(LinearLayout.VERTICAL); container.setBackgroundColor(Color.WHITE); container.setPadding(0, DisplayUtils.dip2px(context, 12), 0, DisplayUtils.dip2px(context, 12)); List dialogType = new ArrayList<>(); if (commentEntity.getMe() == null || !commentEntity.getMe().isCommentOwn()) { dialogType.add("回复"); } dialogType.add("复制"); dialogType.add("举报"); if (commentEntity.getParent() != null && showConversation) { dialogType.add("查看对话"); } for (String s : dialogType) { final TextView reportTv = new TextView(context); reportTv.setText(s); reportTv.setTextSize(17); reportTv.setTextColor(ContextCompat.getColor(context, R.color.title)); reportTv.setBackgroundResource(R.drawable.textview_white_style); int widthPixels = context.getResources().getDisplayMetrics().widthPixels; reportTv.setLayoutParams(new LinearLayout.LayoutParams((widthPixels * 9) / 10, LinearLayout.LayoutParams.WRAP_CONTENT)); reportTv.setPadding(DisplayUtils.dip2px(context, 20), DisplayUtils.dip2px(context, 12), 0, DisplayUtils.dip2px(context, 12)); container.addView(reportTv); reportTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.cancel(); switch (reportTv.getText().toString()) { case "回复": CheckLoginUtils.checkLogin(context, () -> { if (listener != null) { listener.onCommentCallback(commentEntity); } else if (!TextUtils.isEmpty(newsId)) { context.startActivity(MessageDetailActivity.getMessageDetailIntent(context, commentEntity, newsId)); } else { Utils.toast(context, "缺少关键属性"); } }); break; case "复制": copyText(commentEntity.getContent(), context); break; case "举报": CheckLoginUtils.checkLogin(context, () -> showReportTypeDialog(commentEntity, context)); break; case "查看对话": context.startActivity(CommentDetailActivity.getIntent(context, commentEntity.getId(), null)); break; } } }); } dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(container); dialog.show(); } public static void showAnswerCommentOptions(final CommentEntity commentEntity, final Context context, final OnCommentCallBackListener listener, final String id, boolean showConversation, String answerId, String articleId, String articleCommunityId) { final Dialog dialog = new Dialog(context); LinearLayout container = new LinearLayout(context); container.setOrientation(LinearLayout.VERTICAL); container.setBackgroundColor(Color.WHITE); container.setPadding(0, DisplayUtils.dip2px(context, 12), 0, DisplayUtils.dip2px(context, 12)); List dialogType = new ArrayList<>(); if (commentEntity.getMe() == null || !commentEntity.getMe().isAnswerCommented()) { dialogType.add("回复"); } dialogType.add("复制"); dialogType.add("举报"); if (commentEntity.getParentUser() != null && showConversation) { dialogType.add("查看对话"); } for (String s : dialogType) { final TextView reportTv = new TextView(context); reportTv.setText(s); reportTv.setTextSize(17); reportTv.setTextColor(ContextCompat.getColor(context, R.color.title)); reportTv.setBackgroundResource(R.drawable.textview_white_style); int widthPixels = context.getResources().getDisplayMetrics().widthPixels; reportTv.setLayoutParams(new LinearLayout.LayoutParams((widthPixels * 9) / 10, LinearLayout.LayoutParams.WRAP_CONTENT)); reportTv.setPadding(DisplayUtils.dip2px(context, 20), DisplayUtils.dip2px(context, 12), 0, DisplayUtils.dip2px(context, 12)); container.addView(reportTv); reportTv.setOnClickListener(v -> { dialog.cancel(); switch (reportTv.getText().toString()) { case "回复": CheckLoginUtils.checkLogin(context, () -> { if (listener != null) { listener.onCommentCallback(commentEntity); } else if (!TextUtils.isEmpty(id)) { context.startActivity(MessageDetailActivity.getMessageDetailIntent(context, commentEntity, id)); } else { Utils.toast(context, "缺少关键属性"); } }); break; case "复制": copyText(commentEntity.getContent(), context); break; case "举报": CheckLoginUtils.checkLogin(context, () -> showAnswerReportDialog(answerId, commentEntity, context)); break; case "查看对话": if (TextUtils.isEmpty(articleId)) { context.startActivity(CommentDetailActivity.getAnswerCommentIntent(context, commentEntity.getId(), answerId)); } else { context.startActivity(CommentDetailActivity.getCommunityArticleCommentIntent(context, articleId, commentEntity.getId(), articleCommunityId)); } break; } }); } dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(container); dialog.show(); } private static void showAnswerReportDialog(final String answerId, final CommentEntity commentEntity, final Context context) { final String[] arrReportType = new String[]{"垃圾广告营销", "恶意攻击谩骂", "淫秽色情信息", "违法有害信息", "其它"}; int widthPixels = context.getResources().getDisplayMetrics().widthPixels; final Dialog reportTypeDialog = new Dialog(context); LinearLayout container = new LinearLayout(context); container.setOrientation(LinearLayout.VERTICAL); container.setPadding(0, DisplayUtils.dip2px(context, 12), 0, DisplayUtils.dip2px(context, 12)); container.setBackgroundColor(Color.WHITE); for (final String s : arrReportType) { TextView reportTypeTv = new TextView(context); reportTypeTv.setText(s); reportTypeTv.setTextSize(17); reportTypeTv.setTextColor(ContextCompat.getColor(context, R.color.title)); reportTypeTv.setBackgroundResource(R.drawable.textview_white_style); reportTypeTv.setLayoutParams(new LinearLayout.LayoutParams((widthPixels * 9) / 10, LinearLayout.LayoutParams.WRAP_CONTENT)); reportTypeTv.setPadding(DisplayUtils.dip2px(context, 20), DisplayUtils.dip2px(context, 12), 0, DisplayUtils.dip2px(context, 12)); container.addView(reportTypeTv); reportTypeTv.setOnClickListener(v -> { JSONObject jsonObject = new JSONObject(); try { jsonObject.put("reason", s); } catch (JSONException e) { e.printStackTrace(); } PostCommentUtils.postAnswerReportData(context, commentEntity.getId(), answerId, jsonObject.toString(), new PostCommentUtils.PostCommentListener() { @Override public void postSuccess(JSONObject response) { Utils.toast(context, "感谢您的举报"); } @Override public void postFailed(Throwable error) { Utils.toast(context, error.toString()); } }); reportTypeDialog.cancel(); }); } reportTypeDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); reportTypeDialog.setContentView(container); reportTypeDialog.show(); } private static void showReportTypeDialog(final CommentEntity commentEntity, final Context context) { final String[] arrReportType = new String[]{"垃圾广告营销", "恶意攻击谩骂", "淫秽色情信息", "违法有害信息", "其它"}; int widthPixels = context.getResources().getDisplayMetrics().widthPixels; final Dialog reportTypeDialog = new Dialog(context); LinearLayout container = new LinearLayout(context); container.setOrientation(LinearLayout.VERTICAL); container.setPadding(0, DisplayUtils.dip2px(context, 12), 0, DisplayUtils.dip2px(context, 12)); container.setBackgroundColor(Color.WHITE); for (final String s : arrReportType) { TextView reportTypeTv = new TextView(context); reportTypeTv.setText(s); reportTypeTv.setTextSize(17); reportTypeTv.setTextColor(ContextCompat.getColor(context, R.color.title)); reportTypeTv.setBackgroundResource(R.drawable.textview_white_style); reportTypeTv.setLayoutParams(new LinearLayout.LayoutParams((widthPixels * 9) / 10, LinearLayout.LayoutParams.WRAP_CONTENT)); reportTypeTv.setPadding(DisplayUtils.dip2px(context, 20), DisplayUtils.dip2px(context, 12), 0, DisplayUtils.dip2px(context, 12)); container.addView(reportTypeTv); reportTypeTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { JSONObject jsonObject = new JSONObject(); try { jsonObject.put("comment_id", commentEntity.getId()); jsonObject.put("reason", s); } catch (JSONException e) { e.printStackTrace(); } PostCommentUtils.addReportData(context, commentEntity.getId(), jsonObject.toString(), new PostCommentUtils.PostCommentListener() { @Override public void postSuccess(JSONObject response) { Utils.toast(context, "感谢您的举报"); } @Override public void postFailed(Throwable error) { Utils.toast(context, "举报失败,请检查网络设置"); } }); reportTypeDialog.cancel(); } }); } reportTypeDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); reportTypeDialog.setContentView(container); reportTypeDialog.show(); } public static void postVote(final Context context, final CommentEntity commentEntity, final TextView commentLikeCountTv, final ImageView commentLikeIv, final OnVoteListener listener) { CheckLoginUtils.checkLogin(context, () -> { if (commentLikeCountTv.getCurrentTextColor() == ContextCompat.getColor(context, R.color.theme)) { Utils.toast(context, "已经点过赞啦!"); return; } commentEntity.setVote(commentEntity.getVote() + 1); commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.theme)); commentLikeIv.setImageResource(R.drawable.ic_like_select); commentLikeCountTv.setText(String.valueOf(commentEntity.getVote())); commentLikeCountTv.setVisibility(View.VISIBLE); PostCommentUtils.addCommentVote(context, commentEntity.getId(), new PostCommentUtils.PostCommentListener() { @Override public void postSuccess(JSONObject response) { if (listener != null) { listener.onVote(); } } @Override public void postFailed(Throwable e) { commentEntity.setVote(commentEntity.getVote() - 1); commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.hint)); commentLikeIv.setImageResource(R.drawable.ic_like_unselect); commentLikeCountTv.setText(String.valueOf(commentEntity.getVote())); if (commentEntity.getVote() == 0) { commentLikeCountTv.setVisibility(View.GONE); } else { commentLikeCountTv.setVisibility(View.VISIBLE); } if (e instanceof HttpException) { HttpException exception = (HttpException) e; if (exception.code() == 403) { try { String detail = new JSONObject(exception.response().errorBody().string()).getString("detail"); if ("voted".equals(detail)) { Utils.toast(context, "已经点过赞啦!"); } } catch (Exception ex) { ex.printStackTrace(); } return; } } Utils.toast(context, "网络异常,点赞失败"); } }); }); } public static void postVoteToAnswerComment(final Context context, String answerId, String articleId, String articleCommunityId, final CommentEntity commentEntity, final TextView commentLikeCountTv, final ImageView commentLikeIv, final OnVoteListener listener) { CheckLoginUtils.checkLogin(context, () -> { if (commentLikeCountTv.getCurrentTextColor() == ContextCompat.getColor(context, R.color.theme)) { Utils.toast(context, "已经点过赞啦!"); return; } commentEntity.setVote(commentEntity.getVote() + 1); commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.theme)); commentLikeIv.setImageResource(R.drawable.ic_like_select); commentLikeCountTv.setText(String.valueOf(commentEntity.getVote())); commentLikeCountTv.setVisibility(View.VISIBLE); PostCommentUtils.voteAnswerComment(context, answerId, articleId, articleCommunityId, commentEntity.getId(), new PostCommentUtils.PostCommentListener() { @Override public void postSuccess(JSONObject response) { if (listener != null) { listener.onVote(); } } @Override public void postFailed(Throwable e) { commentEntity.setVote(commentEntity.getVote() - 1); commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.hint)); commentLikeIv.setImageResource(R.drawable.ic_like_unselect); commentLikeCountTv.setText(String.valueOf(commentEntity.getVote())); if (commentEntity.getVote() == 0) { commentLikeCountTv.setVisibility(View.GONE); } else { commentLikeCountTv.setVisibility(View.VISIBLE); } if (e instanceof HttpException) { HttpException exception = (HttpException) e; if (exception.code() == 403) { try { String detail = new JSONObject(exception.response().errorBody().string()).getString("detail"); if ("voted".equals(detail)) { Utils.toast(context, "已经点过赞啦!"); } } catch (Exception ex) { ex.printStackTrace(); } return; } } Utils.toast(context, "网络异常,点赞失败"); } }); }); } // 设置评论item 用户相关的view(点赞/头像/用户名) public static void setCommentUserView(Context mContext, CommentViewHolder holder, CommentEntity entity) { MeEntity userDataEntity = entity.getMe(); holder.commentLikeCountTv.setTextColor(ContextCompat.getColor(mContext, R.color.hint)); holder.commentLikeIv.setImageResource(R.drawable.ic_like_unselect); if (entity.getVote() == 0) { holder.commentLikeCountTv.setVisibility(View.GONE); } else { // 检查是否已点赞 if (userDataEntity != null && (userDataEntity.isCommentVoted() || userDataEntity.isAnswerCommentVoted())) { holder.commentLikeCountTv.setTextColor(ContextCompat.getColor(mContext, R.color.theme)); holder.commentLikeIv.setImageResource(R.drawable.ic_like_select); } holder.commentLikeCountTv.setVisibility(View.VISIBLE); holder.commentLikeCountTv.setText(NumberUtils.transSimpleCount(entity.getVote())); } //检查是否是自身评论 UserInfoEntity userInfo = UserManager.getInstance().getUserInfoEntity(); if (userDataEntity != null && userDataEntity.isCommentOwn() && userInfo != null) { if (entity.getMe() != null && entity.getMe().isAnswerOwn()) { holder.commentUserNameTv.setText(userInfo.getName() + "(作者)"); } else { holder.commentUserNameTv.setText(userInfo.getName()); } if (userInfo.getAuth() != null) { ImageUtils.display(holder.commentUserBadgeIv, userInfo.getAuth().getIcon()); } else { ImageUtils.display(holder.commentUserBadgeIv, ""); } ImageUtils.displayIcon(holder.commentUserIconDv, userInfo.getIcon()); } else { if (entity.getMe() != null && entity.getMe().isAnswerOwn()) { holder.commentUserNameTv.setText(entity.getUser().getName() + "(作者)"); } else { holder.commentUserNameTv.setText(entity.getUser().getName()); } if (entity.getUser().getAuth() != null) { ImageUtils.display(holder.commentUserBadgeIv, entity.getUser().getAuth().getIcon()); } else { ImageUtils.display(holder.commentUserBadgeIv, ""); } if (TextUtils.isEmpty(entity.getUser().getIcon())) { ImageUtils.display(holder.commentUserIconDv, R.drawable.user_default_icon_comment); } else { ImageUtils.displayIcon(holder.commentUserIconDv, entity.getUser().getIcon()); } } } //复制文字 public static void copyText(String copyContent, Context context) { ClipboardManager cmb = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); cmb.setText(copyContent); Utils.toast(context, "复制成功"); } public interface OnVoteListener { void onVote(); } }