diff --git a/app/src/main/java/com/gh/common/util/CommentUtils.java b/app/src/main/java/com/gh/common/util/CommentUtils.java index 857cdef8b5..68bffaaff8 100644 --- a/app/src/main/java/com/gh/common/util/CommentUtils.java +++ b/app/src/main/java/com/gh/common/util/CommentUtils.java @@ -353,6 +353,16 @@ public class CommentUtils { 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) { diff --git a/app/src/main/java/com/gh/common/util/DirectUtils.kt b/app/src/main/java/com/gh/common/util/DirectUtils.kt index a7265e4376..6e7b026b12 100644 --- a/app/src/main/java/com/gh/common/util/DirectUtils.kt +++ b/app/src/main/java/com/gh/common/util/DirectUtils.kt @@ -438,7 +438,8 @@ object DirectUtils { /** * 跳转至徽章墙 */ - fun directToBadgeWall(context: Context, userId: String, name: String, icon: String) { + @JvmStatic + fun directToBadgeWall(context: Context, userId: String?, name: String?, icon: String?) { context.startActivity(WebActivity.getBadgeCenterIntent(context, userId, name, icon)) } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/util/SpanBuilder.kt b/app/src/main/java/com/gh/common/util/SpanBuilder.kt new file mode 100644 index 0000000000..9a927c3708 --- /dev/null +++ b/app/src/main/java/com/gh/common/util/SpanBuilder.kt @@ -0,0 +1,61 @@ +package com.gh.common.util + +import android.content.Context +import android.graphics.Typeface +import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.style.AbsoluteSizeSpan +import android.text.style.ForegroundColorSpan +import android.text.style.StrikethroughSpan +import android.text.style.StyleSpan +import androidx.annotation.DrawableRes +import androidx.core.content.ContextCompat +import com.gh.common.view.CenterImageSpan + +class SpanBuilder(content: String) { + private var spannableString: SpannableStringBuilder = SpannableStringBuilder(content) + + fun color(context: Context, start: Int, end: Int, colorRes: Int): SpanBuilder { + val colorSpan = ForegroundColorSpan(ContextCompat.getColor(context, colorRes)) + spannableString.setSpan(colorSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + return this + } + + fun size(start: Int, end: Int, dpSize: Int): SpanBuilder { + val s = AbsoluteSizeSpan(dpSize, true) + spannableString.setSpan(s, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + return this + } + + //删除线 + fun strikeThrough(start: Int, end: Int): SpanBuilder { + val strike = StrikethroughSpan() + spannableString.setSpan(strike, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + return this + } + + //加粗 + fun bold(start: Int, end: Int): SpanBuilder { + val styleSpan = StyleSpan(Typeface.BOLD) + spannableString.setSpan(styleSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + return this + } + + //正常字体 + fun normal(start: Int, end: Int): SpanBuilder { + val styleSpan = StyleSpan(Typeface.NORMAL) + spannableString.setSpan(styleSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + return this + } + + //添加图标 + fun image(context: Context, start: Int, end: Int, @DrawableRes res: Int): SpanBuilder { + val imageSpan = CenterImageSpan(context, res) + spannableString.setSpan(imageSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + return this + } + + fun build(): SpannableStringBuilder { + return spannableString + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/view/CenterImageSpan.java b/app/src/main/java/com/gh/common/view/CenterImageSpan.java new file mode 100644 index 0000000000..e75e0b103d --- /dev/null +++ b/app/src/main/java/com/gh/common/view/CenterImageSpan.java @@ -0,0 +1,53 @@ +package com.gh.common.view; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.text.style.ImageSpan; + +/** + * 图文中心对齐 + */ +public class CenterImageSpan extends ImageSpan { + public CenterImageSpan(Context context, int resourceId) { + super(context, resourceId); + } + public CenterImageSpan(Drawable drawable) { + super( drawable); + } + + public int getSize(Paint paint, CharSequence text, int start, int end, + Paint.FontMetricsInt fm) { + Drawable d = getDrawable(); + Rect rect = d.getBounds(); + if (fm != null) { + Paint.FontMetricsInt fmPaint = paint.getFontMetricsInt(); + int fontHeight = fmPaint.bottom - fmPaint.top; + int drHeight = rect.bottom - rect.top; + + int top = drHeight / 2 - fontHeight / 4; + int bottom = drHeight / 2 + fontHeight / 4; + + fm.ascent = -bottom; + fm.top = -bottom; + fm.bottom = top; + fm.descent = top; + } + return rect.right; + } + + @Override + public void draw(Canvas canvas, CharSequence text, int start, int end, + float x, int top, int y, int bottom, Paint paint) { + Drawable b = getDrawable(); + canvas.save(); + int transY = 0; + transY = ((bottom - top) - b.getBounds().bottom) / 2 + top; + canvas.translate(x, transY); + b.draw(canvas); + canvas.restore(); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/adapter/CommentDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/CommentDetailAdapter.java index 26b7cd2d31..6bdb6b3c9d 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/CommentDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/CommentDetailAdapter.java @@ -9,6 +9,8 @@ import com.gh.common.constant.ItemViewType; import com.gh.common.util.CheckLoginUtils; import com.gh.common.util.CommentUtils; import com.gh.common.util.DirectUtils; +import com.gh.common.util.ImageUtils; +import com.gh.common.util.MtaHelper; import com.gh.common.util.TextHelper; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.CommentViewHolder; @@ -159,6 +161,12 @@ public class CommentDetailAdapter extends BaseRecyclerAdapter { if (parent != null && !TextUtils.isEmpty(parent.getUser().getName())) { holder.quoteContainer.setVisibility(View.VISIBLE); holder.quoteAuthorTv.setText(String.format("@%s", parent.getUser().getName())); + if (parent.getUser().getBadge() != null) { + holder.quoteAuthorBadgeSdv.setVisibility(View.VISIBLE); + ImageUtils.display(holder.quoteAuthorBadgeSdv, parent.getUser().getBadge().getIcon()); + } else { + holder.quoteAuthorBadgeSdv.setVisibility(View.GONE); + } String content; if (parent.getActive()) { content = parent.getComment(); @@ -185,7 +193,15 @@ public class CommentDetailAdapter extends BaseRecyclerAdapter { holder.commentUserIconDv.setOnClickListener(v -> DirectUtils.directToHomeActivity(mContext, commentEntity.getUser().getId(), "", "文章-评论详情")); holder.commentUserNameTv.setOnClickListener(v -> DirectUtils.directToHomeActivity(mContext, commentEntity.getUser().getId(), "", "文章-评论详情")); - + holder.userBadgeSdv.setOnClickListener(v -> { + MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-查看对话", commentEntity.getUser().getName() + "(" + commentEntity.getUser().getId() + ")"); + DirectUtils.directToBadgeWall(mContext, commentEntity.getUser().getId(), commentEntity.getUser().getName(), commentEntity.getUser().getIcon()); + }); + holder.badgeNameTv.setOnClickListener(v -> holder.userBadgeSdv.performClick()); + holder.quoteAuthorBadgeSdv.setOnClickListener(v -> { + MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-查看对话", parent.getUser().getName() + "(" + parent.getUser().getId() + ")"); + DirectUtils.directToBadgeWall(mContext, parent.getUser().getId(), parent.getUser().getName(), parent.getUser().getIcon()); + }); if (commentEntity.getPriority() != 0) { holder.commentBadge.setVisibility(View.VISIBLE); } else { diff --git a/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java index f081f228d5..d4cc215b93 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java @@ -18,6 +18,7 @@ import com.gh.common.util.DirectUtils; import com.gh.common.util.DisplayUtils; import com.gh.common.util.EntranceUtils; import com.gh.common.util.ImageUtils; +import com.gh.common.util.MtaHelper; import com.gh.common.util.NewsUtils; import com.gh.common.util.NumberUtils; import com.gh.common.util.StringUtils; @@ -363,6 +364,12 @@ public class MessageDetailAdapter extends BaseRecyclerAdapter { if (parent != null && !TextUtils.isEmpty(parent.getUser().getName())) { holder.quoteContainer.setVisibility(View.VISIBLE); holder.quoteAuthorTv.setText(String.format("@%s", parent.getUser().getName())); + if (parent.getUser().getBadge() != null) { + holder.quoteAuthorBadgeSdv.setVisibility(View.VISIBLE); + ImageUtils.display(holder.quoteAuthorBadgeSdv, parent.getUser().getBadge().getIcon()); + } else { + holder.quoteAuthorBadgeSdv.setVisibility(View.GONE); + } String content; if (parent.getActive()) { content = parent.getComment(); @@ -411,6 +418,16 @@ public class MessageDetailAdapter extends BaseRecyclerAdapter { holder.commentUserNameTv.setOnClickListener(v -> DirectUtils.directToHomeActivity(mContext, finalCommentEntity.getUser().getId(), mEntrance, "文章-评论详情")); holder.commentUserIconDv.setOnClickListener(v -> DirectUtils.directToHomeActivity(mContext, finalCommentEntity.getUser().getId(), mEntrance, "文章-评论详情")); + holder.userBadgeSdv.setOnClickListener(v -> { + MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-评论列表", finalCommentEntity.getUser().getName() + "(" + finalCommentEntity.getUser().getId() + ")"); + DirectUtils.directToBadgeWall(mContext, finalCommentEntity.getUser().getId(), finalCommentEntity.getUser().getName(), finalCommentEntity.getUser().getIcon()); + }); + holder.badgeNameTv.setOnClickListener(v -> holder.userBadgeSdv.performClick()); + holder.quoteAuthorBadgeSdv.setOnClickListener(v -> { + MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-评论列表", parent.getUser().getName() + "(" + parent.getUser().getId() + ")"); + DirectUtils.directToBadgeWall(mContext, parent.getUser().getId(), parent.getUser().getName(), parent.getUser().getIcon()); + }); + if (commentEntity.getPriority() != 0) { holder.commentBadge.setVisibility(View.VISIBLE); } else { diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/CommentViewHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/CommentViewHolder.java index 479f2026da..9977656e18 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/CommentViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/CommentViewHolder.java @@ -44,6 +44,13 @@ public class CommentViewHolder extends BaseRecyclerViewHolder { @BindView(R.id.comment_quote_content_tv) public TextView quoteContentTv; + @BindView(R.id.sdv_user_badge) + public SimpleDraweeView userBadgeSdv; + @BindView(R.id.tv_badge_name) + public TextView badgeNameTv; + @BindView(R.id.sdv_quote_author_badge) + public SimpleDraweeView quoteAuthorBadgeSdv; + public CommentViewHolder(View itemView) { super(itemView); } diff --git a/app/src/main/java/com/gh/gamecenter/amway/AmwayAdapter.kt b/app/src/main/java/com/gh/gamecenter/amway/AmwayAdapter.kt index 4fcd93c2c3..e49fc734a2 100644 --- a/app/src/main/java/com/gh/gamecenter/amway/AmwayAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/amway/AmwayAdapter.kt @@ -1,6 +1,7 @@ package com.gh.gamecenter.amway import android.content.Context +import android.view.View import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.databinding.DataBindingUtil @@ -207,6 +208,18 @@ class AmwayAdapter(context: Context, private var mViewModel: AmwayViewModel, pri } } } + + if (amway.comment.user.badge != null) { + binding.sdvUserBadge.visibility = View.VISIBLE + ImageUtils.display(binding.sdvUserBadge, amway.comment.user.badge!!.icon) + } else { + binding.sdvUserBadge.visibility = View.GONE + } + + binding.sdvUserBadge.setOnClickListener { + MtaHelper.onEvent("进入徽章墙_用户记录", "安利墙", "${amway.comment.user.name}(${amway.comment.user.id})") + DirectUtils.directToBadgeWall(context, amway.comment.user.id, amway.comment.user.name, amway.comment.user.icon) + } } } diff --git a/app/src/main/java/com/gh/gamecenter/entity/ArticleCommentParent.kt b/app/src/main/java/com/gh/gamecenter/entity/ArticleCommentParent.kt index 1b5b682fa0..c6302d03b0 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/ArticleCommentParent.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/ArticleCommentParent.kt @@ -1,6 +1,7 @@ package com.gh.gamecenter.entity import android.os.Parcelable +import com.google.gson.annotations.SerializedName import kotlinx.android.parcel.Parcelize @Parcelize @@ -9,6 +10,11 @@ data class ArticleCommentParent(val user: User = User(), val comment: String = "") : Parcelable @Parcelize -data class User(val name: String = "") : Parcelable +data class User( + @SerializedName("_id") + val id: String = "", + val name: String = "", + val icon: String = "", + val badge: Badge? = null) : Parcelable diff --git a/app/src/main/java/com/gh/gamecenter/entity/FollowersOrFansEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/FollowersOrFansEntity.kt index c452f3e25a..2d65672b9a 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/FollowersOrFansEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/FollowersOrFansEntity.kt @@ -9,7 +9,8 @@ data class FollowersOrFansEntity( val name: String = "", val count: Count = Count(), val me: MeEntity = MeEntity(), - val auth: Auth = Auth()) { + val auth: Auth = Auth(), + val badge: Badge? = null) { data class Count( val vote: Int = 0, diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingCommentItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingCommentItemViewHolder.kt index 937078d412..6f6406abc7 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingCommentItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingCommentItemViewHolder.kt @@ -1,7 +1,10 @@ package com.gh.gamecenter.gamedetail.rating +import android.graphics.Bitmap import android.graphics.Color +import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.ColorDrawable +import android.net.Uri import android.text.SpannableStringBuilder import android.text.Spanned import android.text.TextPaint @@ -14,10 +17,18 @@ import android.widget.LinearLayout import android.widget.PopupWindow import android.widget.TextView import androidx.core.content.ContextCompat +import com.facebook.common.executors.CallerThreadExecutor +import com.facebook.common.references.CloseableReference +import com.facebook.datasource.DataSource +import com.facebook.drawee.backends.pipeline.Fresco +import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber +import com.facebook.imagepipeline.image.CloseableImage +import com.facebook.imagepipeline.request.ImageRequestBuilder import com.gh.base.BaseActivity import com.gh.base.BaseRecyclerViewHolder import com.gh.common.constant.Constants import com.gh.common.util.* +import com.gh.common.view.CenterImageSpan import com.gh.common.view.CustomLinkMovementMethod import com.gh.common.view.DrawableView import com.gh.gamecenter.R @@ -29,6 +40,7 @@ import com.gh.gamecenter.gamedetail.rating.edit.RatingEditActivity import com.gh.gamecenter.gamedetail.rating.edit.RatingEditActivity.Companion.LABEL_REGEX import com.gh.gamecenter.gamedetail.rating.logs.CommentLogsActivity import com.gh.gamecenter.manager.UserManager +import com.m7.imkfsdk.utils.DensityUtil import java.util.regex.Pattern class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseRecyclerViewHolder(binding.root) { @@ -56,6 +68,16 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR time.setTextColor(context.resources.getColor(R.color.tag_orange)) } + if (commentData.user.badge != null) { + binding.sdvUserBadge.visibility = View.VISIBLE + binding.tvBadgeName.visibility = View.VISIBLE + ImageUtils.display(binding.sdvUserBadge, commentData.user.badge.icon) + binding.tvBadgeName.text = commentData.user.badge.name + } else { + binding.sdvUserBadge.visibility = View.GONE + binding.tvBadgeName.visibility = View.GONE + } + if (commentData.replyData != null) { val spanned = context.getString( R.string.game_comment_reply_content, @@ -71,7 +93,48 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR } replyContent.movementMethod = CustomLinkMovementMethod.getInstance() replyContent.highlightColor = Color.TRANSPARENT - replyContent.text = contentSpan + //replyContent.text = contentSpan + + if (commentData.replyData!!.user.badge != null) { + val imagePipeline = Fresco.getImagePipeline() + val imageRequest = ImageRequestBuilder + .newBuilderWithSource(Uri.parse(commentData.replyData!!.user.badge?.icon)) + .setProgressiveRenderingEnabled(true) + .build() + + val dataSource = imagePipeline.fetchDecodedImage(imageRequest, context) + dataSource.subscribe(object : BaseBitmapDataSubscriber() { + override fun onFailureImpl(dataSource: DataSource>?) { + + } + + override fun onNewResultImpl(bitmap: Bitmap?) { + val bitmapDrawable = BitmapDrawable(context.resources, bitmap) + bitmapDrawable.setBounds(0, 0, DensityUtil.dip2px(16F), DensityUtil.dip2px(16F)) + contentSpan.setSpan(CenterImageSpan(bitmapDrawable), commentData.replyData?.user?.name!!.length, commentData.replyData?.user?.name!!.length + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + contentSpan.setSpan(object : ClickableSpan() { + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.isUnderlineText = false + } + + override fun onClick(widget: View) { + when (path) { + "游戏详情:介绍" -> MtaHelper.onEvent("进入徽章墙_用户记录", "游戏详情-玩家评论", "${commentData.replyData?.user?.name}(${commentData.replyData?.user?.id})") + "游戏详情:评分" -> MtaHelper.onEvent("进入徽章墙_用户记录", "游戏详情-评论列表", "${commentData.replyData?.user?.name}(${commentData.replyData?.user?.id})") + "评论详情" -> MtaHelper.onEvent("进入徽章墙_用户记录", "游戏评论详情", "${commentData.replyData?.user?.name}(${commentData.replyData?.user?.id})") + } + DirectUtils.directToBadgeWall(context, commentData.replyData!!.user.id, commentData.replyData!!.user.name, commentData.replyData!!.user.icon) + } + + }, commentData.replyData?.user?.name!!.length, commentData.replyData?.user?.name!!.length + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + replyContent.text = contentSpan + } + }, CallerThreadExecutor.getInstance()) + } else { + replyContent.text = contentSpan + } + } if (game != null && game.getApk().size > 0 && game.getApk()[0].version == commentData.gameVersion) { @@ -102,6 +165,16 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR DirectUtils.directToHomeActivity(context, commentData.user.id, entrance, path) } + binding.sdvUserBadge.setOnClickListener { + when (path) { + "游戏详情:介绍" -> MtaHelper.onEvent("进入徽章墙_用户记录", "游戏详情-玩家评论", "${commentData.user.name}(${commentData.user.id})") + "游戏详情:评分" -> MtaHelper.onEvent("进入徽章墙_用户记录", "游戏详情-评论列表", "${commentData.user.name}(${commentData.user.id})") + "评论详情" -> MtaHelper.onEvent("进入徽章墙_用户记录", "游戏评论详情", "${commentData.user.name}(${commentData.user.id})") + } + DirectUtils.directToBadgeWall(context, commentData.user.id, commentData.user.name, commentData.user.icon) + } + binding.tvBadgeName.performClick() + more.setOnClickListener { showMorePopWindow(it, commentData.user.id == UserManager.getInstance().userId) { text -> when (text) { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt index 10299511f7..c26094a343 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt @@ -2,11 +2,25 @@ package com.gh.gamecenter.gamedetail.rating import android.content.Context import android.content.Intent +import android.graphics.Bitmap import android.graphics.Color +import android.graphics.drawable.BitmapDrawable +import android.net.Uri +import android.text.Spanned +import android.text.TextPaint +import android.text.style.ClickableSpan import android.view.View import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView +import anet.channel.util.Utils.context +import com.facebook.common.executors.CallerThreadExecutor +import com.facebook.common.references.CloseableReference +import com.facebook.datasource.DataSource +import com.facebook.drawee.backends.pipeline.Fresco +import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber +import com.facebook.imagepipeline.image.CloseableImage +import com.facebook.imagepipeline.request.ImageRequestBuilder import com.gh.base.BaseActivity import com.gh.base.BaseRecyclerViewHolder import com.gh.common.constant.Config @@ -14,6 +28,7 @@ import com.gh.common.constant.Constants import com.gh.common.constant.ItemViewType import com.gh.common.repository.ReservationRepository import com.gh.common.util.* +import com.gh.common.view.CenterImageSpan import com.gh.common.view.DrawableView import com.gh.download.DownloadManager import com.gh.gamecenter.GameDetailActivity @@ -32,6 +47,7 @@ import com.gh.gamecenter.manager.PackagesManager import com.gh.gamecenter.manager.UserManager import com.lightgame.download.DownloadStatus import com.lightgame.utils.Utils +import com.m7.imkfsdk.utils.DensityUtil class RatingReplyAdapter(context: Context, val entrance: String, @@ -230,12 +246,56 @@ class RatingReplyAdapter(context: Context, ?: "", copyClickedText = true) val parent = replyEntity.parent if (parent != null) { - userName.text = mContext.getString( - R.string.game_comment_reply_name, - replyEntity.user.name, - parent.user.name).fromHtml() + var replyName = "${replyEntity.user.name} 回复 ${parent.user.name}" + var replyNameSpannable = SpanBuilder(replyName).color(mContext, replyEntity.user.name!!.length + 4, replyEntity.user.name!!.length + 6, R.color.text_9a9a9a).build() + if (replyEntity.user.badge != null) { + val imagePipeline = Fresco.getImagePipeline() + val imageRequest = ImageRequestBuilder + .newBuilderWithSource(Uri.parse(replyEntity.user.badge.icon)) + .setProgressiveRenderingEnabled(true) + .build() + + val dataSource = imagePipeline.fetchDecodedImage(imageRequest, context) + dataSource.subscribe(object : BaseBitmapDataSubscriber() { + override fun onFailureImpl(dataSource: DataSource>?) { + + } + + override fun onNewResultImpl(bitmap: Bitmap?) { + val bitmapDrawable = BitmapDrawable(mContext.resources, bitmap) + bitmapDrawable.setBounds(0, 0, DensityUtil.dip2px(16F), DensityUtil.dip2px(16F)) + replyNameSpannable.setSpan(CenterImageSpan(bitmapDrawable), replyEntity.user.name!!.length + 1, replyEntity.user.name!!.length + 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + replyNameSpannable.setSpan(object : ClickableSpan() { + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.isUnderlineText = false + } + + override fun onClick(widget: View) { + MtaHelper.onEvent("进入徽章墙_用户记录", "游戏评论详情", "${replyEntity.user.name}(${replyEntity.user.id})") + DirectUtils.directToBadgeWall(context, replyEntity.user.id, replyEntity.user.name, replyEntity.user.icon) + } + + }, replyEntity.user.name!!.length + 1, replyEntity.user.name!!.length + 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + userName.text = replyNameSpannable + } + }, CallerThreadExecutor.getInstance()) + } else { + replyName = "${replyEntity.user.name} 回复 ${parent.user.name}" + replyNameSpannable = SpanBuilder(replyName).color(mContext, replyEntity.user.name!!.length + 1, replyEntity.user.name!!.length + 3, R.color.text_9a9a9a).build() + userName.text = replyName + } } else { userName.text = replyEntity.user.name + if (replyEntity.user.badge != null) { + sdvUserBadge.visibility = View.VISIBLE + tvBadgeName.visibility = View.VISIBLE + ImageUtils.display(sdvUserBadge, replyEntity.user.badge.icon) + tvBadgeName.text = replyEntity.user.badge.name + } else { + sdvUserBadge.visibility = View.GONE + tvBadgeName.visibility = View.GONE + } } vote.setOnClickListener { mContext.ifLogin("游戏详情-评分-评论详情-点赞评论") { diff --git a/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java index de21b37df5..dad1159166 100644 --- a/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java @@ -32,6 +32,7 @@ import com.gh.common.util.DirectUtils; import com.gh.common.util.DisplayUtils; import com.gh.common.util.EntranceUtils; import com.gh.common.util.ImageUtils; +import com.gh.common.util.MtaHelper; import com.gh.common.util.NewsUtils; import com.gh.common.util.NumberUtils; import com.gh.common.util.RandomUtils; @@ -552,14 +553,20 @@ public class NewsDetailAdapter extends BaseRecyclerAdapter { viewHolder.commentLikeCountTv.setText(NumberUtils.transSimpleCount(commentEntity.getVote())); holder.list.addView(contentView); - + TextHelper.highlightTextThatIsWrappedInsideWrapperByDefault( - viewHolder.commentContentTv, - commentEntity.getContent()); + viewHolder.commentContentTv, + commentEntity.getContent()); ArticleCommentParent parent = commentEntity.getParent(); if (parent != null && !TextUtils.isEmpty(parent.getUser().getName())) { viewHolder.quoteContainer.setVisibility(View.VISIBLE); viewHolder.quoteAuthorTv.setText(String.format("@%s", parent.getUser().getName())); + if (commentEntity.getParentUser() != null) { + viewHolder.quoteAuthorBadgeSdv.setVisibility(View.VISIBLE); + ImageUtils.display(viewHolder.quoteAuthorBadgeSdv, commentEntity.getParentUser().getUser().getBadge().getIcon()); + } else { + viewHolder.quoteAuthorBadgeSdv.setVisibility(View.GONE); + } String content; if (parent.getActive()) { content = parent.getComment(); @@ -568,10 +575,10 @@ public class NewsDetailAdapter extends BaseRecyclerAdapter { content = mContext.getString(R.string.comment_hide_hint); viewHolder.quoteContentTv.setTextColor(mContext.getResources().getColor(R.color.text_d5d5d5)); } - + TextHelper.highlightTextThatIsWrappedInsideWrapperByDefault( - viewHolder.quoteContentTv, - content); + viewHolder.quoteContentTv, + content); } else { viewHolder.quoteContainer.setVisibility(View.GONE); } @@ -599,6 +606,16 @@ public class NewsDetailAdapter extends BaseRecyclerAdapter { viewHolder.commentUserNameTv.setOnClickListener(v -> DirectUtils.directToHomeActivity(mContext, commentEntity.getUser().getId(), mEntrance, "文章-评论列表")); viewHolder.commentUserIconDv.setOnClickListener(v -> DirectUtils.directToHomeActivity(mContext, commentEntity.getUser().getId(), mEntrance, "文章-评论列表")); + + viewHolder.userBadgeSdv.setOnClickListener(v -> { + MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-评论详情", commentEntity.getUser().getName() + "(" + commentEntity.getUser().getId() + ")"); + DirectUtils.directToBadgeWall(mContext, commentEntity.getUser().getId(), commentEntity.getUser().getName(), commentEntity.getUser().getIcon()); + }); + viewHolder.badgeNameTv.setOnClickListener(v -> viewHolder.userBadgeSdv.performClick()); + viewHolder.quoteAuthorBadgeSdv.setOnClickListener(v -> { + MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-评论详情", commentEntity.getParentUser().getUser().getName() + "(" + commentEntity.getParentUser().getUser().getId() + ")"); + DirectUtils.directToBadgeWall(mContext, commentEntity.getParentUser().getUser().getId(), commentEntity.getParentUser().getUser().getName(), commentEntity.getParentUser().getUser().getIcon()); + }); } LinearLayout linearLayout = new LinearLayout(mContext); diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansAdapter.kt index f493539ce2..3480adcdb3 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansAdapter.kt @@ -8,6 +8,7 @@ import androidx.core.content.ContextCompat import com.gh.common.constant.ItemViewType import com.gh.common.util.DialogUtils import com.gh.common.util.DirectUtils +import com.gh.common.util.ImageUtils import com.gh.common.util.ifLogin import com.gh.gamecenter.R import com.gh.gamecenter.adapter.viewholder.FooterViewHolder @@ -19,6 +20,8 @@ import com.gh.gamecenter.manager.UserManager class FollowersOrFansAdapter(context: Context, val mViewModel: FollowersOrFansViewModel, val entrance: String) : ListAdapter(context) { + var onBadgeClickListener: ((entity: FollowersOrFansEntity) -> Unit)? = null + override fun areItemsTheSame(oldItem: FollowersOrFansEntity?, newItem: FollowersOrFansEntity?): Boolean { return oldItem?.id == newItem?.id } @@ -85,6 +88,22 @@ class FollowersOrFansAdapter(context: Context, val mViewModel: FollowersOrFansVi holder.itemView.setOnClickListener { DirectUtils.directToHomeActivity(mContext, entity.id, entrance, "个人主页-粉丝及关注页面") } + + if (entity.badge != null) { + holder.binding.sdvUserBadge.visibility = View.VISIBLE + holder.binding.tvBadgeName.visibility = View.VISIBLE + ImageUtils.display(holder.binding.sdvUserBadge, entity.badge.icon) + holder.binding.tvBadgeName.text = entity.badge.name + } else { + holder.binding.sdvUserBadge.visibility = View.GONE + holder.binding.tvBadgeName.visibility = View.GONE + } + + holder.binding.sdvUserBadge.setOnClickListener { v -> + onBadgeClickListener?.invoke(entity) + DirectUtils.directToBadgeWall(mContext, entity.id, entity.name, entity.icon) + } + holder.binding.tvBadgeName.setOnClickListener { v -> holder.binding.sdvUserBadge.performClick() } } else if (holder is FooterViewHolder) { holder.initFooterViewHolder(mViewModel, mIsLoading, mIsNetworkError, mIsOver) } diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansFragment.kt index 8bfd042148..ddc148569c 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansFragment.kt @@ -1,9 +1,10 @@ package com.gh.gamecenter.personalhome +import android.os.Bundle import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders -import android.os.Bundle import com.gh.common.util.EntranceUtils +import com.gh.common.util.MtaHelper import com.gh.gamecenter.baselist.ListFragment import com.gh.gamecenter.entity.FollowersOrFansEntity import com.gh.gamecenter.manager.UserManager @@ -56,6 +57,15 @@ class FollowersOrFansFragment : ListFragment 0) if (mUserHomeViewModel.badges.value?.isEmpty() == true && it > 0) { - mHomeBinding?.userBadgeList?.visibility = View.GONE + mHomeBinding?.userBadgeList?.visibility = View.INVISIBLE mHomeBinding?.userBadgeTips?.visibility = View.VISIBLE mHomeBinding?.userBadgeTips?.text = "有${it}枚徽章可领取" } else if (mUserHomeViewModel.badges.value?.isEmpty() == false) { @@ -295,6 +296,8 @@ class UserHomeFragment : NormalFragment() { userBadge.setOnClickListener { MtaHelper.onEvent("个人主页详情", "个人主页详情", if (mUserHomeViewModel.userId == UserManager.getInstance().userId) "我的徽章" else "TA的徽章") + MtaHelper.onEvent("进入徽章墙_用户记录", if (mUserHomeViewModel.userId == UserManager.getInstance().userId) "个人主页-我的徽章" else "个人主页-Ta的徽章", + "${mUserHomeViewModel.userInfo.value?.name}(${mUserHomeViewModel.userId})") DirectUtils.directToBadgeWall(requireContext(), mUserHomeViewModel.userId, mUserHomeViewModel.userInfo.value?.name ?: "", mUserHomeViewModel.userInfo.value?.icon ?: "") diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.kt index 7d249a342e..3b85e17176 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.kt @@ -1019,6 +1019,21 @@ class AnswerDetailFragment : NormalFragment() { mBinding.usernameTv.text = user.name ImageUtils.displayIcon(mBinding.userIconIv, user.icon) user.auth?.let { ImageUtils.display(mBinding.userBadgeIv, it.icon) } + + if (user.badge != null) { + mBinding.sdvUserBadge.visibility = View.VISIBLE + mBinding.tvBadgeName.visibility = View.VISIBLE + ImageUtils.display(mBinding.sdvUserBadge, user.badge.icon) + mBinding.tvBadgeName.text = user.badge.name + } else { + mBinding.sdvUserBadge.visibility = View.GONE + mBinding.tvBadgeName.visibility = View.GONE + } + mBinding.sdvUserBadge.setOnClickListener { + MtaHelper.onEvent("进入徽章墙_用户记录", "回答详情", "${user.name}(${user.id})") + DirectUtils.directToBadgeWall(requireContext(), user.id, user.name, user.icon) + } + mBinding.tvBadgeName.setOnClickListener { mBinding.sdvUserBadge.performClick() } } private fun initMenu() { diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt index a61fb3ff8e..4709999429 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt @@ -756,6 +756,21 @@ class ArticleDetailActivity : ToolBarActivity() { } } + if (mViewModel.detailEntity?.user?.badge != null) { + mBinding.sdvUserBadge.visibility = View.VISIBLE + mBinding.tvBadgeName.visibility = View.VISIBLE + ImageUtils.display(mBinding.sdvUserBadge, mViewModel.detailEntity?.user?.badge?.icon) + mBinding.tvBadgeName.text = mViewModel.detailEntity?.user?.badge?.name + }else{ + mBinding.sdvUserBadge.visibility = View.GONE + mBinding.tvBadgeName.visibility = View.GONE + } + mBinding.sdvUserBadge.setOnClickListener { + MtaHelper.onEvent("进入徽章墙_用户记录", "社区文章详情", "${mViewModel.detailEntity?.user?.name}(${mViewModel.detailEntity?.user?.id})") + DirectUtils.directToBadgeWall(this, mViewModel.detailEntity?.user?.id, mViewModel.detailEntity?.user?.name, mViewModel.detailEntity?.user?.icon) + } + mBinding.tvBadgeName.setOnClickListener { mBinding.sdvUserBadge.performClick() } + updateCommentable(mViewModel.detailEntity?.commentable!!) updateLikeView(mViewModel.detailEntity!!.me.isCommunityArticleVote, mViewModel.detailEntity!!.count.vote) updateDislikeView(mViewModel.detailEntity!!.me.isCommunityArticleOppose) diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentAdapter.kt index 7943b8448d..d568582c59 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentAdapter.kt @@ -6,10 +6,7 @@ import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.gh.common.constant.ItemViewType -import com.gh.common.util.CommentHelper -import com.gh.common.util.CommentUtils -import com.gh.common.util.DirectUtils -import com.gh.common.util.setTextWithHighlightedTextWrappedInsideWrapper +import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.adapter.OnCommentCallBackListener import com.gh.gamecenter.adapter.viewholder.AnswerCommentViewHolder @@ -92,6 +89,32 @@ class NewCommentAdapter(context: Context, } else { holder.quoteContainer.visibility = View.GONE } + if (parentUser != null) { + holder.quoteAuthorBadgeSdv.visibility = View.VISIBLE + ImageUtils.display(holder.quoteAuthorBadgeSdv, parentUser.user?.badge?.icon) + } else { + holder.quoteAuthorBadgeSdv.visibility = View.GONE + } + + val key = when (mEntrance) { + "(答案详情-评论列表)" -> "回答详情-评论管理" + "(文章详情-评论列表)" -> "社区文章详情-评论管理" + "(视频详情-评论列表)" -> "视频详情-评论管理" + "(答案-评论详情-查看对话)" -> "回答详情-评论管理-查看对话" + "(文章-评论详情-查看对话)" -> "社区文章详情-评论管理-查看对话" + "(视频-评论详情-查看对话)" -> "视频详情-评论管理-查看对话" + else -> "" + } + + holder.userBadgeSdv.setOnClickListener { v -> + MtaHelper.onEvent("进入徽章墙_用户记录", key, commentEntity.user.name + "(" + commentEntity.user.id + ")") + DirectUtils.directToBadgeWall(mContext, commentEntity.user.id, commentEntity.user.name, commentEntity.user.icon) + } + holder.badgeNameTv.setOnClickListener { v -> holder.userBadgeSdv.performClick() } + holder.quoteAuthorBadgeSdv.setOnClickListener { v -> + MtaHelper.onEvent("进入徽章墙_用户记录", key, commentEntity.parentUser!!.user!!.name + "(" + commentEntity.parentUser!!.user!!.id + ")") + DirectUtils.directToBadgeWall(mContext, commentEntity.parentUser!!.user!!.id, commentEntity.parentUser!!.user!!.name, commentEntity.parentUser!!.user!!.icon) + } holder.commentLikeIv.setOnClickListener { CommentUtils.likeComment(mContext, mViewModel.answerId, mViewModel.articleId, diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentConversationFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentConversationFragment.kt index 284c9093ab..f53c9d9db6 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentConversationFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentConversationFragment.kt @@ -28,9 +28,9 @@ class NewCommentConversationFragment : NewCommentFragment() { mEntrance = if (!TextUtils.isEmpty(mAnswerId)) { "(答案-评论详情-查看对话)" } else if (!TextUtils.isEmpty(mVideoId)) { - "(文章-评论详情-查看对话)" - } else { "(视频-评论详情-查看对话)" + } else { + "(文章-评论详情-查看对话)" } mAdapter = NewCommentAdapter(requireContext(), mViewModel, false, this, mEntrance) } diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/InviteEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/InviteEntity.kt index e814495c60..669f1953b5 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/InviteEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/InviteEntity.kt @@ -1,6 +1,7 @@ package com.gh.gamecenter.qa.entity import com.gh.gamecenter.entity.Auth +import com.gh.gamecenter.entity.Badge import com.gh.gamecenter.entity.MeEntity import com.google.gson.annotations.SerializedName @@ -18,7 +19,8 @@ data class InviteEntity(@SerializedName("_id") var isHeaderItem: Boolean? = false, var headerName: String? = "", @SerializedName("is_followers") - var isFollowers: Boolean? = false) { + var isFollowers: Boolean? = false, + val badge: Badge? = null) { data class Count(var answer: Int? = 0, var vote: Int? = 0) } diff --git a/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowAdapter.kt index 6366a4dcf2..ad52eb0a07 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowAdapter.kt @@ -6,9 +6,7 @@ import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.RecyclerView import com.gh.common.constant.ItemViewType -import com.gh.common.util.DirectUtils -import com.gh.common.util.NewsUtils -import com.gh.common.util.NumberUtils +import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.adapter.viewholder.FooterViewHolder import com.gh.gamecenter.baselist.ListAdapter @@ -84,6 +82,20 @@ class AskFollowAdapter(val context: Context, val viewModel: AskFollowViewModel) userDesc.visibility = View.GONE userCommand.text = UserHistoryAdapter.getUserCommand(historyEntity.type) } + if (historyEntity.user?.badge != null) { + sdvUserBadge.visibility = View.VISIBLE + tvBadgeName.visibility = View.VISIBLE + ImageUtils.display(sdvUserBadge, historyEntity.user?.badge?.icon) + tvBadgeName.text = historyEntity.user?.badge?.name + }else{ + sdvUserBadge.visibility = View.GONE + tvBadgeName.visibility = View.GONE + } + sdvUserBadge.setOnClickListener { + MtaHelper.onEvent("进入徽章墙_用户记录", "问答-关注", "${historyEntity?.user?.name}(${historyEntity?.user?.id})") + DirectUtils.directToBadgeWall(context, historyEntity?.user?.id, historyEntity?.user?.name, historyEntity?.user?.icon) + } + tvBadgeName.setOnClickListener { sdvUserBadge.performClick() } endDesc.text = NewsUtils.getFormattedTime(historyEntity.time) questionTitle.setOnClickListener { diff --git a/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowFragment.kt index 959f65b77e..aba0c7054d 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowFragment.kt @@ -117,6 +117,8 @@ class AskFollowFragment : ListFragment(R.id.questionsinvite_item_answercount) val userVoteCountTv = userView.findViewById(R.id.questionsinvite_item_votecount) val followTv = userView.findViewById(R.id.questionsinvite_item_invite) + val userBadgeSdv = userView.findViewById(R.id.sdv_user_badge) + val badgeNameTv = userView.findViewById(R.id.tv_badge_name) if (i == 0) { val twentyDp = DisplayUtils.dip2px(20F) @@ -132,6 +134,22 @@ class AskFollowFragment : ListFragment + MtaHelper.onEvent("进入徽章墙_用户记录","问答-关注-推荐列表","${user.name}(${user.id})") + DirectUtils.directToBadgeWall(requireContext(), user.id, user.name, user.icon) + } + badgeNameTv.setOnClickListener { v -> userBadgeSdv.performClick() } + followTv.setTextColor(ContextCompat.getColor(requireContext(), R.color.all_white)) followTv.text = "关注" followTv.setBackgroundResource(R.drawable.button_normal_style) diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/detail/AnswerViewHolder.java b/app/src/main/java/com/gh/gamecenter/qa/questions/detail/AnswerViewHolder.java index 82b30b5a6d..5ace3cff06 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/detail/AnswerViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/detail/AnswerViewHolder.java @@ -10,6 +10,7 @@ import com.gh.base.BaseRecyclerViewHolder; import com.gh.base.OnListClickListener; import com.gh.common.util.DirectUtils; import com.gh.common.util.ImageUtils; +import com.gh.common.util.MtaHelper; import com.gh.common.util.NewsUtils; import com.gh.common.util.NumberUtils; import com.gh.common.view.DrawableView; @@ -55,6 +56,10 @@ public class AnswerViewHolder extends BaseRecyclerViewHolder { TextView mVideoDuration; @BindView(R.id.ask_answer_item_video_play) View mVideoPlayIcon; + @BindView(R.id.sdv_user_badge) + SimpleDraweeView userBadgeSdv; + @BindView(R.id.tv_badge_name) + TextView badgeNameTv; public AnswerViewHolder(View itemView, OnListClickListener listClickListener) { super(itemView, listClickListener); @@ -80,6 +85,20 @@ public class AnswerViewHolder extends BaseRecyclerViewHolder { } else { ImageUtils.display(mBadgeIcon, ""); } + if (user.getBadge() != null) { + userBadgeSdv.setVisibility(View.VISIBLE); + badgeNameTv.setVisibility(View.VISIBLE); + ImageUtils.display(userBadgeSdv, user.getBadge().getIcon()); + badgeNameTv.setText(user.getBadge().getName()); + } else { + userBadgeSdv.setVisibility(View.GONE); + badgeNameTv.setVisibility(View.GONE); + } + userBadgeSdv.setOnClickListener(v -> { + MtaHelper.onEvent("进入徽章墙_用户记录", "问题详情", user.getName() + "(" + user.getId() + ")"); + DirectUtils.directToBadgeWall(context, user.getId(), user.getName(), user.getIcon()); + }); + badgeNameTv.setOnClickListener(v -> userBadgeSdv.performClick()); setAnswerImage(entity.getImages(), entity.getVideos()); if (entity.getTime() != null && entity.getTime() != 0) { mEndDescTv.setText(NewsUtils.getFormattedTime(entity.getTime())); diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/invite/QuestionsInviteAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/invite/QuestionsInviteAdapter.kt index 5eefb3f1c8..0ec090fcd0 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/invite/QuestionsInviteAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/invite/QuestionsInviteAdapter.kt @@ -69,7 +69,7 @@ open class QuestionsInviteAdapter(context: Context, } ItemViewType.ITEM_BODY -> { val entity = mEntityList[position] - (holder as QuestionsInviteViewHolder).initQuestionsInviteViewHolder(mContext, entity) + (holder as QuestionsInviteViewHolder).initQuestionsInviteViewHolder(mContext, entity, mPath) holder.itemView.setOnClickListener { DirectUtils.directToHomeActivity(mContext, entity.id, mEntrance, mPath) } } ItemViewType.ITEM_HEADER -> { diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/invite/QuestionsInviteViewHolder.java b/app/src/main/java/com/gh/gamecenter/qa/questions/invite/QuestionsInviteViewHolder.java index aa982d817b..890fa98a84 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/invite/QuestionsInviteViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/invite/QuestionsInviteViewHolder.java @@ -1,8 +1,6 @@ package com.gh.gamecenter.qa.questions.invite; -import android.annotation.SuppressLint; import android.content.Context; -import androidx.core.content.ContextCompat; import android.text.TextUtils; import android.view.View; import android.widget.TextView; @@ -10,12 +8,15 @@ import android.widget.TextView; import com.facebook.drawee.view.SimpleDraweeView; import com.gh.base.BaseRecyclerViewHolder; import com.gh.base.OnListClickListener; +import com.gh.common.util.DirectUtils; import com.gh.common.util.ImageUtils; +import com.gh.common.util.MtaHelper; import com.gh.common.util.NumberUtils; import com.gh.gamecenter.R; import com.gh.gamecenter.entity.MeEntity; import com.gh.gamecenter.qa.entity.InviteEntity; +import androidx.core.content.ContextCompat; import butterknife.BindView; /** @@ -36,12 +37,17 @@ public class QuestionsInviteViewHolder extends BaseRecyclerViewHolder { + String key = ""; + if (path.equals("问题详情-邀请列表")) { + key = "问题详情-邀请"; + } else if (path.equals("问题详情-邀请回答")) { + key = "邀请回答列表"; + } + MtaHelper.onEvent("进入徽章墙_用户记录", key, entity.getName() + "(" + entity.getId() + ")"); + DirectUtils.directToBadgeWall(context, entity.getId(), entity.getName(), entity.getIcon()); + }); + badgeNameTv.setOnClickListener(v -> userBadgeSdv.performClick()); } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/recommends/AskQuestionsRecommendsViewHolder.java b/app/src/main/java/com/gh/gamecenter/qa/recommends/AskQuestionsRecommendsViewHolder.java index cc8d4ef35f..a16ce0713c 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/recommends/AskQuestionsRecommendsViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/qa/recommends/AskQuestionsRecommendsViewHolder.java @@ -9,6 +9,7 @@ import com.gh.base.BaseRecyclerViewHolder; import com.gh.base.OnListClickListener; import com.gh.common.util.DirectUtils; import com.gh.common.util.ImageUtils; +import com.gh.common.util.MtaHelper; import com.gh.common.util.NewsUtils; import com.gh.common.util.NumberUtils; import com.gh.common.view.DrawableView; @@ -52,6 +53,10 @@ public class AskQuestionsRecommendsViewHolder extends BaseRecyclerViewHolder { + String key = ""; + if (path.equals("标签专栏-热门")) { + key = "问题标签详情-热门"; + } else if (path.equals("专栏-热门")) { + key = "问答-专栏详情-热门"; + } else if (path.equals("专栏-精华")) { + key = "问问答-专栏详情-精华"; + } else if (path.equals("问题推荐")) { + key = "问答-推荐"; + } + MtaHelper.onEvent("进入徽章墙_用户记录", key, user.getName() + "(" + user.getName() + ")"); + DirectUtils.directToBadgeWall(context, user.getId(), user.getName(), user.getIcon()); + }); + badgeNameTv.setOnClickListener(v -> userBadgeSdv.performClick()); + mAskTitle.setText(entity.getQuestions().getTitle()); setAnswerImage(entity.getImages(), entity.getVideos()); @@ -111,6 +141,22 @@ public class AskQuestionsRecommendsViewHolder extends BaseRecyclerViewHolder { + + MtaHelper.onEvent("进入徽章墙_用户记录", "问答-全部-文章", user.getName() + "(" + user.getName() + ")"); + DirectUtils.directToBadgeWall(context, user.getId(), user.getName(), user.getIcon()); + }); + badgeNameTv.setOnClickListener(v -> userBadgeSdv.performClick()); + mAskTitle.setText(entity.getTitle()); setAnswerImage(entity.getImages(), entity.getVideos()); @@ -123,7 +169,7 @@ public class AskQuestionsRecommendsViewHolder extends BaseRecyclerViewHolder images, List videos) { + private void setAnswerImage(List images, List videos) { if (videos.size() > 0) { CommunityVideoEntity videoEntity = videos.get(0); ImageUtils.display(mAskImg, videoEntity.getPoster()); diff --git a/app/src/main/java/com/gh/gamecenter/qa/subject/AskSubjectAdapter.java b/app/src/main/java/com/gh/gamecenter/qa/subject/AskSubjectAdapter.java index 0de8907916..56dd44e893 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/subject/AskSubjectAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/qa/subject/AskSubjectAdapter.java @@ -7,6 +7,8 @@ import android.view.ViewGroup; import com.gh.base.OnListClickListener; import com.gh.common.constant.ItemViewType; import com.gh.common.util.DirectUtils; +import com.gh.common.util.ImageUtils; +import com.gh.common.util.MtaHelper; import com.gh.common.util.NewsUtils; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; @@ -135,6 +137,21 @@ public class AskSubjectAdapter extends ListAdapter { mContext.startActivity(ArticleDetailActivity.getIntent(mContext, new CommunityEntity(entity.getCommunityId(), ""), entity.getId(), mEntrance, path, null)); } }); + + if (entity.getUser().getBadge() != null) { + binding.sdvUserBadge.setVisibility(View.VISIBLE); + binding.tvBadgeName.setVisibility(View.VISIBLE); + ImageUtils.display(binding.sdvUserBadge, entity.getUser().getBadge().getIcon()); + binding.tvBadgeName.setText(entity.getUser().getBadge().getName()); + } else { + binding.sdvUserBadge.setVisibility(View.GONE); + binding.tvBadgeName.setVisibility(View.GONE); + } + binding.sdvUserBadge.setOnClickListener(v -> { + MtaHelper.onEvent("进入徽章墙_用户记录", "问答专题详情", entity.getUser().getName() + "(" + entity.getUser().getName() + ")"); + DirectUtils.directToBadgeWall(mContext, entity.getUser().getId(), entity.getUser().getName(), entity.getUser().getIcon()); + }); + binding.tvBadgeName.setOnClickListener(v -> binding.sdvUserBadge.performClick()); } break; } diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt b/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt index 4629732b58..3ec4658697 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt @@ -65,6 +65,21 @@ class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: Attrib usernameTv.text = "@" + videoEntity.user.name videoTitleTv.text = videoEntity.title + if (videoEntity.user.badge != null) { + sdv_user_badge.visibility = View.VISIBLE + tv_badge_name.visibility = View.VISIBLE + ImageUtils.display(sdv_user_badge, videoEntity.user.badge.icon) + tv_badge_name.text = videoEntity.user.badge.name + } else { + sdv_user_badge.visibility = View.GONE + tv_badge_name.visibility = View.GONE + } + sdv_user_badge.setOnClickListener { + MtaHelper.onEvent("进入徽章墙_用户记录","视频详情","${videoEntity.user.name}(${videoEntity.user.id})") + DirectUtils.directToBadgeWall(context, videoEntity.user.id, videoEntity.user.name, videoEntity.user.icon) + } + tv_badge_name.setOnClickListener { sdv_user_badge.performClick() } + if (videoEntity.me.isVoted && UserManager.getInstance().isLoggedIn) { likeIv.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_video_detail_liked)) likeIv.setOnClickListener { diff --git a/app/src/main/java/com/halo/assistant/fragment/WebFragment.java b/app/src/main/java/com/halo/assistant/fragment/WebFragment.java index e983c8c14e..f76193c34b 100644 --- a/app/src/main/java/com/halo/assistant/fragment/WebFragment.java +++ b/app/src/main/java/com/halo/assistant/fragment/WebFragment.java @@ -193,9 +193,9 @@ public class WebFragment extends NormalFragment { setHasOptionsMenu(true); Bundle args = getArguments(); - + String webUrl = args.getString(EntranceUtils.KEY_URL); - + mIsBindWechat = args.getBoolean(KEY_IS_BIND_WECHAT, false); mIsTools = args.getBoolean(KEY_ISTOOLS, false); mNavigationTitle = args.getString(EntranceUtils.KEY_GAMENAME); @@ -228,6 +228,16 @@ public class WebFragment extends NormalFragment { return false; } } + + @Override + public void onPageFinished(WebView view, String url) { + super.onPageFinished(view, url); + String title = view.getTitle(); + if (TextUtils.isEmpty(newsId) && !mIsTools) { + mNavigationTitle = title; + setNavigationTitle(mNavigationTitle); + } + } }); // 页面里的下载跳转到自带浏览器 @@ -309,7 +319,7 @@ public class WebFragment extends NormalFragment { } return false; } - + @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(EBReuse bean) { // 是绑定微信页面时,绑定后刷新页面 diff --git a/app/src/main/res/layout/activity_article_detail.xml b/app/src/main/res/layout/activity_article_detail.xml index acedd06730..531a81a0af 100644 --- a/app/src/main/res/layout/activity_article_detail.xml +++ b/app/src/main/res/layout/activity_article_detail.xml @@ -100,6 +100,31 @@ app:layout_constraintLeft_toRightOf="@id/article_detail_usericon_container" app:layout_constraintTop_toBottomOf="@id/article_detail_line2" /> + + + + + + + + + + + + + + + + + + + android:layout_marginBottom="10dp"> @@ -66,20 +66,43 @@ android:textSize="12sp" tools:text="孙一峰" /> + + + + + tools:visibility="visible" /> @@ -124,23 +147,23 @@ android:id="@+id/comment_content" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_alignLeft="@+id/comment_username_and_time" android:layout_below="@id/comment_username_and_time" - android:layout_marginRight="10dp" + android:layout_alignLeft="@+id/comment_username_and_time" android:layout_marginTop="5dp" + android:layout_marginRight="10dp" android:lineSpacingExtra="3dp" android:textColor="@color/black" android:textSize="13sp" tools:text="星際爭霸與星際爭霸2的職業選手,電競戰隊Xteam的經理,美少女团体星際老男孩成員之一,還在杭州經營水產生意。" /> - + - + diff --git a/app/src/main/res/layout/followers_or_fans_item.xml b/app/src/main/res/layout/followers_or_fans_item.xml index a959c36936..35df941a60 100644 --- a/app/src/main/res/layout/followers_or_fans_item.xml +++ b/app/src/main/res/layout/followers_or_fans_item.xml @@ -45,7 +45,7 @@ + + + + + + - + android:orientation="horizontal" + android:gravity="center_vertical" + android:layout_marginTop="21dp"> + + + + + + + + diff --git a/app/src/main/res/layout/questionsinvite_item.xml b/app/src/main/res/layout/questionsinvite_item.xml index 7094db1613..b51b4a1310 100644 --- a/app/src/main/res/layout/questionsinvite_item.xml +++ b/app/src/main/res/layout/questionsinvite_item.xml @@ -1,13 +1,14 @@ - + + + + + + + + + - + + + + app:layout_constraintBottom_toBottomOf="@id/tv_badge_name" + app:layout_constraintLeft_toRightOf="@id/tv_badge_name" + app:layout_constraintTop_toTopOf="@id/tv_badge_name" /> %1$s 回复 ]]>%2$s - %1$s:]]>%2$s + %1$s ]]>:%2$s %1$s 在 %2$s]]> 发表了评论