From 64e99338b01e5a080d4ae27c2b809374865e0292 Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Fri, 20 Sep 2019 11:57:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E8=A1=A8=E7=9A=84=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=8D=E5=88=B6=E6=96=87=E6=9C=AC=E5=8A=9F?= =?UTF-8?q?=E8=83=BD(=E6=B8=B8=E6=88=8F=E8=AF=84=E5=88=86=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=9C=AA=E5=AE=8C=E6=88=90)=20https://gitlab.ghzs.com?= =?UTF-8?q?/pm/halo-app-issues/issues/651?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/constant/Constants.java | 2 + .../java/com/gh/common/util/Extensions.kt | 21 +++++ .../java/com/gh/common/util/SimpleCallback.kt | 5 ++ .../java/com/gh/common/util/TextHelper.kt | 76 ++++++++++++++++++- .../desc/GameDetailCustomColumnAdapter.kt | 4 +- .../gamedetail/rating/RatingAdapter.kt | 5 +- .../qa/comment/NewCommentAdapter.kt | 9 ++- .../qa/comment/NewCommentFragment.kt | 2 +- 8 files changed, 117 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/gh/common/util/SimpleCallback.kt diff --git a/app/src/main/java/com/gh/common/constant/Constants.java b/app/src/main/java/com/gh/common/constant/Constants.java index 41106fbe9a..284c9a1a0c 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -52,4 +52,6 @@ public class Constants { public static final String[] REPORT_LIST = new String[]{"垃圾广告营销", "恶意攻击谩骂", "淫秽色情信息", "违法有害信息", "其它"}; public static final String ENTRANCE_UNKNOWN = "(unknown)"; + + public static final String DEFAULT_TEXT_WRAPPER = "###"; } diff --git a/app/src/main/java/com/gh/common/util/Extensions.kt b/app/src/main/java/com/gh/common/util/Extensions.kt index 59e01c2066..41e16d3e1e 100644 --- a/app/src/main/java/com/gh/common/util/Extensions.kt +++ b/app/src/main/java/com/gh/common/util/Extensions.kt @@ -11,12 +11,14 @@ import android.view.Gravity import android.view.View import android.widget.PopupWindow import android.widget.TextView +import androidx.annotation.ColorRes import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.lifecycle.* import androidx.viewpager.widget.ViewPager import com.facebook.drawee.view.SimpleDraweeView import com.gh.common.constant.Config +import com.gh.common.constant.Constants import com.gh.gamecenter.BuildConfig import com.gh.gamecenter.R import com.google.gson.reflect.TypeToken @@ -286,6 +288,25 @@ fun Fragment.checkStoragePermissionBeforeAction(action: (() -> Unit)) { }) } +/** + * TextView related. + */ +fun TextView.setTextWithHighlightedTextWrappedInsideWrapper(text: String, + wrapper: String = Constants.DEFAULT_TEXT_WRAPPER, + @ColorRes + highlightColorId: Int = R.color.theme, + copyClickedText: Boolean = false, + highlightedTextClickListener: (() -> Unit)? = null) { + TextHelper.highlightTextThatIsWrappedInsideWrapper(this, text, wrapper, highlightColorId, object : SimpleCallback { + override fun onCallback(arg: String) { + if (copyClickedText) { + arg.copyTextAndToast() + } + highlightedTextClickListener?.invoke() + } + }) +} + fun TextView.setTextChangedListener(action: (s: CharSequence, start: Int, before: Int, count: Int) -> Unit) { this.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(s: Editable?) { diff --git a/app/src/main/java/com/gh/common/util/SimpleCallback.kt b/app/src/main/java/com/gh/common/util/SimpleCallback.kt new file mode 100644 index 0000000000..ea6d8b8778 --- /dev/null +++ b/app/src/main/java/com/gh/common/util/SimpleCallback.kt @@ -0,0 +1,5 @@ +package com.gh.common.util + +interface SimpleCallback { + fun onCallback(arg: T) +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/util/TextHelper.kt b/app/src/main/java/com/gh/common/util/TextHelper.kt index 85dba9c024..74833d24f9 100644 --- a/app/src/main/java/com/gh/common/util/TextHelper.kt +++ b/app/src/main/java/com/gh/common/util/TextHelper.kt @@ -1,10 +1,18 @@ package com.gh.common.util -import android.text.Editable -import android.text.InputFilter -import android.text.TextWatcher +import android.content.Context +import android.graphics.Color +import android.text.* +import android.text.method.LinkMovementMethod +import android.text.style.ClickableSpan +import android.view.View import android.widget.EditText +import android.widget.TextView +import androidx.annotation.ColorRes +import androidx.core.content.ContextCompat import com.gh.gamecenter.R +import java.util.* +import java.util.regex.Pattern object TextHelper { @@ -49,6 +57,68 @@ object TextHelper { } } + @JvmStatic + fun highlightTextThatIsWrappedInsideWrapper(textView: TextView, + text: String, + wrapper: String, + @ColorRes + highlightColorId: Int, + highlightedTextClickListener: SimpleCallback? = null) { + textView.text = getHighlightedSpannableStringThatIsWrappedInsideWrapper(textView.context, text, wrapper, highlightColorId, highlightedTextClickListener) + textView.movementMethod = LinkMovementMethod.getInstance() + textView.highlightColor = Color.TRANSPARENT + } + + @JvmStatic + fun getHighlightedSpannableStringThatIsWrappedInsideWrapper( + context: Context, + text: String, + wrapper: String, + @ColorRes + highlightColorId: Int, + highlightedTextClickListener: SimpleCallback? = null): SpannableStringBuilder { + val sBuilder = SpannableStringBuilder(text) + val wrapperTextLength = wrapper.length + + val matcher = Pattern.compile("$wrapper(.+?)$wrapper", Pattern.DOTALL).matcher(text) + + val pair = TreeMap() + while (matcher.find()) { + // 保存起始位置和结束位置 + pair[matcher.start(1)] = matcher.end(1) + sBuilder.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 { + sBuilder.replace(end, end + wrapperTextLength, "") + sBuilder.replace(key - wrapperTextLength, key, "") + } + } + + return sBuilder + } + interface ExceedTextLengthLimitCallback { fun onExceed() } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameDetailCustomColumnAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameDetailCustomColumnAdapter.kt index 6de0b11405..d899555462 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameDetailCustomColumnAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameDetailCustomColumnAdapter.kt @@ -15,6 +15,7 @@ import com.facebook.drawee.view.SimpleDraweeView import com.gh.base.BaseRecyclerViewHolder import com.gh.common.util.ImageUtils import com.gh.common.util.goneIf +import com.gh.common.util.setTextWithHighlightedTextWrappedInsideWrapper import com.gh.common.util.tryWithDefaultCatch import com.gh.gamecenter.R import com.gh.gamecenter.entity.TagEntity @@ -60,7 +61,8 @@ class GameDetailCustomColumnAdapter(private val tags: ArrayList, viewHolder.hintDv.goneIf(TextUtils.isEmpty(tips?.icon)) viewHolder.hintContentTv.goneIf(TextUtils.isEmpty(tips?.content)) - viewHolder.hintContentTv.text = tips?.content + + viewHolder.hintContentTv.setTextWithHighlightedTextWrappedInsideWrapper(text = tips?.content ?: "") if (title == null || (TextUtils.isEmpty(title.value) && TextUtils.isEmpty(title.color))) { 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 e016ea1b2e..ccfba2050d 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 @@ -19,7 +19,7 @@ import com.lightgame.utils.Utils class RatingAdapter(context: Context, private val mListViewModel: RatingViewModel, - private val mDirectComment: Boolean, + private var mDirectComment: Boolean, private val mEntrance: String) : ListAdapter(context) { var ratingData: Rating? = null @@ -178,6 +178,9 @@ class RatingAdapter(context: Context, } private fun skipRatingEdit(starCount: Float, entrance: String) { + + debugOnly { mDirectComment = true } + mContext.ifLogin(entrance) { if (mContext is Activity) { val installPackageName = mListViewModel.canUserCommentThisGame() 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 d8f1bc423e..9993238510 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 @@ -8,6 +8,7 @@ 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.setTextWithHighlightedTextWrappedInsideWrapper import com.gh.gamecenter.PersonalHomeActivity import com.gh.gamecenter.R import com.gh.gamecenter.adapter.OnCommentCallBackListener @@ -60,7 +61,13 @@ class NewCommentAdapter(context: Context, CommentUtils.setCommentTime(holder.commentTimeTv, commentEntity.time) - holder.commentContentTv.text = commentEntity.content + if (TextUtils.isEmpty(mViewModel.answerId)) { + holder.commentContentTv.setTextWithHighlightedTextWrappedInsideWrapper( + text = commentEntity.content ?: "", + copyClickedText = true) + } else { + holder.commentContentTv.text = commentEntity.content + } val parentUser = commentEntity.parentUser if (parentUser != null && !TextUtils.isEmpty(parentUser.name)) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentFragment.kt index fcdca9fb30..6e7f01e134 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentFragment.kt @@ -169,7 +169,7 @@ open class NewCommentFragment : ListFragment override fun onResume() { super.onResume() // 在查看对话页面不需要手动处理软键盘的高度 - if (this !is CommentConversationFragment) { + if (this !is NewCommentConversationFragment) { mKeyboardHeightProvider?.setKeyboardHeightObserver(this) } }