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 235fc54238..cb1ae31803 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/CommentDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/CommentDetailAdapter.java @@ -14,6 +14,7 @@ import com.gh.common.util.DialogUtils; import com.gh.common.util.DirectUtils; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.CommentViewHolder; +import com.gh.gamecenter.common.constant.Constants; import com.gh.gamecenter.common.constant.ItemViewType; import com.gh.gamecenter.common.retrofit.Response; import com.gh.gamecenter.common.utils.ImageUtils; @@ -178,7 +179,12 @@ public class CommentDetailAdapter extends BaseRecyclerAdapter { holder.commentTimeTv.setText(holder.commentTimeTv.getText() + " · " + commentEntity.getSource().getRegion()); } - TextHelper.highlightTextThatIsWrappedInsideWrapperByDefault(holder.commentContentTv, commentEntity.getContent()); + TextHelper.highlightTextThatIsWrappedInsideWrapperByDefault( + holder.commentContentTv, + commentEntity.getContent(), + Constants.DEFAULT_TEXT_WRAPPER, + new TextHelper.DirectToWebViewHighlightedTextClick(mContext, "评论详情") + ); ArticleCommentParent parent = commentEntity.getParent(); if (parent != null && !TextUtils.isEmpty(parent.getUser().getName())) { holder.quoteContainer.setVisibility(View.VISIBLE); @@ -197,7 +203,12 @@ public class CommentDetailAdapter extends BaseRecyclerAdapter { content = mContext.getString(R.string.comment_hide_hint); holder.quoteContentTv.setTextColor(mContext.getResources().getColor(R.color.text_d5d5d5)); } - TextHelper.highlightTextThatIsWrappedInsideWrapperByDefault(holder.quoteContentTv, content); + TextHelper.highlightTextThatIsWrappedInsideWrapperByDefault( + holder.quoteContentTv, + content, + Constants.DEFAULT_TEXT_WRAPPER, + new TextHelper.DirectToWebViewHighlightedTextClick(mContext, "评论详情") + ); } else { holder.quoteContainer.setVisibility(View.GONE); } 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 e7ac07f66b..d250eefc88 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java @@ -25,6 +25,7 @@ import com.gh.gamecenter.ShareCardPicActivity; import com.gh.gamecenter.WebActivity; import com.gh.gamecenter.adapter.viewholder.CommentHeadViewHolder; import com.gh.gamecenter.adapter.viewholder.CommentViewHolder; +import com.gh.gamecenter.common.constant.Constants; import com.gh.gamecenter.common.constant.EntranceConsts; import com.gh.gamecenter.common.retrofit.JSONObjectResponse; import com.gh.gamecenter.common.retrofit.OkHttpCache; @@ -393,7 +394,12 @@ public class MessageDetailAdapter extends BaseRecyclerAdapter { return; } - TextHelper.highlightTextThatIsWrappedInsideWrapperByDefault(holder.commentContentTv, commentEntity.getContent()); + TextHelper.highlightTextThatIsWrappedInsideWrapperByDefault( + holder.commentContentTv, + commentEntity.getContent(), + Constants.DEFAULT_TEXT_WRAPPER, + new TextHelper.DirectToWebViewHighlightedTextClick(holder.commentContentTv.getContext(), "消息详情") + ); ArticleCommentParent parent = commentEntity.getParent(); if (parent != null && !TextUtils.isEmpty(parent.getUser().getName())) { holder.quoteContainer.setVisibility(View.VISIBLE); @@ -412,7 +418,12 @@ public class MessageDetailAdapter extends BaseRecyclerAdapter { content = mContext.getString(R.string.comment_hide_hint); holder.quoteContentTv.setTextColor(mContext.getResources().getColor(R.color.text_d5d5d5)); } - TextHelper.highlightTextThatIsWrappedInsideWrapperByDefault(holder.quoteContentTv, content); + TextHelper.highlightTextThatIsWrappedInsideWrapperByDefault( + holder.quoteContentTv, + content, + Constants.DEFAULT_TEXT_WRAPPER, + new TextHelper.DirectToWebViewHighlightedTextClick(holder.quoteContentTv.getContext(), "消息详情") + ); } else { holder.quoteContainer.setVisibility(View.GONE); } 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 3e860dd334..fc39fcb466 100644 --- a/app/src/main/java/com/gh/gamecenter/amway/AmwayAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/amway/AmwayAdapter.kt @@ -234,11 +234,14 @@ class AmwayAdapter( if (m.find()) { val contents = TextHelper.getCommentLabelSpannableStringBuilder(amway.comment.content, R.color.text_theme) - binding.amwayContentTv.setTextWithHighlightedTextWrappedInsideWrapper(contents, copyClickedText = true) + binding.amwayContentTv.setTextWithHighlightedTextWrappedInsideWrapper( + contents, + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick(context, "安利墙") + ) } else { binding.amwayContentTv.setTextWithHighlightedTextWrappedInsideWrapper( amway.comment.content, - copyClickedText = true + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick(context, "安利墙") ) } @@ -333,7 +336,11 @@ class AmwayAdapter( binding.sdvUserBadge.setOnClickListener { DialogUtils.showViewBadgeDialog(context, amway.comment.user.badge, object : ConfirmListener { override fun onConfirm() { - MtaHelper.onEvent("进入徽章墙_用户记录", "安利墙", "${amway.comment.user.name}(${amway.comment.user.id})") + MtaHelper.onEvent( + "进入徽章墙_用户记录", + "安利墙", + "${amway.comment.user.name}(${amway.comment.user.id})" + ) MtaHelper.onEvent("徽章中心", "进入徽章中心", "安利墙") DirectUtils.directToBadgeWall( context, diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailAdapter.kt index c3eb4d4552..56c8a2ea14 100644 --- a/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailAdapter.kt @@ -3,6 +3,7 @@ package com.gh.gamecenter.gamecollection.detail import android.content.Context import android.graphics.Bitmap import android.graphics.Canvas +import android.graphics.Color import android.graphics.drawable.BitmapDrawable import android.text.SpannableStringBuilder import android.text.TextUtils @@ -26,6 +27,7 @@ import com.gh.gamecenter.common.syncpage.SyncDataEntity import com.gh.gamecenter.common.syncpage.SyncFieldConstants import com.gh.gamecenter.common.syncpage.SyncPageRepository import com.gh.gamecenter.common.utils.* +import com.gh.gamecenter.common.view.CustomLinkMovementMethod import com.gh.gamecenter.common.view.DrawableView import com.gh.gamecenter.common.view.GridSpacingItemColorDecoration import com.gh.gamecenter.core.utils.MtaHelper @@ -227,7 +229,13 @@ open class GameCollectionDetailAdapter( ) } - contentTv.text = comment.content + contentTv.setTextWithHighlightedTextWrappedInsideWrapper( + text = comment.content ?: "", + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick( + binding.root.context, + mEntrance + ) + ) commentCountTv.text = mViewModel.getCommentText(comment.reply, "回复") } else { @@ -270,15 +278,30 @@ open class GameCollectionDetailAdapter( } else { "" } - + val commentText = TextHelper.getHighlightedSpannableStringThatIsWrappedInsideWrapper( + binding.contentTv.context, + comment.content ?: "", + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick( + binding.contentTv.context, + entrance = mEntrance + ) + ) contentTv.text = SpannableStringBuilder() .append(prefixSpan) .append(parentUserNameSpan) .append(authorSpan) .append(colonSpan) - .append(comment.content) + .append(commentText) + contentTv.movementMethod = CustomLinkMovementMethod.getInstance() + binding.contentTv.highlightColor = Color.TRANSPARENT } else { - contentTv.text = comment.content + contentTv.setTextWithHighlightedTextWrappedInsideWrapper( + text = comment.content ?: "", + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick( + binding.root.context, + mEntrance + ) + ) } } } @@ -482,17 +505,29 @@ open class GameCollectionDetailAdapter( binding.subCommentContainer.setRoundedColorBackground(R.color.ui_container_2, 5F) subCommentList?.firstOrNull()?.let { - binding.firstSubCommentTv.text = getSubCommentSpanned( - it.user.name, - if (it.user.id == ownerUserId) "作者" else "", - it.content + binding.firstSubCommentTv.setTextWithHighlightedTextWrappedInsideWrapper( + text = getSubCommentSpanned( + it.user.name, + if (it.user.id == ownerUserId) "作者" else "", + it.content + ), + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick( + binding.root.context, + mEntrance + ) ) } subCommentList?.secondOrNull()?.let { - binding.secondSubCommentTv.text = getSubCommentSpanned( - it.user.name, - if (it.user.id == ownerUserId) "作者" else "", - it.content + binding.secondSubCommentTv.setTextWithHighlightedTextWrappedInsideWrapper( + text = getSubCommentSpanned( + it.user.name, + if (it.user.id == ownerUserId) "作者" else "", + it.content + ), + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick( + binding.root.context, + mEntrance + ) ) } binding.subCommentContainer.setOnClickListener { @@ -517,7 +552,6 @@ open class GameCollectionDetailAdapter( val finalAuthor = author ?: "" val finalName = "$name " val colon = " :" - val nameSpan = SpanBuilder(finalName).color(mContext, 0, finalName.length, R.color.text_theme).build() val authorSpan = if (finalAuthor.isNotEmpty()) SpanBuilder(finalAuthor).image( diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt index 6738c06b74..431ba0258a 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt @@ -1,6 +1,7 @@ package com.gh.gamecenter.gamedetail.desc import android.annotation.SuppressLint +import android.content.ClipboardManager import android.content.Context import android.graphics.Color import android.graphics.drawable.ColorDrawable @@ -30,6 +31,7 @@ import com.gh.common.util.NewLogUtils import com.gh.gamecenter.GameNewsActivity import com.gh.gamecenter.R import com.gh.gamecenter.common.base.GlobalActivityManager +import com.gh.gamecenter.common.callback.SimpleCallback import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.entity.CommunityEntity import com.gh.gamecenter.common.entity.LinkEntity @@ -41,6 +43,7 @@ import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.common.view.divider.HorizontalDividerItemDecoration import com.gh.gamecenter.common.view.divider.VerticalDividerItemDecoration import com.gh.gamecenter.common.viewholder.FooterViewHolder +import com.gh.gamecenter.core.HaloApp.Companion.getInstance import com.gh.gamecenter.core.utils.* import com.gh.gamecenter.databinding.* import com.gh.gamecenter.entity.SubjectEntity @@ -57,6 +60,7 @@ import com.gh.gamecenter.gamedetail.fuli.kaifu.ServersCalendarActivity import com.gh.gamecenter.gamedetail.history.HistoryApkListActivity import com.gh.gamecenter.help.HelpAndFeedbackBridge import com.lightgame.adapter.BaseRecyclerAdapter +import com.lightgame.utils.Utils import org.greenrobot.eventbus.EventBus class DescAdapter( @@ -302,7 +306,12 @@ class DescAdapter( galleryRv.layoutManager = LinearLayoutManager(mContext, RecyclerView.HORIZONTAL, false) subjectAdapter = - GameHorizontalAdapter(mContext, subjectEntity, GameHorizontalListType.GameDetailHorizontalType, false) + GameHorizontalAdapter( + mContext, + subjectEntity, + GameHorizontalListType.GameDetailHorizontalType, + false + ) subjectAdapter.gameName = mGameName subjectAdapter.game = mViewModel.game subjectAdapter.gameId = mViewModel.gameId ?: "" @@ -997,11 +1006,15 @@ class DescAdapter( } else { shrankSpanned = TextHelper.getHighlightedSpannableStringThatIsWrappedInsideWrapper( mContext, - customColumn.desBrief ?: "" + customColumn.desBrief ?: "", + Constants.DEFAULT_TEXT_WRAPPER_2, + highlightedTextClickListener = TextHelper.CopyToClipboardHighlightedTextClick() ) expandedSpanned = TextHelper.getHighlightedSpannableStringThatIsWrappedInsideWrapper( mContext, - customColumn.des ?: "" + customColumn.des ?: "", + Constants.DEFAULT_TEXT_WRAPPER_2, + highlightedTextClickListener = TextHelper.CopyToClipboardHighlightedTextClick() ) setShrankTextAndExpandedText(shrankSpanned, expandedSpanned) } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescCommentsAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescCommentsAdapter.kt index 65d93c70ca..9b9da658a2 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescCommentsAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescCommentsAdapter.kt @@ -78,11 +78,14 @@ class DescCommentsAdapter( if (m.find()) { val contents = TextHelper.getCommentLabelSpannableStringBuilder(commentData.content, R.color.text_theme) - content.setTextWithHighlightedTextWrappedInsideWrapper(text = contents, copyClickedText = true) + content.setTextWithHighlightedTextWrappedInsideWrapper( + text = contents, + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick(mContext, path) + ) } else { content.setTextWithHighlightedTextWrappedInsideWrapper( text = commentData.content, - copyClickedText = true + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick(mContext, path) ) } if (commentData.user.badge != null) { @@ -108,6 +111,7 @@ class DescCommentsAdapter( NewsUtils.getFormattedTime(commentData.time) } } + commentData.isEditContent!! -> { time.setTextColor(ContextCompat.getColor(mContext, R.color.text_F56614)) time.text = if (commentData.ignore) { @@ -116,6 +120,7 @@ class DescCommentsAdapter( "${NewsUtils.getFormattedTime(commentData.time)} 已修改 >" } } + else -> { time.setTextColor(ContextCompat.getColor(mContext, R.color.text_F56614)) time.text = if (commentData.ignore) { @@ -204,6 +209,7 @@ class DescCommentsAdapter( .copyTextAndToast() MtaHelper.onEvent("游戏详情_新", "玩家评论_复制", mViewModel.game?.name) } + "修改" -> { MtaHelper.onEvent("游戏详情_新", "玩家评论_修改", mViewModel.game?.name) val intent = RatingEditActivity.getPatchIntent(mContext, mViewModel.game!!, commentData) @@ -214,6 +220,7 @@ class DescCommentsAdapter( position ) } + "投诉" -> { MtaHelper.onEvent("游戏详情_新", "玩家评论_投诉", mViewModel.game?.name) mContext.ifLogin(BaseActivity.mergeEntranceAndPath(mEntrance, path)) { @@ -229,6 +236,7 @@ class DescCommentsAdapter( } } } + "删除" -> { DialogHelper.showDeleteGameCommentDialog( mContext, @@ -273,7 +281,11 @@ class DescCommentsAdapter( holder.itemView.setOnClickListener { EventBus.getDefault().post(EBReuse(GameDetailFragment.SKIP_RATING)) MtaHelper.onEvent("游戏详情_新", "玩家评论_查看全部评论", gameName) - NewLogUtils.logGameDetailCommentClick(mViewModel.game?.name ?: "", mViewModel.game?.id ?: "", "查看全部评论") + NewLogUtils.logGameDetailCommentClick( + mViewModel.game?.name ?: "", + mViewModel.game?.id ?: "", + "查看全部评论" + ) } } } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/myrating/MyRatingAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/myrating/MyRatingAdapter.kt index 0771242592..7acc258a57 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/myrating/MyRatingAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/myrating/MyRatingAdapter.kt @@ -34,10 +34,12 @@ class MyRatingAdapter( view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false) FooterViewHolder(view) } + ItemViewType.ITEM_BODY -> { view = mLayoutInflater.inflate(R.layout.item_my_game_rating, parent, false) MyRatingViewHolder(ItemMyGameRatingBinding.bind(view)) } + else -> throw NullPointerException() } } @@ -69,12 +71,12 @@ class MyRatingAdapter( val contents = TextHelper.getCommentLabelSpannableStringBuilder(rating.content, R.color.text_theme) holder.binding.tvComment.setTextWithHighlightedTextWrappedInsideWrapper( text = contents, - copyClickedText = true + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick(mContext, mEntrance) ) } else { holder.binding.tvComment.setTextWithHighlightedTextWrappedInsideWrapper( text = rating.content, - copyClickedText = true + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick(mContext, mEntrance) ) } holder.binding.tvComment.setExpandCallback { @@ -123,7 +125,8 @@ class MyRatingAdapter( commentId = rating.id, showKeyboardIfReplyListIsEmpty = false, entrance = "我的游戏评论", - path = "") + path = "" + ) /* if(!rating.active){ intent = RatingReplyActivity.getIntent(mContext, rating.transformGameEntity(), rating.transformCommentEntity(), "我的游戏评论", "") }else if(!rating.game.active){ @@ -141,6 +144,7 @@ class MyRatingAdapter( return@OnLongClickListener true }) } + is FooterViewHolder -> { holder.initItemPadding() holder.initFooterViewHolder(mIsLoading, mIsNetworkError, mIsOver) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingAdapter.kt index e0e97dea88..aced32496a 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingAdapter.kt @@ -88,7 +88,7 @@ class RatingAdapter( } else -> { view = mLayoutInflater.inflate(R.layout.rating_comment_item, parent, false) - RatingCommentItemViewHolder(RatingCommentItemBinding.bind(view)) + RatingCommentItemViewHolder(RatingCommentItemBinding.bind(view), path) } } } @@ -174,7 +174,7 @@ class RatingAdapter( if (ratingData?.serviceComment != null) { includeServiceComment.commentItem.visibility = View.VISIBLE initRatingComment( - RatingCommentItemViewHolder(includeServiceComment), + RatingCommentItemViewHolder(includeServiceComment, path), ratingData?.serviceComment!!, headServiceCommentPosition ) @@ -183,7 +183,7 @@ class RatingAdapter( if (ratingData?.myComment != null) { includeMyComment.commentItem.visibility = View.VISIBLE initRatingComment( - RatingCommentItemViewHolder(includeMyComment), + RatingCommentItemViewHolder(includeMyComment, path), ratingData?.myComment!!, headMyCommentPosition ) 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 eb99e36af4..441972ce9b 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 @@ -44,7 +44,8 @@ import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import java.util.regex.Pattern -class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseRecyclerViewHolder(binding.root) { +class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding, val path: String) : + BaseRecyclerViewHolder(binding.root) { fun setContent( commentData: RatingComment, @@ -71,11 +72,14 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR val m = p.matcher(commentData.content) if (m.find()) { val contents = TextHelper.getCommentLabelSpannableStringBuilder(commentData.content, R.color.text_theme) - content.setTextWithHighlightedTextWrappedInsideWrapper(text = contents, copyClickedText = true) + content.setTextWithHighlightedTextWrappedInsideWrapper( + text = contents, + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick(binding.root.context, path) + ) } else { content.setTextWithHighlightedTextWrappedInsideWrapper( text = commentData.content, - copyClickedText = true + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick(binding.root.context, path) ) } } @@ -130,6 +134,7 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR NewsUtils.getFormattedTime(commentData.time) } } + commentData.isEditContent!! -> { time.setTextColor(ContextCompat.getColor(context, R.color.text_F56614)) time.text = if (commentData.ignore) { @@ -138,6 +143,7 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR "${NewsUtils.getFormattedTime(commentData.time)} 已修改 >" } } + else -> { time.setTextColor(ContextCompat.getColor(context, R.color.text_F56614)) time.text = if (commentData.ignore) { @@ -441,6 +447,7 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR commentData.content.replace(RatingEditActivity.LABEL_REPLACE_REGEX.toRegex(), "") .copyTextAndToast() } + "修改" -> { NewFlatLogUtils.logGameDetailCommentTabCommentClick( location, @@ -459,6 +466,7 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR dataPosition ) } + "投诉" -> { NewLogUtils.logCommentTabOrCommentDetailClick( "click_allcomment_report", @@ -487,6 +495,7 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR } } } + "删除" -> { NewFlatLogUtils.logGameDetailCommentTabCommentClick( location, @@ -593,7 +602,11 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR .size(0, commentData.replyData?.user?.name!!.length, 13) .build() - val contentSpan = TextHelper.getHighlightedSpannableStringThatIsWrappedInsideWrapper(context, spanned) + val contentSpan = TextHelper.getHighlightedSpannableStringThatIsWrappedInsideWrapper( + context, + spanned, + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick(context, path) + ) if (commentData.replyData!!.isService) { contentSpan.setSpan(LeadingMarginSpan.Standard(34F.dip2px(), 0), 0, contentSpan.length, 0) } else { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingDetailCommentItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingDetailCommentItemViewHolder.kt index ef9768e6a0..7baa87d4e7 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingDetailCommentItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingDetailCommentItemViewHolder.kt @@ -36,7 +36,7 @@ import com.gh.gamecenter.gamedetail.rating.logs.CommentLogsActivity import com.gh.gamecenter.login.user.UserManager import java.util.regex.Pattern -class RatingDetailCommentItemViewHolder(val binding: ItemArticleDetailCommentBinding) : +class RatingDetailCommentItemViewHolder(val binding: ItemArticleDetailCommentBinding, val entrance: String) : BaseRecyclerViewHolder(binding.root) { @SuppressLint("CheckResult") fun setContent( @@ -79,11 +79,20 @@ class RatingDetailCommentItemViewHolder(val binding: ItemArticleDetailCommentBin val m = p.matcher(commentData.content) if (m.find()) { val contents = TextHelper.getCommentLabelSpannableStringBuilder(commentData.content, R.color.text_theme) - contentTv.setTextWithHighlightedTextWrappedInsideWrapper(text = contents, copyClickedText = true) + contentTv.setTextWithHighlightedTextWrappedInsideWrapper( + text = contents, + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick( + binding.root.context, + entrance + ) + ) } else { contentTv.setTextWithHighlightedTextWrappedInsideWrapper( text = commentData.content, - copyClickedText = true + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick( + binding.root.context, + entrance + ) ) } root.setBackgroundColor(R.color.ui_surface.toColor(context)) @@ -123,6 +132,7 @@ class RatingDetailCommentItemViewHolder(val binding: ItemArticleDetailCommentBin NewsUtils.getFormattedTime(commentData.time) } } + commentData.isEditContent!! -> { time.setTextColor(ContextCompat.getColor(context, R.color.text_F56614)) time.text = if (commentData.ignore) { @@ -131,6 +141,7 @@ class RatingDetailCommentItemViewHolder(val binding: ItemArticleDetailCommentBin "${NewsUtils.getFormattedTime(commentData.time)} 已修改 >" } } + else -> { time.setTextColor(ContextCompat.getColor(context, R.color.text_F56614)) time.text = if (commentData.ignore) { @@ -264,6 +275,7 @@ class RatingDetailCommentItemViewHolder(val binding: ItemArticleDetailCommentBin commentData.content.replace(RatingEditActivity.LABEL_REPLACE_REGEX.toRegex(), "") .copyTextAndToast() } + "修改" -> { // if (path == "游戏详情:评分") MtaHelper.onEvent("游戏详情_新", "评论Tab_修改", game?.name) // if (path == "折叠评论") MtaHelper.onEvent("折叠评论", "更多-修改", game?.name) @@ -276,6 +288,7 @@ class RatingDetailCommentItemViewHolder(val binding: ItemArticleDetailCommentBin dataPosition ) } + "投诉" -> { // if (path == "游戏详情:评分") MtaHelper.onEvent("游戏详情_新", "评论Tab_投诉", game?.name) // if (path == "折叠评论") MtaHelper.onEvent("折叠评论", "更多-投诉", game?.name) @@ -298,6 +311,7 @@ class RatingDetailCommentItemViewHolder(val binding: ItemArticleDetailCommentBin } } } + "删除" -> { logGameDetailCommentDetailCommentClick(viewModel, entrance, "评价右上角-删除") DialogHelper.showDeleteGameCommentDialog( 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 3f9ee31c5e..302bd55a36 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 @@ -112,7 +112,7 @@ class RatingReplyAdapter( ITEM_COMMENT -> { view = mLayoutInflater.inflate(R.layout.item_article_detail_comment, parent, false) - RatingDetailCommentItemViewHolder(ItemArticleDetailCommentBinding.bind(view)) + RatingDetailCommentItemViewHolder(ItemArticleDetailCommentBinding.bind(view), entrance) } ITEM_SECTION_TITLE -> { @@ -342,7 +342,10 @@ class RatingReplyAdapter( contentTv.setTextWithHighlightedTextWrappedInsideWrapper( text = contentCharSequence, - copyClickedText = true + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick( + mContext, + entrance + ) ) badgeIv.setOnClickListener { DialogUtils.showViewBadgeDialog(mContext, replyEntity.user.badge, object : ConfirmListener { diff --git a/app/src/main/java/com/gh/gamecenter/home/custom/viewholder/CustomHomeAmwayItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/home/custom/viewholder/CustomHomeAmwayItemViewHolder.kt index 50582f73f9..ff7a82e4f4 100644 --- a/app/src/main/java/com/gh/gamecenter/home/custom/viewholder/CustomHomeAmwayItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/home/custom/viewholder/CustomHomeAmwayItemViewHolder.kt @@ -38,9 +38,21 @@ class CustomHomeAmwayItemViewHolder(val binding: HomeAmwayItemCustomBinding) : B val m = Pattern.compile(RatingEditActivity.LABEL_REGEX).matcher(amway.comment.content) if (m.find()) { val contents = TextHelper.getCommentLabelSpannableStringBuilder(amway.comment.content, R.color.text_theme) - binding.content.text = contents + binding.content.setTextWithHighlightedTextWrappedInsideWrapper( + contents, + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick( + binding.root.context, + "自定义页-热门评论" + ) + ) } else { - binding.content.text = amway.comment.content + binding.content.setTextWithHighlightedTextWrappedInsideWrapper( + amway.comment.content, + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick( + binding.root.context, + "自定义页-热门评论" + ) + ) } binding.run { amwayBackground.background = R.drawable.home_amway_selector.toDrawable(root.context) 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 51c0a0b58b..cc90aa3754 100644 --- a/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java @@ -1,6 +1,8 @@ package com.gh.gamecenter.newsdetail; import android.app.Activity; +import android.app.Application; +import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -42,6 +44,7 @@ import com.gh.gamecenter.adapter.viewholder.NewsDetailCommentListViewHolder; import com.gh.gamecenter.adapter.viewholder.NewsDetailGameViewHolder; import com.gh.gamecenter.adapter.viewholder.UnAvaliableWebviewViewHolder; import com.gh.gamecenter.common.callback.OnRequestCallBackListener; +import com.gh.gamecenter.common.callback.SimpleCallback; import com.gh.gamecenter.common.constant.Constants; import com.gh.gamecenter.common.retrofit.Response; import com.gh.gamecenter.common.utils.DarkModeUtils; @@ -50,6 +53,7 @@ import com.gh.gamecenter.common.utils.ExtensionsKt; import com.gh.gamecenter.common.utils.ImageUtils; import com.gh.gamecenter.common.utils.TextHelper; import com.gh.gamecenter.common.view.DrawableView; +import com.gh.gamecenter.core.HaloApp; import com.gh.gamecenter.core.utils.DisplayUtils; import com.gh.gamecenter.core.utils.MtaHelper; import com.gh.gamecenter.core.utils.NumberUtils; @@ -510,7 +514,10 @@ public class NewsDetailAdapter extends BaseRecyclerAdapter { TextHelper.highlightTextThatIsWrappedInsideWrapperByDefault( viewHolder.commentContentTv, - commentEntity.getContent()); + commentEntity.getContent(), + Constants.DEFAULT_TEXT_WRAPPER_2, + new TextHelper.CopyToClipboardHighlightedTextClick() + ); ArticleCommentParent parent = commentEntity.getParent(); if (parent != null && !TextUtils.isEmpty(parent.getUser().getName())) { viewHolder.quoteContainer.setVisibility(View.VISIBLE); @@ -532,7 +539,10 @@ public class NewsDetailAdapter extends BaseRecyclerAdapter { TextHelper.highlightTextThatIsWrappedInsideWrapperByDefault( viewHolder.quoteContentTv, - content); + content, + Constants.DEFAULT_TEXT_WRAPPER_2, + new TextHelper.CopyToClipboardHighlightedTextClick() + ); } else { viewHolder.quoteContainer.setVisibility(View.GONE); } diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryAdapter.kt index 5a2487bda7..8253f0afc5 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryAdapter.kt @@ -117,12 +117,12 @@ class UserHistoryAdapter( TextHelper.getCommentLabelSpannableStringBuilder(historyEntity.comment.content, R.color.text_theme) holder.binding.content.setTextWithHighlightedTextWrappedInsideWrapper( text = contents, - copyClickedText = true + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick(mContext, mEntrance) ) } else { holder.binding.content.setTextWithHighlightedTextWrappedInsideWrapper( text = historyEntity.comment.content, - copyClickedText = true + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick(mContext, mEntrance) ) } holder.binding.content.setExpandCallback { diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/home/game/UserCommentHistoryAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/home/game/UserCommentHistoryAdapter.kt index 53e74db8cf..da409e8770 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/home/game/UserCommentHistoryAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/home/game/UserCommentHistoryAdapter.kt @@ -94,12 +94,12 @@ class UserCommentHistoryAdapter( val contents = TextHelper.getCommentLabelSpannableStringBuilder(rating.content, R.color.text_theme) holder.binding.tvComment.setTextWithHighlightedTextWrappedInsideWrapper( text = contents, - copyClickedText = true + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick(mContext, mEntrance) ) } else { holder.binding.tvComment.setTextWithHighlightedTextWrappedInsideWrapper( text = rating.content, - copyClickedText = true + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick(mContext, mEntrance) ) } holder.binding.tvComment.setExpandCallback { diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/StairsCommentAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/StairsCommentAdapter.kt index 09f8ff6e0e..789a272cde 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/StairsCommentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/StairsCommentAdapter.kt @@ -27,7 +27,7 @@ class StairsCommentAdapter( FooterViewHolder(view) } else { val view = mLayoutInflater.inflate(R.layout.stairs_comment_item, parent, false) - StairsCommentViewHolder(StairsCommentItemBinding.bind(view)) + StairsCommentViewHolder(StairsCommentItemBinding.bind(view), mEntrance) } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/StairsCommentReplyAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/StairsCommentReplyAdapter.kt index 06cfc0286c..07a566521c 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/StairsCommentReplyAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/StairsCommentReplyAdapter.kt @@ -38,7 +38,7 @@ class StairsCommentReplyAdapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val view = mLayoutInflater.inflate(R.layout.stairs_comment_item, parent, false) - return StairsCommentViewHolder(StairsCommentItemBinding.bind(view), true) + return StairsCommentViewHolder(StairsCommentItemBinding.bind(view), mEntrance, true) } override fun getItemCount(): Int = replyComments.size diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/StairsCommentViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/StairsCommentViewHolder.kt index f7dbbe6615..d56252e6b6 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/StairsCommentViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/StairsCommentViewHolder.kt @@ -26,7 +26,8 @@ import com.halo.assistant.HaloApp class StairsCommentViewHolder( val binding: StairsCommentItemBinding, - val isReplyComment: Boolean = false + val entrance: String, + val isReplyComment: Boolean = false, ) : BaseRecyclerViewHolder(binding.root) { var isFirstClick = true @@ -146,8 +147,9 @@ class StairsCommentViewHolder( if (!TextUtils.isEmpty(mViewModel.videoId)) { val spannable = TextHelper.getHighlightedSpannableStringThatIsWrappedInsideWrapper( - context, commentEntity.content - ?: "" + context, + commentEntity.content ?: "", + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick(context, mEntrance) ) //当评论同时满足以下两个条件:①来源于作者;②权重为1时,前端不显示“置顶”标志 diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt index 5f43f49cfa..f0126981a6 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt @@ -2,6 +2,7 @@ package com.gh.gamecenter.qa.comment.base import android.annotation.SuppressLint import android.content.Context +import android.graphics.Color import android.text.SpannableStringBuilder import android.text.TextUtils import android.view.View @@ -23,6 +24,7 @@ import com.gh.gamecenter.common.syncpage.SyncDataEntity import com.gh.gamecenter.common.syncpage.SyncFieldConstants import com.gh.gamecenter.common.syncpage.SyncPageRepository import com.gh.gamecenter.common.utils.* +import com.gh.gamecenter.common.view.CustomLinkMovementMethod import com.gh.gamecenter.common.view.GridSpacingItemColorDecoration import com.gh.gamecenter.common.view.SegmentedFilterView import com.gh.gamecenter.core.utils.MtaHelper @@ -437,7 +439,13 @@ abstract class BaseCommentAdapter( comment.user.id ?: "", contentType, comment.id ?: "", bbsId, bbsType ) } - binding.contentTv.text = comment.content + binding.contentTv.setTextWithHighlightedTextWrappedInsideWrapper( + text = comment.content ?: "", + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick( + binding.root.context, + entrance + ) + ) binding.commentCountTv.text = viewModel.getCommentText(comment.reply, "回复") } else { // 评论详情用的样式 @@ -480,14 +488,30 @@ abstract class BaseCommentAdapter( "" } + val commentText = TextHelper.getHighlightedSpannableStringThatIsWrappedInsideWrapper( + binding.contentTv.context, + comment.content ?: "", + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick( + binding.contentTv.context, + entrance = entrance + ) + ) binding.contentTv.text = SpannableStringBuilder() .append(prefixSpan) .append(parentUserNameSpan) .append(authorSpan) .append(colonSpan) - .append(comment.content) + .append(commentText) + binding.contentTv.movementMethod = CustomLinkMovementMethod.getInstance() + binding.contentTv.highlightColor = Color.TRANSPARENT } else { - binding.contentTv.text = comment.content + binding.contentTv.setTextWithHighlightedTextWrappedInsideWrapper( + text = comment.content ?: "", + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick( + binding.root.context, + entrance + ) + ) } } } @@ -518,19 +542,31 @@ abstract class BaseCommentAdapter( binding.subCommentContainer.setRoundedColorBackground(R.color.ui_container_2, 5F) subCommentList?.firstOrNull()?.let { - binding.firstSubCommentTv.text = getSubCommentSpanned( - binding.root.context, - it.user.name, - if (it.user.id == ownerUserId) "作者" else "", - it.content + binding.firstSubCommentTv.setTextWithHighlightedTextWrappedInsideWrapper( + text = getSubCommentSpanned( + binding.root.context, + it.user.name, + if (it.user.id == ownerUserId) "作者" else "", + it.content + ), + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick( + binding.root.context, + entrance + ) ) } subCommentList?.secondOrNull()?.let { - binding.secondSubCommentTv.text = getSubCommentSpanned( - binding.root.context, - it.user.name, - if (it.user.id == ownerUserId) "作者" else "", - it.content + binding.secondSubCommentTv.setTextWithHighlightedTextWrappedInsideWrapper( + text = getSubCommentSpanned( + binding.root.context, + it.user.name, + if (it.user.id == ownerUserId) "作者" else "", + it.content + ), + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick( + binding.root.context, + entrance + ) ) } binding.subCommentContainer.setOnClickListener { @@ -555,7 +591,7 @@ abstract class BaseCommentAdapter( context: Context, name: String?, author: String?, - content: String? + content: CharSequence? ): SpannableStringBuilder { val finalAuthor = author ?: "" val finalName = "$name " diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/conversation/CommentConversationAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/conversation/CommentConversationAdapter.kt index d5cbb98bcb..5ba1afd176 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/conversation/CommentConversationAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/conversation/CommentConversationAdapter.kt @@ -8,8 +8,10 @@ import androidx.constraintlayout.widget.ConstraintSet import androidx.recyclerview.widget.RecyclerView import com.gh.common.util.CommentUtils import com.gh.common.util.DirectUtils +import com.gh.gamecenter.common.utils.TextHelper import com.gh.gamecenter.common.utils.dip2px import com.gh.gamecenter.common.utils.goneIf +import com.gh.gamecenter.common.utils.setTextWithHighlightedTextWrappedInsideWrapper import com.gh.gamecenter.databinding.ItemArticleDetailCommentBinding import com.gh.gamecenter.feature.entity.CommentEntity import com.gh.gamecenter.qa.comment.base.BaseCommentAdapter @@ -90,7 +92,13 @@ class CommentConversationAdapter( bottomFloorHintTv.goneIf(mViewModelCommunity.topCommentId.isNotBlank()) { bottomFloorHintTv.text = if (comment.floor != 0) "${comment.floor}楼" else "" } - contentTv.text = comment.content + contentTv.setTextWithHighlightedTextWrappedInsideWrapper( + text = comment.content ?: "", + highlightedTextClickListener = TextHelper.DirectToWebViewHighlightedTextClick( + binding.root.context, + mEntrance + ) + ) contentTv.maxLines = Int.MAX_VALUE commentTopTimeTv.goneIf(mViewModelCommunity.topCommentId.isBlank()) commentTopTimeTv.text = if (comment.source != null && comment.source!!.region.isNotEmpty()) { diff --git a/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java b/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java index 08db655ca9..0e0fb3302f 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java +++ b/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java @@ -349,7 +349,9 @@ public class Constants { public static final String ENTRANCE_UNKNOWN = "(unknown)"; - public static final String DEFAULT_TEXT_WRAPPER = "###"; + public static final String DEFAULT_TEXT_WRAPPER = "\\{\\{(.+?)\\}\\}|###(.+?)###"; + + public static final String DEFAULT_TEXT_WRAPPER_2 = "###(.+?)###"; // 触发了安装事件的标记 public static final String MARK_ALREADY_TRIGGERED_INSTALLATION = "triggered_installation"; diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt b/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt index 730b1c212c..1846f37bf3 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt @@ -770,27 +770,21 @@ fun List.secondOrNull(): T? { /** * TextView related. */ +@JvmOverloads fun TextView.setTextWithHighlightedTextWrappedInsideWrapper( text: CharSequence, wrapper: String = Constants.DEFAULT_TEXT_WRAPPER, @ColorRes highlightColorId: Int = R.color.text_theme, - copyClickedText: Boolean = false, - highlightedTextClickListener: (() -> Unit)? = null + highlightedTextClickListener: SimpleCallback? = null ) { TextHelper.highlightTextThatIsWrappedInsideWrapper( this, text, wrapper, highlightColorId, - object : SimpleCallback { - override fun onCallback(arg: String) { - if (copyClickedText) { - arg.copyTextAndToast("已复制:$arg") - } - highlightedTextClickListener?.invoke() - } - }) + highlightedTextClickListener + ) } fun TextView.setTextChangedListener(action: (s: CharSequence, start: Int, before: Int, count: Int) -> Unit) { @@ -887,12 +881,14 @@ fun ExpandTextView.setTextWithInterceptingInternalUrl( shrankSsb = TextHelper.updateSpannableStringWithHighlightedSpan( context, shrankSsb, - highlightedTextClickListener = null + wrapper = Constants.DEFAULT_TEXT_WRAPPER_2, + highlightedTextClickListener = TextHelper.CopyToClipboardHighlightedTextClick() ) expandedSsb = TextHelper.updateSpannableStringWithHighlightedSpan( context, expandedSsb, - highlightedTextClickListener = null + wrapper = Constants.DEFAULT_TEXT_WRAPPER_2, + highlightedTextClickListener = TextHelper.CopyToClipboardHighlightedTextClick() ) setShrankTextAndExpandedText(shrankSsb, expandedSsb) } @@ -922,7 +918,8 @@ fun TextView.setTextWithInterceptingInternalUrl(text: CharSequence) { ssb = TextHelper.updateSpannableStringWithHighlightedSpan( context, ssb, - highlightedTextClickListener = null + wrapper = Constants.DEFAULT_TEXT_WRAPPER_2, + highlightedTextClickListener = TextHelper.CopyToClipboardHighlightedTextClick() ) setText(ssb) } diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/TextHelper.kt b/module_common/src/main/java/com/gh/gamecenter/common/utils/TextHelper.kt index 2f9309ebfb..9859f8be7f 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/utils/TextHelper.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/utils/TextHelper.kt @@ -7,16 +7,21 @@ import android.text.* import android.text.style.ClickableSpan import android.text.style.ForegroundColorSpan import android.text.style.RelativeSizeSpan +import android.util.Log import android.view.View import android.widget.EditText import android.widget.TextView import androidx.annotation.ColorRes import androidx.core.content.ContextCompat +import com.alibaba.android.arouter.launcher.ARouter import com.gh.gamecenter.common.HaloApp import com.gh.gamecenter.common.R import com.gh.gamecenter.common.callback.SimpleCallback +import com.gh.gamecenter.common.constant.Constants +import com.gh.gamecenter.common.constant.RouteConsts import com.gh.gamecenter.common.view.CustomLinkMovementMethod import com.gh.gamecenter.common.view.RoundStrokeBackgroundColorSpan +import com.gh.gamecenter.core.provider.IDirectProvider import com.gh.gamecenter.core.utils.ClickUtils import com.gh.gamecenter.core.utils.DisplayUtils import com.gh.gamecenter.core.utils.ToastUtils @@ -118,16 +123,20 @@ object TextHelper { } @JvmStatic - fun highlightTextThatIsWrappedInsideWrapperByDefault(textView: TextView, text: String?) { - textView.text = getHighlightedSpannableStringThatIsWrappedInsideWrapper(textView.context, text - ?: "", "###", R.color.text_theme, object : SimpleCallback { - override fun onCallback(arg: String) { - val application = HaloApp.getInstance() - val cmb = application.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - cmb.text = arg - Utils.toast(application, "已复制:$arg") - } - }) + @JvmOverloads + fun highlightTextThatIsWrappedInsideWrapperByDefault( + textView: TextView, + text: String?, + wrapper: String = Constants.DEFAULT_TEXT_WRAPPER, + highlightedTextClickListener: SimpleCallback? = null + ) { + textView.text = getHighlightedSpannableStringThatIsWrappedInsideWrapper( + textView.context, + text ?: "", + wrapper, + R.color.text_theme, + highlightedTextClickListener + ) textView.movementMethod = CustomLinkMovementMethod.getInstance() textView.highlightColor = Color.TRANSPARENT } @@ -136,7 +145,7 @@ object TextHelper { fun highlightTextThatIsWrappedInsideWrapper( textView: TextView, text: CharSequence, - wrapper: String, + wrapper: String = Constants.DEFAULT_TEXT_WRAPPER, @ColorRes highlightColorId: Int, highlightedTextClickListener: SimpleCallback? = null @@ -147,29 +156,24 @@ object TextHelper { text, wrapper, highlightColorId, - highlightedTextClickListener + highlightedTextClickListener, ) textView.movementMethod = CustomLinkMovementMethod.getInstance() textView.highlightColor = Color.TRANSPARENT } @JvmStatic + @JvmOverloads fun getHighlightedSpannableStringThatIsWrappedInsideWrapper( context: Context, text: CharSequence, - wrapper: String = "###", + wrapper: String = Constants.DEFAULT_TEXT_WRAPPER, @ColorRes highlightColorId: Int = R.color.text_theme, - highlightedTextClickListener: SimpleCallback? = object : SimpleCallback { - override fun onCallback(arg: String) { - val application = HaloApp.getInstance() - val cmb = application.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - cmb.text = arg - Utils.toast(application, "已复制:$arg") - } - } + highlightedTextClickListener: SimpleCallback? = null ): SpannableStringBuilder { - val builder = SpannableStringBuilder(text) + val builder = + SpannableStringBuilder(text) return updateSpannableStringWithHighlightedSpan( context, builder, @@ -182,17 +186,10 @@ object TextHelper { fun updateSpannableStringWithHighlightedSpan( context: Context, ssb: SpannableStringBuilder, - wrapper: String = "###", + wrapper: String = Constants.DEFAULT_TEXT_WRAPPER, @ColorRes highlightColorId: Int = R.color.text_theme, - highlightedTextClickListener: SimpleCallback? = object : SimpleCallback { - override fun onCallback(arg: String) { - val application = HaloApp.getInstance() - val cmb = application.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - cmb.text = arg - Utils.toast(application, "已复制:$arg") - } - } + highlightedTextClickListener: SimpleCallback? = null ): SpannableStringBuilder { if (ssb.endsWith(wrapper)) { @@ -200,43 +197,38 @@ object TextHelper { ssb.append(" ") } - val wrapperTextLength = wrapper.length - val matcher = Pattern.compile("$wrapper(.+?)$wrapper", Pattern.DOTALL).matcher(ssb) - - val pair = TreeMap() + val matcher = Pattern.compile(wrapper, Pattern.DOTALL).matcher(ssb) + var spanOffset = 0 while (matcher.find()) { - // 保存起始位置和结束位置 - pair[matcher.start(1)] = matcher.end(1) - ssb.setSpan(object : ClickableSpan() { - override fun updateDrawState(ds: TextPaint) { - super.updateDrawState(ds) - ds.color = ContextCompat.getColor(context, highlightColorId) - ds.isUnderlineText = false - } + val matchSegment = matcher.group() + var matchUrl: String? = null + var group = 0 + while (matchUrl == null && group < matcher.groupCount()) { + matchUrl = matcher.group(++group) + } + if (matchUrl != null) { + val matchSegmentLength = matchSegment.length + val matchUrlLength = matchUrl.length + val spanStart = matcher.start() + spanOffset + val spanEnd = matchUrlLength + spanStart + // 1. {{https://www.baidu.com}} => https://www.baidu.com + // 2. ###https://www.baidu.com### => https://www.baidu.com + ssb.replace(spanStart, spanStart + matchSegmentLength, matchUrl) + // 计算替换字符以后的偏移量 + spanOffset += matchUrlLength - matchSegmentLength + ssb.setSpan(object : ClickableSpan() { + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = ContextCompat.getColor(context, highlightColorId) + ds.isUnderlineText = false + } - override fun onClick(widget: View) { - val tv = widget as TextView - val s = tv.text as Spanned - val start = s.getSpanStart(this) - val end = s.getSpanEnd(this) - highlightedTextClickListener?.onCallback(s.substring(start, end)) - } - }, matcher.start(1), matcher.end(1), 0) - } - - // 反转 pair - val reversePair = pair.descendingMap() - - // 找到 - for (key in reversePair.keys) { - val end = reversePair[key] - - end?.let { - ssb.replace(end, end + wrapperTextLength, "") - ssb.replace(key - wrapperTextLength, key, "") + override fun onClick(widget: View) { + highlightedTextClickListener?.onCallback(matchUrl) + } + }, spanStart, spanEnd, 0) } } - return ssb } @@ -346,4 +338,39 @@ object TextHelper { fun onExceed() } + class DirectToWebViewHighlightedTextClick( + private val context: Context, + private val entrance: String? = null + ) : SimpleCallback { + + companion object { + private const val PROTOCOL_ADDRESS_REGEX = "(?:http|https)://.+" + } + + override fun onCallback(arg: String) { + val pattern = Pattern.compile(PROTOCOL_ADDRESS_REGEX) + if (pattern.matcher(arg).find()) { + val directUtils = ARouter + .getInstance() + .build(RouteConsts.provider.directUtils) + .navigation() as? IDirectProvider + directUtils?.directToWebView(context, arg, entrance) + } else { + val application = HaloApp.getInstance() + val cmb = application.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + cmb.text = arg + Utils.toast(application, "已复制:$arg") + } + } + } + + class CopyToClipboardHighlightedTextClick : SimpleCallback { + override fun onCallback(arg: String) { + val application = HaloApp.getInstance() + val cmb = application.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + cmb.text = arg + Utils.toast(application, "已复制:$arg") + } + } + } \ No newline at end of file diff --git a/module_common/src/main/java/com/gh/gamecenter/common/view/ExpandTextView.java b/module_common/src/main/java/com/gh/gamecenter/common/view/ExpandTextView.java index 2833e4980f..dfee7f2e3b 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/view/ExpandTextView.java +++ b/module_common/src/main/java/com/gh/gamecenter/common/view/ExpandTextView.java @@ -194,8 +194,7 @@ public class ExpandTextView extends AppCompatTextView { } } - SpannableStringBuilder msp = new SpannableStringBuilder(mSnapshotText); - int length = msp.length(); + int length = mSnapshotText.length(); int expandTextStartPosition; expandTextStartPosition = content.length() - finalEndText.length() - mExpandText.length(); expandTextStartPosition = Math.max(expandTextStartPosition, 0); @@ -203,7 +202,9 @@ public class ExpandTextView extends AppCompatTextView { // 避免越界 if (expandTextStartPosition >= length) return; - msp.replace(expandTextStartPosition, length, finalEndText + mExpandText); + SpannableStringBuilder msp = new SpannableStringBuilder(mSnapshotText, 0, expandTextStartPosition) + .append(finalEndText) + .append(mExpandText); if (expandTextStartPosition + mEndText.length() >= msp.length()) return; diff --git a/module_message/src/main/java/com/gh/gamecenter/message/view/KeFuFragmentAdapter.java b/module_message/src/main/java/com/gh/gamecenter/message/view/KeFuFragmentAdapter.java index 782cf56c3e..3886fa10e0 100644 --- a/module_message/src/main/java/com/gh/gamecenter/message/view/KeFuFragmentAdapter.java +++ b/module_message/src/main/java/com/gh/gamecenter/message/view/KeFuFragmentAdapter.java @@ -172,7 +172,13 @@ public class KeFuFragmentAdapter extends ListAdapter { viewHolder.binding.messageKefuContent.setText(Html.fromHtml(keFuEntity.getMessage())); - viewHolder.binding.messageKefuContent.setOnSpannableClickListener(spannableText -> ExtensionsKt.copyTextAndToast(spannableText, "已复制:" + spannableText)); + viewHolder.binding.messageKefuContent.setOnSpannableClickListener(spannableText -> { + IDirectProvider directUtils = (IDirectProvider) ARouter + .getInstance() + .build(RouteConsts.provider.directUtils) + .navigation(); + directUtils.directToWebView(mContext, spannableText, "消息中心-系统"); + }); viewHolder.setClickData(keFuEntity); if (!TextUtils.isEmpty(keFuEntity.getSuggestion())) { @@ -482,4 +488,4 @@ public class KeFuFragmentAdapter extends ListAdapter { } } -} +} \ No newline at end of file diff --git a/module_message/src/main/java/com/gh/gamecenter/message/view/message/MessageItemViewHolder.java b/module_message/src/main/java/com/gh/gamecenter/message/view/message/MessageItemViewHolder.java index dc357bc348..93e790f0ad 100644 --- a/module_message/src/main/java/com/gh/gamecenter/message/view/message/MessageItemViewHolder.java +++ b/module_message/src/main/java/com/gh/gamecenter/message/view/message/MessageItemViewHolder.java @@ -16,6 +16,7 @@ import com.gh.gamecenter.common.base.BaseRecyclerViewHolder; import com.gh.gamecenter.common.base.activity.BaseActivity; import com.gh.gamecenter.common.base.fragment.BaseFragment_TabLayout; import com.gh.gamecenter.common.callback.OnListClickListener; +import com.gh.gamecenter.common.callback.SimpleCallback; import com.gh.gamecenter.common.constant.Constants; import com.gh.gamecenter.common.constant.EntranceConsts; import com.gh.gamecenter.common.constant.RouteConsts; @@ -395,8 +396,7 @@ public class MessageItemViewHolder extends BaseRecyclerViewHolder contents, Constants.DEFAULT_TEXT_WRAPPER, R.color.text_tertiary, - false, - null + new TextHelper.DirectToWebViewHighlightedTextClick(context, "消息中心-消息列表") ); } else { ExtensionsKt.setTextWithHighlightedTextWrappedInsideWrapper( @@ -404,8 +404,7 @@ public class MessageItemViewHolder extends BaseRecyclerViewHolder comment, Constants.DEFAULT_TEXT_WRAPPER, R.color.text_tertiary, - false, - null + new TextHelper.DirectToWebViewHighlightedTextClick(context, "消息中心-消息列表") ); } } @@ -542,7 +541,12 @@ public class MessageItemViewHolder extends BaseRecyclerViewHolder break; } - TextHelper.highlightTextThatIsWrappedInsideWrapperByDefault(mBinding.messageContent, content); + TextHelper.highlightTextThatIsWrappedInsideWrapperByDefault( + mBinding.messageContent, + content, + Constants.DEFAULT_TEXT_WRAPPER, + new TextHelper.DirectToWebViewHighlightedTextClick(mBinding.messageContent.getContext(), "消息中心-消息列表") + ); mBinding.messageOriginalTitle.post(() -> { ViewGroup.LayoutParams params = mBinding.messageOriginal.getLayoutParams(); diff --git a/module_message/src/main/java/com/gh/gamecenter/message/view/message/MessageListAdapter.kt b/module_message/src/main/java/com/gh/gamecenter/message/view/message/MessageListAdapter.kt index 8d4a3e3d20..e535af03de 100644 --- a/module_message/src/main/java/com/gh/gamecenter/message/view/message/MessageListAdapter.kt +++ b/module_message/src/main/java/com/gh/gamecenter/message/view/message/MessageListAdapter.kt @@ -183,12 +183,14 @@ class MessageListAdapter( } } + val directToWebViewClick = TextHelper.DirectToWebViewHighlightedTextClick( + mContext, "消息中心-系统" + ) + holder.binding.messageKefuContent.text = Html.fromHtml(entity.message) holder.binding.messageKefuContent.setOnSpannableClickListener { spannableText: String -> - spannableText.copyTextAndToast( - "已复制:$spannableText" - ) + directToWebViewClick.onCallback(spannableText) } holder.setClickData(entity) @@ -364,9 +366,12 @@ class MessageListAdapter( ImageUtils.display(messageKefuIcon, R.drawable.message_kefu_icon) } + val directToWebViewClick = TextHelper.DirectToWebViewHighlightedTextClick( + mContext, "消息中心-系统" + ) messageKefuContent.text = Html.fromHtml(entity.content?.link?.text) messageKefuContent.setOnSpannableClickListener { spannableText: String -> - spannableText.copyTextAndToast("已复制:$spannableText") + directToWebViewClick.onCallback(spannableText) } if (entity.content?.type == "game_server_opening" && entity.content?.lines?.isNotEmpty() == true) { @@ -614,8 +619,8 @@ class MessageListAdapter( ) } - "订单中心" , - "订单详情" , + "订单中心", + "订单详情", "光能记录", "光能记录获取", "光能记录使用", "抽奖中心",