feat: 搜索业务-新增搜索发现取代热门标签—客户端 https://jira.shanqu.cc/browse/GHZSCY-5572
This commit is contained in:
@ -72,6 +72,7 @@ android_build:
|
|||||||
only:
|
only:
|
||||||
- dev
|
- dev
|
||||||
- release
|
- release
|
||||||
|
- feat/GHZSCY-6953
|
||||||
|
|
||||||
# 代码检查
|
# 代码检查
|
||||||
sonarqube_analysis:
|
sonarqube_analysis:
|
||||||
@ -157,3 +158,4 @@ oss-upload&send-email:
|
|||||||
only:
|
only:
|
||||||
- dev
|
- dev
|
||||||
- release
|
- release
|
||||||
|
- feat/GHZSCY-6953
|
||||||
@ -191,6 +191,7 @@ open class SearchActivity : BaseActivity() {
|
|||||||
when (type) {
|
when (type) {
|
||||||
SearchType.AUTO -> handleAutoSearch(key)
|
SearchType.AUTO -> handleAutoSearch(key)
|
||||||
SearchType.DEFAULT -> handleDefaultSearch(key)
|
SearchType.DEFAULT -> handleDefaultSearch(key)
|
||||||
|
SearchType.DISCOVERY -> handleDiscoverySearch(key)
|
||||||
SearchType.RANK -> handleRankSearch(key)
|
SearchType.RANK -> handleRankSearch(key)
|
||||||
SearchType.HOT -> handleHotSearch(key)
|
SearchType.HOT -> handleHotSearch(key)
|
||||||
SearchType.HISTORY -> handleHistorySearch(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?) {
|
protected open fun handleDefaultSearch(key: String?) {
|
||||||
mSearchKey = key
|
mSearchKey = key
|
||||||
searchEt.setText(key)
|
searchEt.setText(key)
|
||||||
@ -391,6 +408,7 @@ open class SearchActivity : BaseActivity() {
|
|||||||
SearchType.HISTORY.value -> search(SearchType.HISTORY, search.key)
|
SearchType.HISTORY.value -> search(SearchType.HISTORY, search.key)
|
||||||
SearchType.HOT.value -> search(SearchType.HOT, search.key)
|
SearchType.HOT.value -> search(SearchType.HOT, search.key)
|
||||||
SearchType.RANK.value -> search(SearchType.RANK, search.key)
|
SearchType.RANK.value -> search(SearchType.RANK, search.key)
|
||||||
|
SearchType.DISCOVERY.value -> search(SearchType.DISCOVERY, search.key)
|
||||||
|
|
||||||
"click" -> DataCollectionUtils.uploadSearchClick(
|
"click" -> DataCollectionUtils.uploadSearchClick(
|
||||||
this, mSearchKey, mSearchType.value, "搜索页面",
|
this, mSearchKey, mSearchType.value, "搜索页面",
|
||||||
@ -435,6 +453,7 @@ open class SearchActivity : BaseActivity() {
|
|||||||
const val TRACK_SEARCH_TYPE_DEFAULT = "默认搜索"
|
const val TRACK_SEARCH_TYPE_DEFAULT = "默认搜索"
|
||||||
const val TRACK_SEARCH_TYPE_HISTORY = "历史搜索"
|
const val TRACK_SEARCH_TYPE_HISTORY = "历史搜索"
|
||||||
const val TRACK_SEARCH_TYPE_RANK = "榜单搜索"
|
const val TRACK_SEARCH_TYPE_RANK = "榜单搜索"
|
||||||
|
const val TRACK_SEARCH_TYPE_DISCOVERY = "搜索发现"
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun toTrackSearchType(type: String) = when (type) {
|
fun toTrackSearchType(type: String) = when (type) {
|
||||||
@ -442,6 +461,7 @@ open class SearchActivity : BaseActivity() {
|
|||||||
SearchType.MANUAL.value -> TRACK_SEARCH_TYPE_INPUT
|
SearchType.MANUAL.value -> TRACK_SEARCH_TYPE_INPUT
|
||||||
SearchType.HISTORY.value -> TRACK_SEARCH_TYPE_HISTORY
|
SearchType.HISTORY.value -> TRACK_SEARCH_TYPE_HISTORY
|
||||||
SearchType.RANK.value -> TRACK_SEARCH_TYPE_RANK
|
SearchType.RANK.value -> TRACK_SEARCH_TYPE_RANK
|
||||||
|
SearchType.DISCOVERY.value -> TRACK_SEARCH_TYPE_DISCOVERY
|
||||||
else -> TRACK_SEARCH_TYPE_DEFAULT
|
else -> TRACK_SEARCH_TYPE_DEFAULT
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -491,7 +511,8 @@ enum class SearchType(var value: String) {
|
|||||||
HISTORY("history"),
|
HISTORY("history"),
|
||||||
MANUAL("initiative"),
|
MANUAL("initiative"),
|
||||||
HOT("remen"),
|
HOT("remen"),
|
||||||
RANK("rank");
|
RANK("rank"),
|
||||||
|
DISCOVERY("dicovery");
|
||||||
|
|
||||||
fun toChinese() = when (this) {
|
fun toChinese() = when (this) {
|
||||||
AUTO -> "自动搜索"
|
AUTO -> "自动搜索"
|
||||||
@ -500,6 +521,7 @@ enum class SearchType(var value: String) {
|
|||||||
MANUAL -> "主动搜索"
|
MANUAL -> "主动搜索"
|
||||||
HOT -> "热门搜索"
|
HOT -> "热门搜索"
|
||||||
RANK -> "榜单搜索"
|
RANK -> "榜单搜索"
|
||||||
|
DISCOVERY -> "搜索发现"
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
@ -39,8 +39,8 @@ class ForumOrUserSearchDefaultFragment : SearchDefaultFragment() {
|
|||||||
|
|
||||||
override fun initView() {
|
override fun initView() {
|
||||||
mBinding = FragmentSearchDefaultBinding.bind(mCachedView)
|
mBinding = FragmentSearchDefaultBinding.bind(mCachedView)
|
||||||
mBinding.hotTagHeadContainer.root.visibility = View.GONE
|
mBinding.hotAndDiscoveryTagHeadContainer.root.visibility = View.GONE
|
||||||
mBinding.hotTagFlexContainer.visibility = View.GONE
|
mBinding.hotAndDiscoveryTagFlexContainer.visibility = View.GONE
|
||||||
if (mEntrance == "论坛首页" || mEntrance == "搜索栏") {
|
if (mEntrance == "论坛首页" || mEntrance == "搜索栏") {
|
||||||
mBinding.hotHeadContainer.headTitle.text = "热门论坛"
|
mBinding.hotHeadContainer.headTitle.text = "热门论坛"
|
||||||
mViewModel.getForumSearchHotContent()
|
mViewModel.getForumSearchHotContent()
|
||||||
|
|||||||
@ -1,10 +1,9 @@
|
|||||||
package com.gh.gamecenter.search
|
package com.gh.gamecenter.search
|
||||||
|
|
||||||
import android.graphics.Color
|
import android.graphics.*
|
||||||
import android.graphics.LinearGradient
|
|
||||||
import android.graphics.Shader
|
|
||||||
import android.graphics.Typeface
|
|
||||||
import android.graphics.drawable.GradientDrawable
|
import android.graphics.drawable.GradientDrawable
|
||||||
|
import android.graphics.drawable.ShapeDrawable
|
||||||
|
import android.graphics.drawable.shapes.RoundRectShape
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
import android.view.Gravity
|
import android.view.Gravity
|
||||||
@ -14,6 +13,7 @@ import android.widget.CheckedTextView
|
|||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.appcompat.content.res.AppCompatResources
|
import androidx.appcompat.content.res.AppCompatResources
|
||||||
import androidx.constraintlayout.widget.ConstraintLayout
|
import androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.viewpager.widget.PagerAdapter
|
import androidx.viewpager.widget.PagerAdapter
|
||||||
import com.gh.common.constant.Config
|
import com.gh.common.constant.Config
|
||||||
import com.gh.common.exposure.ExposureManager
|
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.common.util.NewFlatLogUtils
|
||||||
import com.gh.gamecenter.R
|
import com.gh.gamecenter.R
|
||||||
import com.gh.gamecenter.SearchActivity
|
import com.gh.gamecenter.SearchActivity
|
||||||
|
import com.gh.gamecenter.SearchType
|
||||||
import com.gh.gamecenter.common.base.fragment.BaseFragment
|
import com.gh.gamecenter.common.base.fragment.BaseFragment
|
||||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
import com.gh.gamecenter.common.constant.EntranceConsts
|
||||||
import com.gh.gamecenter.common.exposure.ExposureSource
|
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.ISearchHistoryDao
|
||||||
import com.gh.gamecenter.db.SearchHistoryDao
|
import com.gh.gamecenter.db.SearchHistoryDao
|
||||||
import com.gh.gamecenter.eventbus.EBSearch
|
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.HotTagEntity
|
||||||
import com.gh.gamecenter.feature.entity.SettingsEntity
|
import com.gh.gamecenter.feature.entity.SettingsEntity
|
||||||
import com.gh.gamecenter.feature.exposure.ExposureEvent
|
import com.gh.gamecenter.feature.exposure.ExposureEvent
|
||||||
@ -48,6 +50,7 @@ import org.json.JSONObject
|
|||||||
open class SearchDefaultFragment : BaseFragment<Any>() {
|
open class SearchDefaultFragment : BaseFragment<Any>() {
|
||||||
|
|
||||||
private var mHotTagList: List<HotTagEntity>? = null
|
private var mHotTagList: List<HotTagEntity>? = null
|
||||||
|
private var mDiscoveryTagList: List<DiscoveryTagEntity>? = null
|
||||||
protected var mRankList: List<SettingsEntity.Search.RankList>? = null
|
protected var mRankList: List<SettingsEntity.Search.RankList>? = null
|
||||||
|
|
||||||
protected lateinit var mBinding: FragmentSearchDefaultBinding
|
protected lateinit var mBinding: FragmentSearchDefaultBinding
|
||||||
@ -64,10 +67,11 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
|||||||
// FlexboxLayout:maxLine 不符合需求
|
// FlexboxLayout:maxLine 不符合需求
|
||||||
protected val mFlexMaxHeight = DisplayUtils.dip2px(57F)
|
protected val mFlexMaxHeight = DisplayUtils.dip2px(57F)
|
||||||
|
|
||||||
|
protected val mHotAndDiscoveryFlexMaxHeight = DisplayUtils.dip2px(88F)
|
||||||
|
|
||||||
private val mDao by lazy { provideDao() }
|
private val mDao by lazy { provideDao() }
|
||||||
|
|
||||||
private val mHotTagClickListener: (Int) -> Unit = {
|
private val mHotTagClickListener: (HotTagEntity) -> Unit = { tag ->
|
||||||
val tag = mHotTagList!![it]
|
|
||||||
NewFlatLogUtils.logSearchHotTagClick(
|
NewFlatLogUtils.logSearchHotTagClick(
|
||||||
tag.name ?: "",
|
tag.name ?: "",
|
||||||
tag.type ?: "",
|
tag.type ?: "",
|
||||||
@ -90,6 +94,29 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
|||||||
DirectUtils.directToLinkPage(requireContext(), tag, "(搜索-${tag.name})", "", exposureEvent) // 不需要path
|
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 {
|
override fun getLayoutId(): Int {
|
||||||
return R.layout.fragment_search_default
|
return R.layout.fragment_search_default
|
||||||
}
|
}
|
||||||
@ -141,15 +168,23 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
|||||||
mViewModel?.isExistRankList = mRankList?.isNotEmpty() == true
|
mViewModel?.isExistRankList = mRankList?.isNotEmpty() == true
|
||||||
|
|
||||||
mHotTagList = Config.getSettings()?.search?.hotTag
|
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)
|
updateHistorySearchView(null)
|
||||||
mViewModel?.historySearchLiveData?.observe(viewLifecycleOwner) {
|
mViewModel?.historySearchLiveData?.observe(viewLifecycleOwner) {
|
||||||
updateHistorySearchView(it)
|
updateHistorySearchView(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
mBinding.hotTagFlexContainer.setLimitHeight(mFlexMaxHeight)
|
mBinding.hotAndDiscoveryTagFlexContainer.setLimitHeight(mHotAndDiscoveryFlexMaxHeight)
|
||||||
createFlexContent(mBinding.hotTagFlex, getTagListString(), true, clickListener = mHotTagClickListener)
|
createHotAndDiscoveryFlexContent(
|
||||||
|
mBinding.hotAndDiscoveryTagFlex,
|
||||||
|
getHotTagList(),
|
||||||
|
getDiscoveryTagList(),
|
||||||
|
hotTagClickListener = mHotTagClickListener,
|
||||||
|
discoveryTagClickListener = mDiscoveryTagClickListener
|
||||||
|
)
|
||||||
initHeadView()
|
initHeadView()
|
||||||
initRankViewPager()
|
initRankViewPager()
|
||||||
}
|
}
|
||||||
@ -181,9 +216,9 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
|||||||
mBinding.hotHeadContainer.headTitle.text = getString(R.string.search_hot)
|
mBinding.hotHeadContainer.headTitle.text = getString(R.string.search_hot)
|
||||||
mBinding.hotHeadContainer.headTitle.textSize = 16F
|
mBinding.hotHeadContainer.headTitle.textSize = 16F
|
||||||
mBinding.hotHeadContainer.headActionTv.visibility = View.GONE
|
mBinding.hotHeadContainer.headActionTv.visibility = View.GONE
|
||||||
mBinding.hotTagHeadContainer.headTitle.text = getString(R.string.search_hot_tag)
|
mBinding.hotAndDiscoveryTagHeadContainer.headTitle.text = getString(R.string.search_discovery_tag)
|
||||||
mBinding.hotTagHeadContainer.headTitle.textSize = 16F
|
mBinding.hotAndDiscoveryTagHeadContainer.headTitle.textSize = 16F
|
||||||
mBinding.hotTagHeadContainer.headActionTv.visibility = View.GONE
|
mBinding.hotAndDiscoveryTagHeadContainer.headActionTv.visibility = View.GONE
|
||||||
}
|
}
|
||||||
|
|
||||||
protected open fun initRankViewPager() {
|
protected open fun initRankViewPager() {
|
||||||
@ -318,8 +353,8 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
|||||||
mBinding.historyHeadContainer.root.visibility =
|
mBinding.historyHeadContainer.root.visibility =
|
||||||
if (mViewModel?.isExistHistory == true) View.VISIBLE else View.GONE
|
if (mViewModel?.isExistHistory == true) View.VISIBLE else View.GONE
|
||||||
mBinding.historyFlex.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.hotAndDiscoveryTagHeadContainer.root.layoutParams =
|
||||||
(mBinding.hotTagHeadContainer.root.layoutParams as ConstraintLayout.LayoutParams).apply {
|
(mBinding.hotAndDiscoveryTagHeadContainer.root.layoutParams as ConstraintLayout.LayoutParams).apply {
|
||||||
setMargins(
|
setMargins(
|
||||||
0,
|
0,
|
||||||
if (mViewModel?.isExistHistory == true) 16F.dip2px() else 0,
|
if (mViewModel?.isExistHistory == true) 16F.dip2px() else 0,
|
||||||
@ -331,14 +366,15 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
|||||||
(mBinding.hotHeadContainer.root.layoutParams as ConstraintLayout.LayoutParams).apply {
|
(mBinding.hotHeadContainer.root.layoutParams as ConstraintLayout.LayoutParams).apply {
|
||||||
setMargins(
|
setMargins(
|
||||||
0,
|
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,
|
||||||
0
|
0
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
mBinding.hotTagHeadContainer.root.visibility =
|
mBinding.hotAndDiscoveryTagHeadContainer.root.visibility =
|
||||||
if (mViewModel?.isExistHotTag == true) View.VISIBLE else View.GONE
|
if (mViewModel?.isExistHotAndDiscoveryTag == true) View.VISIBLE else View.GONE
|
||||||
mBinding.hotTagFlex.visibility = if (mViewModel?.isExistHotTag == true) View.VISIBLE else View.GONE
|
mBinding.hotAndDiscoveryTagFlex.visibility =
|
||||||
|
if (mViewModel?.isExistHotAndDiscoveryTag == true) View.VISIBLE else View.GONE
|
||||||
mBinding.hotHeadContainer.root.visibility =
|
mBinding.hotHeadContainer.root.visibility =
|
||||||
if (mViewModel?.isExistHotSearch == true) View.VISIBLE else View.GONE
|
if (mViewModel?.isExistHotSearch == true) View.VISIBLE else View.GONE
|
||||||
mBinding.hotList.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<Any>() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getTagListString(): List<String> {
|
private fun getHotTagList(): List<HotTagEntity> {
|
||||||
val list = ArrayList<String>()
|
val list = ArrayList<HotTagEntity>()
|
||||||
if (mHotTagList != null) {
|
if (mHotTagList != null) {
|
||||||
for (entity in mHotTagList!!) {
|
for (entity in mHotTagList!!) {
|
||||||
entity.name?.let { list.add(it) }
|
if (list.size == 8) break // 最多显示8个热门标签
|
||||||
|
entity.name?.let { list.add(entity) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return list
|
return list
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getDiscoveryTagList(): List<DiscoveryTagEntity> {
|
||||||
|
val list = ArrayList<DiscoveryTagEntity>()
|
||||||
|
if (mDiscoveryTagList != null) {
|
||||||
|
for (entity in mDiscoveryTagList!!) {
|
||||||
|
entity.text?.let { list.add(entity) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
fun createFlexContent(
|
fun createFlexContent(
|
||||||
flexView: FlexboxLayout,
|
flexView: FlexboxLayout,
|
||||||
contentList: List<String>?,
|
contentList: List<String>?,
|
||||||
isHotTag: Boolean = false,
|
|
||||||
clickListener: (Int) -> Unit
|
clickListener: (Int) -> Unit
|
||||||
) {
|
) {
|
||||||
|
|
||||||
@ -388,16 +435,12 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
|||||||
val params = FlexboxLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 24F.dip2px())
|
val params = FlexboxLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 24F.dip2px())
|
||||||
flexCell.layoutParams = params
|
flexCell.layoutParams = params
|
||||||
|
|
||||||
if (isHotTag && !mHotTagList.isNullOrEmpty() && mHotTagList!![index].isGuessSearch) {
|
flexCell.setSingleLine()
|
||||||
createSmartHotTagStyle(flexCell, contentList[index])
|
flexCell.ellipsize = TextUtils.TruncateAt.END
|
||||||
} else {
|
flexCell.gravity = Gravity.CENTER
|
||||||
flexCell.setSingleLine()
|
flexCell.textSize = 12F
|
||||||
flexCell.ellipsize = TextUtils.TruncateAt.END
|
flexCell.text = StringUtils.shrinkStringWithDot(contentList[index], 6)
|
||||||
flexCell.gravity = Gravity.CENTER
|
flexCell.setTextColor(com.gh.gamecenter.common.R.color.text_secondary.toColor(requireContext()))
|
||||||
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.setPadding(8F.dip2px(), 0, 8F.dip2px(), 0)
|
||||||
flexCell.background = if (mIsDarkModeOn) GradientDrawable().apply {
|
flexCell.background = if (mIsDarkModeOn) GradientDrawable().apply {
|
||||||
setStroke(0.5F.dip2px(), Color.parseColor("#21FFFFFF"))
|
setStroke(0.5F.dip2px(), Color.parseColor("#21FFFFFF"))
|
||||||
@ -409,16 +452,84 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createSmartHotTagStyle(flexCell: TextView, name: String) {
|
private fun createHotAndDiscoveryFlexContent(
|
||||||
flexCell.setDrawableStart(R.drawable.ic_smart_search)
|
flexView: FlexboxLayout,
|
||||||
|
hotTagList: List<HotTagEntity>,
|
||||||
|
discoveryTagList: List<DiscoveryTagEntity>,
|
||||||
|
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<HotTagEntity>?,
|
||||||
|
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<DiscoveryTagEntity>?,
|
||||||
|
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.compoundDrawablePadding = 4F.dip2px()
|
||||||
flexCell.gravity = Gravity.CENTER_VERTICAL
|
flexCell.gravity = Gravity.CENTER_VERTICAL
|
||||||
flexCell.typeface = Typeface.DEFAULT_BOLD
|
|
||||||
flexCell.textSize = 12F
|
flexCell.textSize = 12F
|
||||||
flexCell.text = StringUtils.shrinkStringWithDot(name, 6)
|
flexCell.text = StringUtils.shrinkStringWithDot(entity.name, 6)
|
||||||
flexCell.setTextColor(Color.WHITE)
|
flexCell.setPadding(8F.dip2px(), 0, 8F.dip2px(), 0)
|
||||||
val colors =
|
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 position = floatArrayOf(0F, 1F)
|
||||||
val linearGradient = LinearGradient(
|
val linearGradient = LinearGradient(
|
||||||
0F,
|
0F,
|
||||||
@ -429,10 +540,53 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
|||||||
position,
|
position,
|
||||||
Shader.TileMode.CLAMP
|
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()
|
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) {
|
private fun postExposureEvent(index: Int) {
|
||||||
mRankList?.safelyGetInRelease(index)?.content?.forEach {
|
mRankList?.safelyGetInRelease(index)?.content?.forEach {
|
||||||
if (it.link.type == "game") {
|
if (it.link.type == "game") {
|
||||||
@ -451,7 +605,13 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
|||||||
notifyItemRangeChanged(0, itemCount)
|
notifyItemRangeChanged(0, itemCount)
|
||||||
}
|
}
|
||||||
mViewModel?.historySearchLiveData?.value?.let { updateHistorySearchView(it) }
|
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 =
|
protected open fun provideDao(): ISearchHistoryDao =
|
||||||
|
|||||||
@ -11,7 +11,7 @@ class SearchDefaultViewModel(private val dao: ISearchHistoryDao) : ViewModel() {
|
|||||||
it
|
it
|
||||||
}
|
}
|
||||||
var isExistHotSearch: Boolean = false
|
var isExistHotSearch: Boolean = false
|
||||||
var isExistHotTag: Boolean = false
|
var isExistHotAndDiscoveryTag: Boolean = false
|
||||||
var isExistHistory: Boolean = false
|
var isExistHistory: Boolean = false
|
||||||
var isExistRankList: Boolean = false
|
var isExistRankList: Boolean = false
|
||||||
|
|
||||||
|
|||||||
@ -36,7 +36,7 @@
|
|||||||
</com.gh.gamecenter.common.view.LimitHeightLinearLayout>
|
</com.gh.gamecenter.common.view.LimitHeightLinearLayout>
|
||||||
|
|
||||||
<include
|
<include
|
||||||
android:id="@+id/hotTagHeadContainer"
|
android:id="@+id/hotAndDiscoveryTagHeadContainer"
|
||||||
layout="@layout/layout_subject_head"
|
layout="@layout/layout_subject_head"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="48dp"
|
android:layout_height="48dp"
|
||||||
@ -45,14 +45,14 @@
|
|||||||
app:layout_constraintTop_toBottomOf="@id/history_flex_container" />
|
app:layout_constraintTop_toBottomOf="@id/history_flex_container" />
|
||||||
|
|
||||||
<com.gh.gamecenter.common.view.LimitHeightLinearLayout
|
<com.gh.gamecenter.common.view.LimitHeightLinearLayout
|
||||||
android:id="@+id/hot_tag_flex_container"
|
android:id="@+id/hot_and_discovery_tag_flex_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="@color/ui_surface"
|
android:background="@color/ui_surface"
|
||||||
app:layout_constraintTop_toBottomOf="@id/hotTagHeadContainer">
|
app:layout_constraintTop_toBottomOf="@id/hotAndDiscoveryTagHeadContainer">
|
||||||
|
|
||||||
<com.google.android.flexbox.FlexboxLayout
|
<com.google.android.flexbox.FlexboxLayout
|
||||||
android:id="@+id/hot_tag_flex"
|
android:id="@+id/hot_and_discovery_tag_flex"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:paddingLeft="16dp"
|
android:paddingLeft="16dp"
|
||||||
@ -68,7 +68,7 @@
|
|||||||
android:layout_height="48dp"
|
android:layout_height="48dp"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="16dp"
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/hot_tag_flex_container" />
|
app:layout_constraintTop_toBottomOf="@id/hot_and_discovery_tag_flex_container" />
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/hot_list"
|
android:id="@+id/hot_list"
|
||||||
|
|||||||
@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/name"
|
android:id="@+id/name"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="8dp"
|
android:layout_marginStart="8dp"
|
||||||
android:ellipsize="end"
|
android:ellipsize="end"
|
||||||
@ -47,6 +47,7 @@
|
|||||||
android:textColor="@color/text_primary"
|
android:textColor="@color/text_primary"
|
||||||
android:layout_marginEnd="16dp"
|
android:layout_marginEnd="16dp"
|
||||||
app:layout_constrainedWidth="true"
|
app:layout_constrainedWidth="true"
|
||||||
|
app:layout_constraintWidth_max="wrap"
|
||||||
app:layout_constraintBottom_toTopOf="@id/play_count"
|
app:layout_constraintBottom_toTopOf="@id/play_count"
|
||||||
app:layout_constraintEnd_toStartOf="@id/play_container"
|
app:layout_constraintEnd_toStartOf="@id/play_container"
|
||||||
app:layout_constraintHorizontal_bias="0"
|
app:layout_constraintHorizontal_bias="0"
|
||||||
@ -77,7 +78,10 @@
|
|||||||
android:layout_marginEnd="12dp"
|
android:layout_marginEnd="12dp"
|
||||||
app:layout_constraintBottom_toBottomOf="@+id/name"
|
app:layout_constraintBottom_toBottomOf="@+id/name"
|
||||||
app:layout_constraintStart_toEndOf="@+id/name"
|
app:layout_constraintStart_toEndOf="@+id/name"
|
||||||
app:layout_constraintTop_toTopOf="@+id/name" />
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/name"
|
||||||
|
app:layout_constraintHorizontal_bias="0"
|
||||||
|
app:layout_constraintHorizontal_chainStyle="packed"/>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/play_container"
|
android:id="@+id/play_container"
|
||||||
|
|||||||
@ -18,7 +18,7 @@
|
|||||||
<string name="download_startall">全部開始</string>
|
<string name="download_startall">全部開始</string>
|
||||||
<string name="search_searching">搜索中...</string>
|
<string name="search_searching">搜索中...</string>
|
||||||
<string name="search_hot">熱門搜索</string>
|
<string name="search_hot">熱門搜索</string>
|
||||||
<string name="search_hot_tag">熱門標簽</string>
|
<string name="search_discovery_tag">搜索發現</string>
|
||||||
<string name="search_history">歷史搜索</string>
|
<string name="search_history">歷史搜索</string>
|
||||||
<string name="news_concenrn_game_mine">我關註的遊戲</string>
|
<string name="news_concenrn_game_mine">我關註的遊戲</string>
|
||||||
<string name="news_search_input">請輸入搜索關鍵字</string>
|
<string name="news_search_input">請輸入搜索關鍵字</string>
|
||||||
|
|||||||
@ -18,7 +18,7 @@
|
|||||||
<string name="download_startall">全部开始</string>
|
<string name="download_startall">全部开始</string>
|
||||||
<string name="search_searching">搜索中...</string>
|
<string name="search_searching">搜索中...</string>
|
||||||
<string name="search_hot">热门搜索</string>
|
<string name="search_hot">热门搜索</string>
|
||||||
<string name="search_hot_tag">热门标签</string>
|
<string name="search_discovery_tag">搜索发现</string>
|
||||||
<string name="search_history">历史搜索</string>
|
<string name="search_history">历史搜索</string>
|
||||||
<string name="news_concenrn_game_mine">我关注的游戏</string>
|
<string name="news_concenrn_game_mine">我关注的游戏</string>
|
||||||
<string name="news_search_input">请输入搜索关键字</string>
|
<string name="news_search_input">请输入搜索关键字</string>
|
||||||
|
|||||||
@ -88,6 +88,8 @@ object SensorsBridge {
|
|||||||
private const val KEY_VERIFICATION_TYPE = "verification_type"
|
private const val KEY_VERIFICATION_TYPE = "verification_type"
|
||||||
private const val KEY_VIDEO_ID = "video_id"
|
private const val KEY_VIDEO_ID = "video_id"
|
||||||
private const val KEY_PLAY_TYPE = "play_type"
|
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_BOTTOM_TAB = "bottom_tab"
|
||||||
const val KEY_MULTI_TAB_NAME = "several_tab_page_name"
|
const val KEY_MULTI_TAB_NAME = "several_tab_page_name"
|
||||||
const val KEY_MULTI_TAB_ID = "several_tab_page_id"
|
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_COLUMN_TEST_CLICK = "ColumnTestClick"
|
||||||
|
|
||||||
|
private const val EVENT_SEARCH_DISCOVERY_CLICK = "SearchDiscoveryClick"
|
||||||
|
|
||||||
private const val EVENT_BYPASS_BROWSING = "BypassBrowsing"
|
private const val EVENT_BYPASS_BROWSING = "BypassBrowsing"
|
||||||
private const val EVENT_FAIL_BYPASS = "FailBypass"
|
private const val EVENT_FAIL_BYPASS = "FailBypass"
|
||||||
|
|
||||||
@ -4996,4 +5000,29 @@ object SensorsBridge {
|
|||||||
}
|
}
|
||||||
trackEvent(EVENT_APPOINTMENT_GAME_ONLINE_DIALOG_CLICK, json)
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -70,6 +70,8 @@ class SettingsEntity(
|
|||||||
var hotSearch: List<HotSearch>? = listOf(),
|
var hotSearch: List<HotSearch>? = listOf(),
|
||||||
@SerializedName("tag")
|
@SerializedName("tag")
|
||||||
var hotTag: List<HotTagEntity>? = listOf(),
|
var hotTag: List<HotTagEntity>? = listOf(),
|
||||||
|
@SerializedName("discover_tag")
|
||||||
|
var discoveryTag: List<DiscoveryTagEntity>? = listOf(),
|
||||||
@SerializedName("hot_list")
|
@SerializedName("hot_list")
|
||||||
var rankList: List<RankList>? = listOf(),
|
var rankList: List<RankList>? = listOf(),
|
||||||
@SerializedName("wechat_game_search_list")
|
@SerializedName("wechat_game_search_list")
|
||||||
|
|||||||
Reference in New Issue
Block a user