diff --git a/app/src/main/java/com/gh/common/view/CenterImageSpan.java b/app/src/main/java/com/gh/common/view/CenterImageSpan.java index e75e0b103d..132376700a 100644 --- a/app/src/main/java/com/gh/common/view/CenterImageSpan.java +++ b/app/src/main/java/com/gh/common/view/CenterImageSpan.java @@ -43,10 +43,12 @@ public class CenterImageSpan extends ImageSpan { float x, int top, int y, int bottom, Paint paint) { Drawable b = getDrawable(); canvas.save(); - int transY = 0; + int transY; transY = ((bottom - top) - b.getBounds().bottom) / 2 + top; canvas.translate(x, transY); - b.draw(canvas); + if (b.isVisible()) { + b.draw(canvas); + } canvas.restore(); } 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 7bf0827e59..118a1900ac 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,9 +1,11 @@ package com.gh.gamecenter.gamedetail.rating +import android.content.Context import android.graphics.Bitmap import android.graphics.Color import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable import android.net.Uri import android.text.SpannableStringBuilder import android.text.Spanned @@ -17,13 +19,6 @@ 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 @@ -41,6 +36,9 @@ import com.gh.gamecenter.gamedetail.rating.edit.RatingEditActivity.Companion.LAB import com.gh.gamecenter.gamedetail.rating.logs.CommentLogsActivity import com.gh.gamecenter.manager.UserManager import com.m7.imkfsdk.utils.DensityUtil +import com.squareup.picasso.MemoryPolicy +import com.squareup.picasso.NetworkPolicy +import com.squareup.picasso.Picasso import java.util.regex.Pattern class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseRecyclerViewHolder(binding.root) { @@ -79,62 +77,56 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR } if (commentData.replyData != null) { - val spanned = context.getString( - R.string.game_comment_reply_content, - commentData.replyData?.user?.name, - commentData.replyData?.content).fromHtml() - val contentSpan = TextHelper.getHighlightedSpannableStringThatIsWrappedInsideWrapper(context, spanned) - if (commentData.replyData!!.isService) { - contentBadge.visibility = View.VISIBLE - contentSpan.setSpan(LeadingMarginSpan.Standard(34F.dip2px(), 0), 0, contentSpan.length, 0) - } else { - contentBadge.visibility = View.GONE - contentSpan.setSpan(LeadingMarginSpan.Standard(0, 0), 0, contentSpan.length, 0) - } + var name = "${commentData.replyData?.user?.name} :${commentData.replyData?.content}" + var contentSpan = getSpan(context, name, commentData) + contentBadge.visibleIf(commentData.replyData!!.isService) replyContent.movementMethod = CustomLinkMovementMethod.getInstance() replyContent.highlightColor = Color.TRANSPARENT - //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() + Picasso.with(context).load(Uri.parse(commentData.replyData!!.user.badge?.icon)) +// Picasso.with(context).load(Uri.parse("https://resource.ghzs.com/image/badge/icon/5ddbcda4fae6af003008d517.png")) + .priority(Picasso.Priority.HIGH) + .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE) + .networkPolicy(NetworkPolicy.NO_CACHE, NetworkPolicy.NO_STORE) + .into(object : com.squareup.picasso.Target { + override fun onPrepareLoad(placeHolderDrawable: Drawable?) { - 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 + 1, commentData.replyData?.user?.name!!.length + 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) - contentSpan.setSpan(object : ClickableSpan() { - override fun updateDrawState(ds: TextPaint) { - super.updateDrawState(ds) - ds.isUnderlineText = false } - override fun onClick(widget: View) { - val key = when (path) { - "游戏详情:介绍" -> "游戏详情-玩家评论" - "游戏详情:评分" -> "游戏详情-评论列表" - "评论详情" -> "游戏评论详情" - else -> "" - } - MtaHelper.onEvent("进入徽章墙_用户记录", key, "${commentData.replyData?.user?.name}(${commentData.replyData?.user?.id})") - DirectUtils.directToBadgeWall(context, commentData.replyData!!.user.id, commentData.replyData!!.user.name, commentData.replyData!!.user.icon) + override fun onBitmapFailed(errorDrawable: Drawable?) { + } - }, commentData.replyData?.user?.name!!.length + 1, commentData.replyData?.user?.name!!.length + 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) - userName.movementMethod = LinkMovementMethod.getInstance() - replyContent.text = contentSpan - } - }, CallerThreadExecutor.getInstance()) + override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) { + 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 + 2, commentData.replyData?.user?.name!!.length + 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + contentSpan.setSpan(object : ClickableSpan() { + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.isUnderlineText = false + } + + override fun onClick(widget: View) { + val key = when (path) { + "游戏详情:介绍" -> "游戏详情-玩家评论" + "游戏详情:评分" -> "游戏详情-评论列表" + "评论详情" -> "游戏评论详情" + else -> "" + } + MtaHelper.onEvent("进入徽章墙_用户记录", key, "${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 + 2, commentData.replyData?.user?.name!!.length + 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + userName.movementMethod = CustomLinkMovementMethod.getInstance() + replyContent.text = contentSpan + } + }) } else { + name = "${commentData.replyData?.user?.name}:${commentData.replyData?.content}" + contentSpan = getSpan(context, name, commentData) replyContent.text = contentSpan } @@ -240,6 +232,21 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR } } + private fun getSpan(context: Context,name: String, commentData: RatingComment): SpannableStringBuilder { + val spanned = SpanBuilder(name) + .color(context, 0, commentData.replyData?.user?.name!!.length, R.color.text_3A3A3A) + .bold(0, commentData.replyData?.user?.name!!.length) + .build() + + val contentSpan = TextHelper.getHighlightedSpannableStringThatIsWrappedInsideWrapper(context, spanned) + if (commentData.replyData!!.isService) { + contentSpan.setSpan(LeadingMarginSpan.Standard(34F.dip2px(), 0), 0, contentSpan.length, 0) + } else { + contentSpan.setSpan(LeadingMarginSpan.Standard(0, 0), 0, contentSpan.length, 0) + } + return contentSpan + } + private fun showMorePopWindow(v: View, isMyRating: Boolean, clickListener: (String) -> Unit) { val contentList = if (isMyRating) arrayListOf("修改", "复制") else arrayListOf("投诉", "复制") 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 f3abe371f7..8d3890e8ae 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 @@ -5,22 +5,15 @@ import android.content.Intent import android.graphics.Bitmap import android.graphics.Color import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable import android.net.Uri import android.text.Spanned import android.text.TextPaint -import android.text.method.LinkMovementMethod import android.text.style.ClickableSpan import android.view.View import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView -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 @@ -29,6 +22,7 @@ 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.CustomLinkMovementMethod import com.gh.common.view.DrawableView import com.gh.download.DownloadManager import com.gh.gamecenter.GameDetailActivity @@ -48,6 +42,9 @@ import com.gh.gamecenter.manager.UserManager import com.lightgame.download.DownloadStatus import com.lightgame.utils.Utils import com.m7.imkfsdk.utils.DensityUtil +import com.squareup.picasso.MemoryPolicy +import com.squareup.picasso.NetworkPolicy +import com.squareup.picasso.Picasso class RatingReplyAdapter(context: Context, val entrance: String, @@ -247,44 +244,45 @@ class RatingReplyAdapter(context: Context, val parent = replyEntity.parent if (parent != null) { var replyName = "${replyEntity.user.name} 回复 ${parent.user.name}" - var replyNameSpannable = SpanBuilder(replyName).color(mContext, parent.user.name!!.length + 5, parent.user.name!!.length + 7, R.color.text_9a9a9a).build() - if (parent.user.badge != null) { - val imagePipeline = Fresco.getImagePipeline() - val imageRequest = ImageRequestBuilder - .newBuilderWithSource(Uri.parse(parent.user.badge.icon)) - .setProgressiveRenderingEnabled(true) - .build() + 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) { + Picasso.with(mContext).load(Uri.parse(replyEntity.user.badge.icon)) + .priority(Picasso.Priority.HIGH) + .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE) + .networkPolicy(NetworkPolicy.NO_CACHE, NetworkPolicy.NO_STORE) + .into(object:com.squareup.picasso.Target{ + override fun onPrepareLoad(placeHolderDrawable: Drawable?) { - val dataSource = imagePipeline.fetchDecodedImage(imageRequest, mContext) - 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), parent.user.name!!.length + 4, parent.user.name!!.length + 6, 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(mContext, replyEntity.user.id, replyEntity.user.name, replyEntity.user.icon) + override fun onBitmapFailed(errorDrawable: Drawable?) { + } - }, parent.user.name!!.length + 4, parent.user.name!!.length + 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) - userName.movementMethod=LinkMovementMethod.getInstance() - userName.text = replyNameSpannable - } - }, CallerThreadExecutor.getInstance()) + override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) { + 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(mContext, replyEntity.user.id, replyEntity.user.name, replyEntity.user.icon) + } + + }, replyEntity.user.name!!.length + 1, replyEntity.user.name!!.length + 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + userName.movementMethod= CustomLinkMovementMethod.getInstance() + userName.text = replyNameSpannable + } + }) } else { - replyName = "${replyEntity.user.name} 回复 ${parent.user.name}" - replyNameSpannable = SpanBuilder(replyName).color(mContext, parent.user.name!!.length + 1, parent.user.name!!.length + 3, R.color.text_9a9a9a).build() - userName.text = replyName + replyName = "${replyEntity.user.name} 回复 ${parent.user.name}" + replyNameSpannable = SpanBuilder(replyName).color(mContext, replyEntity.user.name!!.length + 1, replyEntity.user.name!!.length + 4, R.color.text_9a9a9a).build() + userName.text = replyNameSpannable } } else { userName.text = replyEntity.user.name