From 1002d02f12b4a6f8747b603634cc7676222f4ea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=BE=E7=A5=A5=E4=BF=8A?= Date: Mon, 9 Dec 2024 10:27:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=90=9C=E7=B4=A2=E4=B8=9A=E5=8A=A1-?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=90=9C=E7=B4=A2=E5=8F=91=E7=8E=B0=E5=8F=96?= =?UTF-8?q?=E4=BB=A3=E7=83=AD=E9=97=A8=E6=A0=87=E7=AD=BE=E2=80=94=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=20https://jira.shanqu.cc/browse/GHZSCY-5572?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 2 + .../java/com/gh/gamecenter/SearchActivity.kt | 24 +- .../ForumOrUserSearchDefaultFragment.kt | 4 +- .../search/SearchDefaultFragment.kt | 240 +++++++++++++++--- .../search/SearchDefaultViewModel.kt | 2 +- .../res/layout/fragment_search_default.xml | 10 +- .../res/layout/search_default_rank_item.xml | 8 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- .../gamecenter/common/utils/SensorsBridge.kt | 29 +++ .../feature/entity/DiscoveryTagEntity.kt | 24 ++ .../feature/entity/SettingsEntity.kt | 2 + 12 files changed, 296 insertions(+), 53 deletions(-) create mode 100644 module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/DiscoveryTagEntity.kt diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 97c7af21ec..2a7dc05fc1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -72,6 +72,7 @@ android_build: only: - dev - release + - feat/GHZSCY-6953 # 代码检查 sonarqube_analysis: @@ -157,3 +158,4 @@ oss-upload&send-email: only: - dev - release + - feat/GHZSCY-6953 \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/SearchActivity.kt b/app/src/main/java/com/gh/gamecenter/SearchActivity.kt index 684aefa259..85fe075ce9 100644 --- a/app/src/main/java/com/gh/gamecenter/SearchActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/SearchActivity.kt @@ -191,6 +191,7 @@ open class SearchActivity : BaseActivity() { when (type) { SearchType.AUTO -> handleAutoSearch(key) SearchType.DEFAULT -> handleDefaultSearch(key) + SearchType.DISCOVERY -> handleDiscoverySearch(key) SearchType.RANK -> handleRankSearch(key) SearchType.HOT -> handleHotSearch(key) SearchType.HISTORY -> handleHistorySearch(key) @@ -244,6 +245,22 @@ open class SearchActivity : BaseActivity() { ) } + protected open fun handleDiscoverySearch(key: String?) { + mSearchKey = key + searchEt.setText(key) + searchEt.setSelection(searchEt.text.length) + updateDisplayType(GAME_DETAIL) + LogUtils.uploadSearchGame("searching", "搜索页", key, "搜索发现") + + SensorsBridge.trackSearchButtonClick( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + key ?: "", + TRACK_SEARCH_TYPE_DISCOVERY, + mSourceEntrance + ) + } + protected open fun handleDefaultSearch(key: String?) { mSearchKey = key searchEt.setText(key) @@ -391,6 +408,7 @@ open class SearchActivity : BaseActivity() { SearchType.HISTORY.value -> search(SearchType.HISTORY, search.key) SearchType.HOT.value -> search(SearchType.HOT, search.key) SearchType.RANK.value -> search(SearchType.RANK, search.key) + SearchType.DISCOVERY.value -> search(SearchType.DISCOVERY, search.key) "click" -> DataCollectionUtils.uploadSearchClick( this, mSearchKey, mSearchType.value, "搜索页面", @@ -435,6 +453,7 @@ open class SearchActivity : BaseActivity() { const val TRACK_SEARCH_TYPE_DEFAULT = "默认搜索" const val TRACK_SEARCH_TYPE_HISTORY = "历史搜索" const val TRACK_SEARCH_TYPE_RANK = "榜单搜索" + const val TRACK_SEARCH_TYPE_DISCOVERY = "搜索发现" @JvmStatic fun toTrackSearchType(type: String) = when (type) { @@ -442,6 +461,7 @@ open class SearchActivity : BaseActivity() { SearchType.MANUAL.value -> TRACK_SEARCH_TYPE_INPUT SearchType.HISTORY.value -> TRACK_SEARCH_TYPE_HISTORY SearchType.RANK.value -> TRACK_SEARCH_TYPE_RANK + SearchType.DISCOVERY.value -> TRACK_SEARCH_TYPE_DISCOVERY else -> TRACK_SEARCH_TYPE_DEFAULT } @@ -491,7 +511,8 @@ enum class SearchType(var value: String) { HISTORY("history"), MANUAL("initiative"), HOT("remen"), - RANK("rank"); + RANK("rank"), + DISCOVERY("dicovery"); fun toChinese() = when (this) { AUTO -> "自动搜索" @@ -500,6 +521,7 @@ enum class SearchType(var value: String) { MANUAL -> "主动搜索" HOT -> "热门搜索" RANK -> "榜单搜索" + DISCOVERY -> "搜索发现" } companion object { diff --git a/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchDefaultFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchDefaultFragment.kt index fc9fb1e339..4a842e1f16 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchDefaultFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchDefaultFragment.kt @@ -39,8 +39,8 @@ class ForumOrUserSearchDefaultFragment : SearchDefaultFragment() { override fun initView() { mBinding = FragmentSearchDefaultBinding.bind(mCachedView) - mBinding.hotTagHeadContainer.root.visibility = View.GONE - mBinding.hotTagFlexContainer.visibility = View.GONE + mBinding.hotAndDiscoveryTagHeadContainer.root.visibility = View.GONE + mBinding.hotAndDiscoveryTagFlexContainer.visibility = View.GONE if (mEntrance == "论坛首页" || mEntrance == "搜索栏") { mBinding.hotHeadContainer.headTitle.text = "热门论坛" mViewModel.getForumSearchHotContent() diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchDefaultFragment.kt b/app/src/main/java/com/gh/gamecenter/search/SearchDefaultFragment.kt index b29b4193f7..951d614172 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchDefaultFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchDefaultFragment.kt @@ -1,10 +1,9 @@ package com.gh.gamecenter.search -import android.graphics.Color -import android.graphics.LinearGradient -import android.graphics.Shader -import android.graphics.Typeface +import android.graphics.* import android.graphics.drawable.GradientDrawable +import android.graphics.drawable.ShapeDrawable +import android.graphics.drawable.shapes.RoundRectShape import android.os.Bundle import android.text.TextUtils import android.view.Gravity @@ -14,6 +13,7 @@ import android.widget.CheckedTextView import android.widget.TextView import androidx.appcompat.content.res.AppCompatResources import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat import androidx.viewpager.widget.PagerAdapter import com.gh.common.constant.Config import com.gh.common.exposure.ExposureManager @@ -22,6 +22,7 @@ import com.gh.common.util.DirectUtils import com.gh.common.util.NewFlatLogUtils import com.gh.gamecenter.R import com.gh.gamecenter.SearchActivity +import com.gh.gamecenter.SearchType import com.gh.gamecenter.common.base.fragment.BaseFragment import com.gh.gamecenter.common.constant.EntranceConsts import com.gh.gamecenter.common.exposure.ExposureSource @@ -35,6 +36,7 @@ import com.gh.gamecenter.databinding.TabItemSearchDefaultRankBinding import com.gh.gamecenter.db.ISearchHistoryDao import com.gh.gamecenter.db.SearchHistoryDao import com.gh.gamecenter.eventbus.EBSearch +import com.gh.gamecenter.feature.entity.DiscoveryTagEntity import com.gh.gamecenter.feature.entity.HotTagEntity import com.gh.gamecenter.feature.entity.SettingsEntity import com.gh.gamecenter.feature.exposure.ExposureEvent @@ -48,6 +50,7 @@ import org.json.JSONObject open class SearchDefaultFragment : BaseFragment() { private var mHotTagList: List? = null + private var mDiscoveryTagList: List? = null protected var mRankList: List? = null protected lateinit var mBinding: FragmentSearchDefaultBinding @@ -64,10 +67,11 @@ open class SearchDefaultFragment : BaseFragment() { // FlexboxLayout:maxLine 不符合需求 protected val mFlexMaxHeight = DisplayUtils.dip2px(57F) + protected val mHotAndDiscoveryFlexMaxHeight = DisplayUtils.dip2px(88F) + private val mDao by lazy { provideDao() } - private val mHotTagClickListener: (Int) -> Unit = { - val tag = mHotTagList!![it] + private val mHotTagClickListener: (HotTagEntity) -> Unit = { tag -> NewFlatLogUtils.logSearchHotTagClick( tag.name ?: "", tag.type ?: "", @@ -90,6 +94,29 @@ open class SearchDefaultFragment : BaseFragment() { DirectUtils.directToLinkPage(requireContext(), tag, "(搜索-${tag.name})", "", exposureEvent) // 不需要path } + private val mDiscoveryTagClickListener: (DiscoveryTagEntity, Int) -> Unit = { tag, position -> + val keyword = tag.keyword + if (keyword.isNotEmpty()) { + PageSwitchDataHelper.pushCurrentPageData( + hashMapOf( + Pair(PageSwitchDataHelper.PAGE_BUSINESS_TYPE, "游戏搜索-搜索发现"), + Pair(PageSwitchDataHelper.PAGE_BUSINESS_ID, tag.id ?: ""), + Pair(PageSwitchDataHelper.PAGE_BUSINESS_NAME, tag.text ?: " ") + ) + ) + SensorsBridge.trackEvent("SearchLabelClick", "label_name", tag.text ?: "", "label_id", tag.id ?: "") + SensorsBridge.trackSearchDiscoveryClick( + labelName = tag.text ?: "", + labelId = tag.id ?: "", + searchContent = keyword, + position = position + ) + mViewModel?.add(keyword) + EventBus.getDefault().post(EBSearch(SearchType.DISCOVERY.value, keyword)) + Util_System_Keyboard.hideSoftKeyboardByIBinder(context, mBinding.historyFlex.windowToken) + } + } + override fun getLayoutId(): Int { return R.layout.fragment_search_default } @@ -141,15 +168,23 @@ open class SearchDefaultFragment : BaseFragment() { mViewModel?.isExistRankList = mRankList?.isNotEmpty() == true mHotTagList = Config.getSettings()?.search?.hotTag - mViewModel?.isExistHotTag = mHotTagList?.isNotEmpty() == true + mDiscoveryTagList = Config.getSettings()?.search?.discoveryTag + mViewModel?.isExistHotAndDiscoveryTag = + mHotTagList?.isNotEmpty() == true || mDiscoveryTagList?.isNotEmpty() == true updateHistorySearchView(null) mViewModel?.historySearchLiveData?.observe(viewLifecycleOwner) { updateHistorySearchView(it) } - mBinding.hotTagFlexContainer.setLimitHeight(mFlexMaxHeight) - createFlexContent(mBinding.hotTagFlex, getTagListString(), true, clickListener = mHotTagClickListener) + mBinding.hotAndDiscoveryTagFlexContainer.setLimitHeight(mHotAndDiscoveryFlexMaxHeight) + createHotAndDiscoveryFlexContent( + mBinding.hotAndDiscoveryTagFlex, + getHotTagList(), + getDiscoveryTagList(), + hotTagClickListener = mHotTagClickListener, + discoveryTagClickListener = mDiscoveryTagClickListener + ) initHeadView() initRankViewPager() } @@ -181,9 +216,9 @@ open class SearchDefaultFragment : BaseFragment() { mBinding.hotHeadContainer.headTitle.text = getString(R.string.search_hot) mBinding.hotHeadContainer.headTitle.textSize = 16F mBinding.hotHeadContainer.headActionTv.visibility = View.GONE - mBinding.hotTagHeadContainer.headTitle.text = getString(R.string.search_hot_tag) - mBinding.hotTagHeadContainer.headTitle.textSize = 16F - mBinding.hotTagHeadContainer.headActionTv.visibility = View.GONE + mBinding.hotAndDiscoveryTagHeadContainer.headTitle.text = getString(R.string.search_discovery_tag) + mBinding.hotAndDiscoveryTagHeadContainer.headTitle.textSize = 16F + mBinding.hotAndDiscoveryTagHeadContainer.headActionTv.visibility = View.GONE } protected open fun initRankViewPager() { @@ -318,8 +353,8 @@ open class SearchDefaultFragment : BaseFragment() { mBinding.historyHeadContainer.root.visibility = if (mViewModel?.isExistHistory == true) View.VISIBLE else View.GONE mBinding.historyFlex.visibility = if (mViewModel?.isExistHistory == true) View.VISIBLE else View.GONE - mBinding.hotTagHeadContainer.root.layoutParams = - (mBinding.hotTagHeadContainer.root.layoutParams as ConstraintLayout.LayoutParams).apply { + mBinding.hotAndDiscoveryTagHeadContainer.root.layoutParams = + (mBinding.hotAndDiscoveryTagHeadContainer.root.layoutParams as ConstraintLayout.LayoutParams).apply { setMargins( 0, if (mViewModel?.isExistHistory == true) 16F.dip2px() else 0, @@ -331,14 +366,15 @@ open class SearchDefaultFragment : BaseFragment() { (mBinding.hotHeadContainer.root.layoutParams as ConstraintLayout.LayoutParams).apply { setMargins( 0, - if (mViewModel?.isExistHistory == false && mViewModel?.isExistHotTag == false) 16F.dip2px() else 0, + if (mViewModel?.isExistHistory == false && mViewModel?.isExistHotAndDiscoveryTag == false) 16F.dip2px() else 0, 0, 0 ) } - mBinding.hotTagHeadContainer.root.visibility = - if (mViewModel?.isExistHotTag == true) View.VISIBLE else View.GONE - mBinding.hotTagFlex.visibility = if (mViewModel?.isExistHotTag == true) View.VISIBLE else View.GONE + mBinding.hotAndDiscoveryTagHeadContainer.root.visibility = + if (mViewModel?.isExistHotAndDiscoveryTag == true) View.VISIBLE else View.GONE + mBinding.hotAndDiscoveryTagFlex.visibility = + if (mViewModel?.isExistHotAndDiscoveryTag == true) View.VISIBLE else View.GONE mBinding.hotHeadContainer.root.visibility = if (mViewModel?.isExistHotSearch == true) View.VISIBLE else View.GONE mBinding.hotList.visibility = if (mViewModel?.isExistHotSearch == true) View.VISIBLE else View.GONE @@ -361,20 +397,31 @@ open class SearchDefaultFragment : BaseFragment() { } } - private fun getTagListString(): List { - val list = ArrayList() + private fun getHotTagList(): List { + val list = ArrayList() if (mHotTagList != null) { for (entity in mHotTagList!!) { - entity.name?.let { list.add(it) } + if (list.size == 8) break // 最多显示8个热门标签 + entity.name?.let { list.add(entity) } } } return list } + private fun getDiscoveryTagList(): List { + val list = ArrayList() + if (mDiscoveryTagList != null) { + for (entity in mDiscoveryTagList!!) { + entity.text?.let { list.add(entity) } + } + } + return list + } + + fun createFlexContent( flexView: FlexboxLayout, contentList: List?, - isHotTag: Boolean = false, clickListener: (Int) -> Unit ) { @@ -388,16 +435,12 @@ open class SearchDefaultFragment : BaseFragment() { val params = FlexboxLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 24F.dip2px()) flexCell.layoutParams = params - if (isHotTag && !mHotTagList.isNullOrEmpty() && mHotTagList!![index].isGuessSearch) { - createSmartHotTagStyle(flexCell, contentList[index]) - } else { - flexCell.setSingleLine() - flexCell.ellipsize = TextUtils.TruncateAt.END - flexCell.gravity = Gravity.CENTER - flexCell.textSize = 12F - flexCell.text = StringUtils.shrinkStringWithDot(contentList[index], 6) - flexCell.setTextColor(com.gh.gamecenter.common.R.color.text_secondary.toColor(requireContext())) - } + flexCell.setSingleLine() + flexCell.ellipsize = TextUtils.TruncateAt.END + flexCell.gravity = Gravity.CENTER + flexCell.textSize = 12F + flexCell.text = StringUtils.shrinkStringWithDot(contentList[index], 6) + flexCell.setTextColor(com.gh.gamecenter.common.R.color.text_secondary.toColor(requireContext())) flexCell.setPadding(8F.dip2px(), 0, 8F.dip2px(), 0) flexCell.background = if (mIsDarkModeOn) GradientDrawable().apply { setStroke(0.5F.dip2px(), Color.parseColor("#21FFFFFF")) @@ -409,16 +452,84 @@ open class SearchDefaultFragment : BaseFragment() { } } - private fun createSmartHotTagStyle(flexCell: TextView, name: String) { - flexCell.setDrawableStart(R.drawable.ic_smart_search) + private fun createHotAndDiscoveryFlexContent( + flexView: FlexboxLayout, + hotTagList: List, + discoveryTagList: List, + hotTagClickListener: (HotTagEntity) -> Unit, + discoveryTagClickListener: (DiscoveryTagEntity, Int) -> Unit + ) { + if (hotTagList.isEmpty() && discoveryTagList.isEmpty()) return + + flexView.removeAllViews() + + createHotFlexContent(flexView, hotTagList, hotTagClickListener) + + createDiscoveryFlexContent(flexView, discoveryTagList, discoveryTagClickListener) + } + + private fun createHotFlexContent( + flexView: FlexboxLayout, + contentList: List?, + clickListener: (HotTagEntity) -> Unit + ) { + if (contentList.isNullOrEmpty()) return + + for (index in 0 until contentList.count()) { + val flexCell = TextView(context) + flexView.addView(flexCell) + + flexCell.layoutParams = FlexboxLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, 24F.dip2px() + ) + + createSmartHotTagStyle(flexCell, contentList[index]) + + flexCell.setOnClickListener { + clickListener.invoke(contentList[index]) + } + } + } + + private fun createDiscoveryFlexContent( + flexView: FlexboxLayout, + contentList: List?, + clickListener: (DiscoveryTagEntity, Int) -> Unit + ) { + if (contentList.isNullOrEmpty()) return + + for (index in 0 until contentList.count()) { + val flexCell = TextView(context) + flexView.addView(flexCell) + + flexCell.layoutParams = FlexboxLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, 24F.dip2px() + ) + + createSmartDiscoverTagStyle(flexCell, contentList[index]) + + flexCell.setPadding(8F.dip2px(), 0, 8F.dip2px(), 0) + flexCell.background = if (mIsDarkModeOn) GradientDrawable().apply { + setStroke(0.5F.dip2px(), Color.parseColor("#21FFFFFF")) + cornerRadius = 999F + } else DrawableView.getStrokeDrawable(com.gh.gamecenter.common.R.color.text_dddddd, 0.5F) + flexCell.setOnClickListener { + clickListener.invoke(contentList[index], index) + } + } + } + + private fun createSmartHotTagStyle(flexCell: TextView, entity: HotTagEntity) { flexCell.compoundDrawablePadding = 4F.dip2px() flexCell.gravity = Gravity.CENTER_VERTICAL - flexCell.typeface = Typeface.DEFAULT_BOLD flexCell.textSize = 12F - flexCell.text = StringUtils.shrinkStringWithDot(name, 6) - flexCell.setTextColor(Color.WHITE) + flexCell.text = StringUtils.shrinkStringWithDot(entity.name, 6) + flexCell.setPadding(8F.dip2px(), 0, 8F.dip2px(), 0) val colors = - intArrayOf(com.gh.gamecenter.common.R.color.text_FFB749.toColor(requireContext()), com.gh.gamecenter.common.R.color.text_FF6D3C.toColor(requireContext())) + intArrayOf( + com.gh.gamecenter.common.R.color.text_FFB749.toColor(requireContext()), + com.gh.gamecenter.common.R.color.text_FF6D3C.toColor(requireContext()) + ) val position = floatArrayOf(0F, 1F) val linearGradient = LinearGradient( 0F, @@ -429,10 +540,53 @@ open class SearchDefaultFragment : BaseFragment() { position, Shader.TileMode.CLAMP ) - flexCell.paint.shader = linearGradient + val shapeRadius = floatArrayOf(999F, 999F, 999F, 999F, 999F, 999F, 999F, 999F) + val strokeWidth = 0.5F.dip2px().toFloat() + val shape = RoundRectShape(shapeRadius, RectF(strokeWidth, strokeWidth, strokeWidth, strokeWidth), shapeRadius) + flexCell.background = ShapeDrawable(shape).apply { + paint.shader = linearGradient + } + if (entity.isGuessSearch) { + flexCell.setTextColor(Color.WHITE) + flexCell.typeface = Typeface.DEFAULT_BOLD + flexCell.setDrawableStart(R.drawable.ic_smart_search) + flexCell.paint.shader = linearGradient + } else { + flexCell.setTextColor( + ContextCompat.getColor( + requireContext(), + com.gh.gamecenter.common.R.color.text_secondary + ) + ) + } flexCell.invalidate() } + private fun createSmartDiscoverTagStyle(flexCell: TextView, entity: DiscoveryTagEntity) { + val labelIcon = when (entity.recommendType) { + "hot" -> R.drawable.ic_search_hot + "new" -> R.drawable.ic_search_new + "surge", "rise" -> R.drawable.ic_search_rise + "update" -> R.drawable.ic_search_update + else -> -1 + } + if (labelIcon != -1) { + flexCell.setDrawableEnd(labelIcon.toDrawable()) + flexCell.compoundDrawablePadding = 4F.dip2px() + } + flexCell.setSingleLine() + flexCell.ellipsize = TextUtils.TruncateAt.END + flexCell.gravity = Gravity.CENTER + flexCell.textSize = 12F + flexCell.text = entity.text + flexCell.setTextColor(com.gh.gamecenter.common.R.color.text_secondary.toColor(requireContext())) + flexCell.setPadding(8F.dip2px(), 0, 8F.dip2px(), 0) + flexCell.background = if (mIsDarkModeOn) GradientDrawable().apply { + setStroke(0.5F.dip2px(), Color.parseColor("#21FFFFFF")) + cornerRadius = 999F + } else DrawableView.getStrokeDrawable(com.gh.gamecenter.common.R.color.text_dddddd, 0.5F) + } + private fun postExposureEvent(index: Int) { mRankList?.safelyGetInRelease(index)?.content?.forEach { if (it.link.type == "game") { @@ -451,7 +605,13 @@ open class SearchDefaultFragment : BaseFragment() { notifyItemRangeChanged(0, itemCount) } mViewModel?.historySearchLiveData?.value?.let { updateHistorySearchView(it) } - createFlexContent(mBinding.hotTagFlex, getTagListString(), true, clickListener = mHotTagClickListener) + createHotAndDiscoveryFlexContent( + mBinding.hotAndDiscoveryTagFlex, + getHotTagList(), + getDiscoveryTagList(), + hotTagClickListener = mHotTagClickListener, + discoveryTagClickListener = mDiscoveryTagClickListener + ) } protected open fun provideDao(): ISearchHistoryDao = diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchDefaultViewModel.kt b/app/src/main/java/com/gh/gamecenter/search/SearchDefaultViewModel.kt index 1c7543a975..107f140043 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchDefaultViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchDefaultViewModel.kt @@ -11,7 +11,7 @@ class SearchDefaultViewModel(private val dao: ISearchHistoryDao) : ViewModel() { it } var isExistHotSearch: Boolean = false - var isExistHotTag: Boolean = false + var isExistHotAndDiscoveryTag: Boolean = false var isExistHistory: Boolean = false var isExistRankList: Boolean = false diff --git a/app/src/main/res/layout/fragment_search_default.xml b/app/src/main/res/layout/fragment_search_default.xml index d62cc0b376..c0a97ba988 100644 --- a/app/src/main/res/layout/fragment_search_default.xml +++ b/app/src/main/res/layout/fragment_search_default.xml @@ -36,7 +36,7 @@ + app:layout_constraintTop_toBottomOf="@id/hotAndDiscoveryTagHeadContainer"> + app:layout_constraintTop_toBottomOf="@id/hot_and_discovery_tag_flex_container" /> + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="@+id/name" + app:layout_constraintHorizontal_bias="0" + app:layout_constraintHorizontal_chainStyle="packed"/> 全部開始 搜索中... 熱門搜索 - 熱門標簽 + 搜索發現 歷史搜索 我關註的遊戲 請輸入搜索關鍵字 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b4b776f11f..d100fa02a6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -18,7 +18,7 @@ 全部开始 搜索中... 热门搜索 - 热门标签 + 搜索发现 历史搜索 我关注的游戏 请输入搜索关键字 diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt b/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt index b4fd3c83fc..23b3fc86c5 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt @@ -88,6 +88,8 @@ object SensorsBridge { private const val KEY_VERIFICATION_TYPE = "verification_type" private const val KEY_VIDEO_ID = "video_id" private const val KEY_PLAY_TYPE = "play_type" + private const val KEY_LABEL_NAME = "label_name" + private const val KEY_LABEL_ID = "label_id" const val KEY_BOTTOM_TAB = "bottom_tab" const val KEY_MULTI_TAB_NAME = "several_tab_page_name" const val KEY_MULTI_TAB_ID = "several_tab_page_id" @@ -291,6 +293,8 @@ object SensorsBridge { private const val EVENT_COLUMN_TEST_CLICK = "ColumnTestClick" + private const val EVENT_SEARCH_DISCOVERY_CLICK = "SearchDiscoveryClick" + private const val EVENT_BYPASS_BROWSING = "BypassBrowsing" private const val EVENT_FAIL_BYPASS = "FailBypass" @@ -4996,4 +5000,29 @@ object SensorsBridge { } trackEvent(EVENT_APPOINTMENT_GAME_ONLINE_DIALOG_CLICK, json) } + /** + * 事件ID:SearchDiscoveryClick + * 事件名称:搜索发现点击事件 + * 触发时机:点击搜索发现时触发 + * @param labelName 标签名称 + * @param labelId 标签ID + * @param searchContent 搜索内容 + * @param position 序号 + * @see EVENT_SEARCH_DISCOVERY_CLICK + */ + fun trackSearchDiscoveryClick( + labelName: String, + labelId: String, + searchContent: String, + position: Int + ) { + val json = json { + KEY_LABEL_NAME to labelName + KEY_LABEL_ID to labelId + KEY_SEARCH_CONTENT to searchContent + KEY_POSITION to position + } + trackEvent(EVENT_SEARCH_DISCOVERY_CLICK, json) + } + } \ No newline at end of file diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/DiscoveryTagEntity.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/DiscoveryTagEntity.kt new file mode 100644 index 0000000000..8a10b36392 --- /dev/null +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/DiscoveryTagEntity.kt @@ -0,0 +1,24 @@ +package com.gh.gamecenter.feature.entity + +import android.os.Parcelable +import com.google.gson.annotations.SerializedName +import kotlinx.parcelize.Parcelize + +@Parcelize +class DiscoveryTagEntity( + @SerializedName("_id") + var id: String? = "", + var text: String? = "", + @SerializedName("keyword") + var _keyword: String? = "", + @SerializedName("recommend_type") + var recommendType: String = "" +) : Parcelable { + val keyword get(): String { + val keyword = this._keyword + if (keyword.isNullOrEmpty()) { + return text ?: "" + } + return keyword + } +} \ No newline at end of file diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/SettingsEntity.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/SettingsEntity.kt index b2f0f25493..41ea57819a 100644 --- a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/SettingsEntity.kt +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/SettingsEntity.kt @@ -70,6 +70,8 @@ class SettingsEntity( var hotSearch: List? = listOf(), @SerializedName("tag") var hotTag: List? = listOf(), + @SerializedName("discover_tag") + var discoveryTag: List? = listOf(), @SerializedName("hot_list") var rankList: List? = listOf(), @SerializedName("wechat_game_search_list")