package com.gh.common.util; import android.annotation.SuppressLint; import android.app.Dialog; import android.content.Context; import android.graphics.Color; 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 androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import com.gh.gamecenter.CommentDetailActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.CommentViewHolder; import com.gh.gamecenter.entity.CommentEntity; import com.gh.gamecenter.entity.MeEntity; import com.gh.gamecenter.entity.UserInfoEntity; import com.gh.gamecenter.manager.UserManager; import com.gh.gamecenter.retrofit.BiResponse; import com.gh.gamecenter.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; import com.halo.assistant.HaloApp; import com.lightgame.utils.Utils; import org.jetbrains.annotations.NotNull; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.lang.ref.WeakReference; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; 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.ResponseBody; import retrofit2.HttpException; /** * Created by khy on 2017/3/22. */ public class CommentUtils { public static void setCommentTime(TextView textView, long time) { textView.setText(getCommentTime(time)); } public static String getCommentTime(long timestamp) { SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd", Locale.getDefault()); try { long day = timestamp * 1000; String year = String.valueOf(Calendar.getInstance().get(Calendar.YEAR)); format.applyPattern("yyyy"); String currentYear = format.format(day); format.applyPattern("yyyyMMdd"); long today = format.parse(format.format(new Date())).getTime(); 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) { return "刚刚"; } else { return String.format(Locale.getDefault(), "%d分钟前", (int) (min / 60)); } } else { return String.format(Locale.getDefault(), "%d小时前", hour); } } else if (day >= today - 86400 * 1000 && day < today) { format.applyPattern("HH:mm"); return "昨天 "; } else if (day >= today - 86400 * 1000 * 7 && day < today - 86400 * 1000) { format.applyPattern("HH:mm"); long days = (today - day) / 86400000 + 1; return String.format(Locale.getDefault(), "%d天前 ", days); } else if (day < today - 86400 * 1000 * 7 && year.equals(currentYear)) { format.applyPattern("MM-dd"); return format.format(day); } else { format.applyPattern("yyyy-MM-dd"); return format.format(day); } } catch (ParseException e) { e.printStackTrace(); format.applyPattern("yyyy-MM-dd"); return format.format(timestamp * 1000); } } public static void showReportDialog(final CommentEntity commentEntity, final Context context, final boolean showConversation, final String patch) { 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("投诉"); 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 "复制": copyText(commentEntity.getContent(), context); break; case "投诉": CheckLoginUtils.checkLogin(context, patch + "-投诉", () -> 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(); } 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) { if (commentLikeCountTv.getCurrentTextColor() == ContextCompat.getColor(context, R.color.theme_font)) { ToastUtils.INSTANCE.showToast("已经点过赞啦!"); return; } commentEntity.setVote(commentEntity.getVote() + 1); commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.theme_font)); commentLikeIv.setImageResource(R.drawable.comment_vote_select); commentLikeCountTv.setText(NumberUtils.transSimpleCount(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.comment_vote_unselect); commentLikeCountTv.setText(NumberUtils.transSimpleCount(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)) { ToastUtils.INSTANCE.showToast("已经点过赞啦!"); } } catch (Exception ex) { ex.printStackTrace(); } return; } } Utils.toast(context, "网络异常,点赞失败"); } }); } public static void likeComment(final Context context, String answerId, String articleId, String articleCommunityId, String videoId, final CommentEntity commentEntity, final TextView commentLikeCountTv, final ImageView commentLikeIv, final OnVoteListener listener) { String entrance = "回答详情-评论-点赞"; if (TextUtils.isEmpty(articleId)) { entrance = "社区文章详情-评论-点赞"; } if (TextUtils.isEmpty(videoId)) { entrance = "视频流-评论-点赞"; } CheckLoginUtils.checkLogin(context, entrance, () -> { if (commentLikeCountTv.getCurrentTextColor() == ContextCompat.getColor(context, R.color.theme_font)) { ToastUtils.INSTANCE.showToast("已经点过赞啦!"); return; } commentEntity.setVote(commentEntity.getVote() + 1); commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.theme_font)); commentLikeIv.setImageResource(R.drawable.comment_vote_select); commentLikeCountTv.setText(NumberUtils.transSimpleCount(commentEntity.getVote())); commentLikeCountTv.setVisibility(View.VISIBLE); PostCommentUtils.likeComment(context, answerId, articleId, articleCommunityId, videoId, 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.comment_vote_unselect); commentLikeCountTv.setText(NumberUtils.transSimpleCount(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)) { ToastUtils.INSTANCE.showToast("已经点过赞啦!"); } } catch (Exception ex) { ex.printStackTrace(); } return; } } Utils.toast(context, "网络异常,点赞失败"); } }); }); } public static void voteVideoComment(final Context context, String answerId, String articleId, String articleCommunityId, String videoId, final CommentEntity commentEntity, final TextView commentLikeCountTv, final ImageView commentLikeIv, final OnVoteListener listener) { String entrance = "视频流-评论-点赞"; CheckLoginUtils.checkLogin(context, entrance, () -> { PostCommentUtils.likeComment(context, answerId, articleId, articleCommunityId, videoId, 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.comment_vote_unselect); commentLikeCountTv.setText(NumberUtils.transSimpleCount(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)) { ToastUtils.INSTANCE.showToast("已经点过赞啦!"); } } catch (Exception ex) { ex.printStackTrace(); } return; } } Utils.toast(context, "网络异常,点赞失败"); } }); }); } public static void unVoteVideoComment(final Context context, String videoId, final CommentEntity commentEntity, final TextView commentLikeCountTv, final ImageView commentLikeIv) { String entrance = "视频流-评论-取消点赞"; CheckLoginUtils.checkLogin(context, entrance, () -> { RetrofitManager.getInstance(context).getApi() .unVoteVideoComment(videoId, commentEntity.getId()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Response() { @Override public void onResponse(@Nullable ResponseBody response) { super.onResponse(response); } @Override public void onFailure(@Nullable HttpException e) { super.onFailure(e); commentEntity.setVote(commentEntity.getVote() + 1); commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.theme_font)); commentLikeIv.setImageResource(R.drawable.comment_vote_select); commentLikeCountTv.setText(NumberUtils.transSimpleCount(commentEntity.getVote())); commentLikeCountTv.setVisibility(View.VISIBLE); try { if (e != null && e.response().errorBody() != null) { ErrorHelper.handleError(context, e.response().errorBody().string(), false); } } catch (IOException ex) { ex.printStackTrace(); } } }); }); } // 设置评论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.comment_vote_unselect); if (userDataEntity == null || !userDataEntity.isCommentOwner()) { holder.replyLine.setVisibility(View.VISIBLE); holder.commentReply.setVisibility(View.VISIBLE); } else { holder.replyLine.setVisibility(View.GONE); holder.commentReply.setVisibility(View.GONE); } if (entity.getVote() == 0) { holder.commentLikeCountTv.setVisibility(View.GONE); } else { // 检查是否已点赞 if (userDataEntity != null && (userDataEntity.isCommentVoted())) { holder.commentLikeCountTv.setTextColor(ContextCompat.getColor(mContext, R.color.theme_font)); holder.commentLikeIv.setImageResource(R.drawable.comment_vote_select); } holder.commentLikeCountTv.setVisibility(View.VISIBLE); holder.commentLikeCountTv.setText(NumberUtils.transSimpleCount(entity.getVote())); } if (entity.getUser().getBadge() != null) { holder.userBadgeSdv.setVisibility(View.VISIBLE); holder.badgeNameTv.setVisibility(View.VISIBLE); ImageUtils.display(holder.userBadgeSdv, entity.getUser().getBadge().getIcon()); holder.badgeNameTv.setText(entity.getUser().getBadge().getName()); } else { holder.userBadgeSdv.setVisibility(View.GONE); holder.badgeNameTv.setVisibility(View.GONE); } //检查是否是自身评论 UserInfoEntity userInfo = UserManager.getInstance().getUserInfoEntity(); if (userDataEntity != null && userDataEntity.isCommentOwner() && userInfo != null) { if (entity.getMe() != null && entity.getMe().isContentOwner()) { holder.commentAuthorTv.setVisibility(View.VISIBLE); } else { holder.commentAuthorTv.setVisibility(View.GONE); } 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().isContentOwner()) { holder.commentAuthorTv.setVisibility(View.VISIBLE); } else { holder.commentAuthorTv.setVisibility(View.GONE); } 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()); } } } @SuppressLint("CheckResult") public static void isUserCommentedOnThisGame(String gameId, WeakReference> callback) { RetrofitManager.getInstance(HaloApp.getInstance().getApplication()) .getApi() .isUserCommentedOnThisGame(UserManager.getInstance().getUserId(), gameId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new BiResponse() { @Override public void onSuccess(ResponseBody data) { SimpleCallback cb = callback.get(); if (cb != null) { try { JSONObject object = new JSONObject(data.string()); cb.onCallback(object.getBoolean("status")); } catch (JSONException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } @Override public void onFailure(@NotNull Exception exception) { Utils.toast(HaloApp.getInstance().getApplication(), "网络异常"); } }); } //复制文字 public static void copyText(String copyContent, Context context) { ExtensionsKt.copyTextAndToast(copyContent, "复制成功"); } public interface OnVoteListener { void onVote(); } }