diff --git a/app/src/main/java/com/gh/common/filter/RegionSettingHelper.kt b/app/src/main/java/com/gh/common/filter/RegionSettingHelper.kt index e064f5f876..7390da3c07 100644 --- a/app/src/main/java/com/gh/common/filter/RegionSettingHelper.kt +++ b/app/src/main/java/com/gh/common/filter/RegionSettingHelper.kt @@ -23,6 +23,7 @@ object RegionSettingHelper { private var mGameSpecialDownloadInfoList: List? = listOf() private const val SP_SETTING = "region_setting" + const val SP_SETTING_FAILURE = "region_setting_failure" fun shouldThisGameDisplayMirrorInfo(gameId: String): Boolean { return mDisplayMirrorIfoGameIdSet?.contains(gameId) ?: false @@ -88,9 +89,10 @@ object RegionSettingHelper { } override fun onFailure(exception: Exception) { - SPUtils.getString(SP_SETTING)?.toObject()?.let { + SPUtils.getString(SP_SETTING).toObject()?.let { updateSettingsInMemory(it) } + SPUtils.setBoolean(SP_SETTING_FAILURE, true) } }) } diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index bdb6ecbee3..b14280983c 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -13,7 +13,6 @@ import static com.gh.gamecenter.common.constant.EntranceConsts.KEY_NEXT_TO; import static com.gh.gamecenter.common.constant.EntranceConsts.KEY_TO; import static com.gh.gamecenter.common.constant.EntranceConsts.KEY_TYPE; import static com.gh.gamecenter.common.utils.ExtensionsKt.observableToMain; -import static com.gh.gamecenter.fragment.MainWrapperFragment.INDEX_PERSONAL; import static com.gh.gamecenter.login.utils.LoginHelper.WEIBO_SCOPE; import android.annotation.SuppressLint; @@ -46,6 +45,7 @@ import com.facebook.drawee.view.SimpleDraweeView; import com.gh.common.DefaultUrlHandler; import com.gh.common.constant.Config; import com.gh.common.exposure.ExposureManager; +import com.gh.common.filter.RegionSettingHelper; import com.gh.common.history.HistoryDatabase; import com.gh.common.history.HistoryHelper; import com.gh.common.repository.ReservationRepository; @@ -55,7 +55,6 @@ import com.gh.common.util.AdHelper; import com.gh.common.util.CertificationSwitchHelper; import com.gh.common.util.DataUtils; import com.gh.common.util.DeviceTokenUtils; -import com.gh.common.util.DialogUtils; import com.gh.common.util.DirectUtils; import com.gh.common.util.EntranceUtils; import com.gh.common.util.ErrorHelper; @@ -83,7 +82,6 @@ import com.gh.gamecenter.common.eventbus.EBReuse; import com.gh.gamecenter.common.exposure.meta.MetaUtil; import com.gh.gamecenter.common.retrofit.BiResponse; import com.gh.gamecenter.common.retrofit.Response; -import com.gh.gamecenter.common.utils.DeviceUtils; import com.gh.gamecenter.common.utils.DialogHelper; import com.gh.gamecenter.common.utils.ExtensionsKt; import com.gh.gamecenter.common.utils.ImageUtils; @@ -159,7 +157,6 @@ import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.functions.Function; import io.reactivex.schedulers.Schedulers; import kotlin.jvm.functions.Function1; -import okhttp3.MediaType; import okhttp3.RequestBody; import okhttp3.ResponseBody; import retrofit2.HttpException; @@ -340,6 +337,9 @@ public class MainActivity extends BaseActivity { postAttentionVideoRecord(); deleteSimulatorGame(); + if (SPUtils.getBoolean(RegionSettingHelper.SP_SETTING_FAILURE)){ + RegionSettingHelper.getRegionSetting(); + } // 检查是否需要触发 XAPK 安装 AppExecutor.getUiExecutor().executeWithDelay(this::resumeXapkInstallIfNeeded, 150); diff --git a/app/src/main/java/com/gh/gamecenter/entity/SearchSubjectEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/SearchSubjectEntity.kt index 67ef50bc9b..bb97b4b2e8 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/SearchSubjectEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/SearchSubjectEntity.kt @@ -1,6 +1,7 @@ package com.gh.gamecenter.entity import android.os.Parcelable +import com.gh.common.filter.RegionSettingHelper import com.gh.gamecenter.feature.entity.GameEntity import com.google.gson.annotations.SerializedName import kotlinx.parcelize.Parcelize @@ -14,4 +15,6 @@ class SearchSubjectEntity( val columnId: String = "", @SerializedName("ad_icon_active") val adIconActive: Boolean = false -) : Parcelable \ No newline at end of file +) : Parcelable { + fun getFilterGame() = RegionSettingHelper.filterGame(games) +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/entity/SubjectEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/SubjectEntity.kt index b48fd240f9..5125336878 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/SubjectEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/SubjectEntity.kt @@ -3,9 +3,11 @@ package com.gh.gamecenter.entity import android.os.Parcelable import android.text.TextUtils import com.gh.common.constant.Config +import com.gh.common.filter.RegionSettingHelper import com.gh.gamecenter.common.entity.LinkEntity import com.gh.gamecenter.feature.entity.GameEntity import com.google.gson.annotations.SerializedName +import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.Parcelize /** @@ -22,7 +24,8 @@ class SubjectEntity( var home: String? = null, var tag: String? = null, var sort: Int = 0, - var data: MutableList? = null, + @SerializedName("data") + private var mData: MutableList? = null, @SerializedName("type", alternate = ["link_type"]) var type: String? = null, var des: String? = null, @@ -93,6 +96,13 @@ class SubjectEntity( var outerSequence: Int = -1 ) : Parcelable { + @IgnoredOnParcel + var data: MutableList? + get() = RegionSettingHelper.filterGame(mData) + set(value) { + mData = value + } + fun getFilterName(): String { if (!TextUtils.isEmpty(name) && !Config.isShowPlugin()) { name = name?.replace("插件", "游戏") diff --git a/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchDefaultViewModel.kt b/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchDefaultViewModel.kt index b87af5c388..0b24b7c7db 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchDefaultViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchDefaultViewModel.kt @@ -17,29 +17,29 @@ class ForumOrUserSearchDefaultViewModel(application: Application) : AndroidViewM fun getForumSearchHotContent() { Observable.zip( getHotSearch(), - getHotContent(), - BiFunction, List, ArrayList> { t1, t2 -> - val dataList = arrayListOf() - val forumRank = SettingsEntity.Search.RankList() - forumRank.title = "热门论坛" - val forumContent = mutableListOf() - t1.forEachIndexed { _, hotSearch -> - val content = hotSearch.toRankContent() - forumContent.add(content) - } - forumRank.content = forumContent - val contentRank = SettingsEntity.Search.RankList() - contentRank.title = "热门内容" - t2.forEachIndexed { _, rankContent -> - rankContent.name = rankContent.title - } - contentRank.content = t2 - dataList.add(forumRank) - dataList.add(contentRank) - dataList - }).compose(observableToMain()) - .subscribe(object : Response>() { - override fun onResponse(response: List?) { + getHotContent() + ) { t1, t2 -> + val dataList = arrayListOf() + val forumRank = SettingsEntity.Search.RankList() + forumRank.title = "热门论坛" + val forumContent = arrayListOf() + t1.forEachIndexed { _, hotSearch -> + val content = hotSearch.toRankContent() + forumContent.add(content) + } + forumRank.content = forumContent + val contentRank = SettingsEntity.Search.RankList() + contentRank.title = "热门内容" + t2.forEachIndexed { _, rankContent -> + rankContent.name = rankContent.title + } + contentRank.content = t2 + dataList.add(forumRank) + dataList.add(contentRank) + dataList + }.compose(observableToMain()) + .subscribe(object : Response>() { + override fun onResponse(response: ArrayList?) { super.onResponse(response) hotContentLiveData.postValue(response) } @@ -49,13 +49,13 @@ class ForumOrUserSearchDefaultViewModel(application: Application) : AndroidViewM } - private fun getHotSearch(): Observable> { + private fun getHotSearch(): Observable> { return RetrofitManager.getInstance().api .hotSearches } - private fun getHotContent(): Observable> { + private fun getHotContent(): Observable> { return RetrofitManager.getInstance().newApi .hotContent } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index d5db182bec..8c30b6c232 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -913,7 +913,7 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { return@forEach } } - if (isShowBbs) { + if (isShowBbs && mGameEntity?.shouldUseMirrorInfo() == false) { mFragmentsList.add(Fragment()) mTabTitleList.add(getString(R.string.game_detail_bbs)) } 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 beb5600402..ef4e8ec486 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 @@ -25,7 +25,6 @@ import com.gh.common.DefaultUrlHandler import com.gh.common.databind.BindingAdapters import com.gh.common.exposure.ExposureManager import com.gh.common.util.* -import com.gh.common.util.DialogUtils import com.gh.common.util.LogUtils import com.gh.common.util.NewFlatLogUtils import com.gh.common.util.NewLogUtils @@ -816,7 +815,9 @@ class DescAdapter( containerWrapper.setPadding(0, itemData.paddingTop, 0, itemData.paddingBottom) layoutManager = LinearLayoutManager(mContext, RecyclerView.HORIZONTAL, false) if (adapter == null) { - val subjectEntity = SubjectEntity(data = columnGames) + val subjectEntity = SubjectEntity().apply { + data = columnGames + } val exposureEventList = arrayListOf() for ((index, game) in subjectEntity.data!!.withIndex()) { game.sequence = index diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescViewModel.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescViewModel.kt index 002aacb4b8..e84ffe52df 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescViewModel.kt @@ -15,11 +15,11 @@ import com.gh.gamecenter.common.exposure.meta.MetaUtil import com.gh.gamecenter.common.retrofit.Response import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.core.utils.* -import com.gh.gamecenter.feature.entity.GameEntity import com.gh.gamecenter.entity.SubjectEntity +import com.gh.gamecenter.feature.entity.GameEntity +import com.gh.gamecenter.feature.entity.GameInfo import com.gh.gamecenter.gamedetail.entity.CustomColumn import com.gh.gamecenter.gamedetail.entity.DetailEntity -import com.gh.gamecenter.feature.entity.GameInfo import com.gh.gamecenter.retrofit.RetrofitManager import com.google.gson.JsonArray import com.google.gson.reflect.TypeToken @@ -161,7 +161,9 @@ class DescViewModel( if (data.relatedGames != null) { mRelatedGameList.shuffle() - val recommendedGames = SubjectEntity(data = mRelatedGameList) + val recommendedGames = SubjectEntity().apply { + this.data = mRelatedGameList + } data.recommendedGames = recommendedGames } } diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java index c16dc52fd9..4ab91fe0af 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java @@ -2572,13 +2572,13 @@ public interface ApiService { * 获取论坛热门搜索列表 */ @GET("bbses/hot_searches") - Observable> getHotSearches(); + Observable> getHotSearches(); /** * 获取论坛搜索的热门内容 */ @GET("bbses/search/hot_content") - Observable> getHotContent(); + Observable> getHotContent(); /** 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 7a27165ec3..48ab87d6da 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchDefaultFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchDefaultFragment.kt @@ -15,9 +15,8 @@ import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat import com.gh.common.constant.Config -import com.gh.gamecenter.feature.exposure.ExposureEvent import com.gh.common.exposure.ExposureManager -import com.gh.gamecenter.feature.exposure.ExposureSource +import com.gh.common.filter.RegionSettingHelper import com.gh.common.util.DirectUtils import com.gh.common.util.NewFlatLogUtils import com.gh.gamecenter.R @@ -30,9 +29,11 @@ import com.gh.gamecenter.core.utils.StringUtils import com.gh.gamecenter.databinding.FragmentSearchDefaultBinding import com.gh.gamecenter.databinding.TabItemSearchDefaultRankBinding import com.gh.gamecenter.db.SearchHistoryDao +import com.gh.gamecenter.eventbus.EBSearch import com.gh.gamecenter.feature.entity.HotTagEntity import com.gh.gamecenter.feature.entity.SettingsEntity -import com.gh.gamecenter.eventbus.EBSearch +import com.gh.gamecenter.feature.exposure.ExposureEvent +import com.gh.gamecenter.feature.exposure.ExposureSource import com.google.android.flexbox.FlexboxLayout import com.google.android.material.tabs.TabLayout import com.lightgame.utils.Util_System_Keyboard @@ -79,6 +80,14 @@ open class SearchDefaultFragment : BaseFragment() { mRankList = Config.getSettings()?.search?.rankList?.apply { forEachIndexed { outIndex, rankList -> rankList.isShowIcon = !rankList.content.any { it.icon.isBlank() } + var i = 0 + while (i < rankList.content.size) { + if (RegionSettingHelper.shouldThisGameBeFiltered(rankList.content[i].linkGame?.id)) { + rankList.content.removeAt(i) + i-- + } + i++ + } rankList.content.forEachIndexed { index, rank -> val source = listOf(ExposureSource("首页搜索 -> 搜索榜单", "${rankList.title}-${rank.name}")) if (rank.link.type == "game") { @@ -134,11 +143,13 @@ open class SearchDefaultFragment : BaseFragment() { headTitle.textSize = 16F headActionTv.text = "清空" headActionTv.setTextColor(R.color.text_subtitleDesc.toColor(requireContext())) - headActionTv.setDrawableStart(VectorDrawableCompat.create( - resources, - R.drawable.search_history_delete, - null - )) + headActionTv.setDrawableStart( + VectorDrawableCompat.create( + resources, + R.drawable.search_history_delete, + null + ) + ) headActionTv.setOnClickListener { DialogHelper.showCenterWarningDialog(requireContext(), "清空记录", "确定清空历史搜索记录?", confirmClickCallback = { mSearchHistoryDao?.deleteAll() diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchDefaultRankAdapter.kt b/app/src/main/java/com/gh/gamecenter/search/SearchDefaultRankAdapter.kt index 1f1edab2cc..91799ff6db 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchDefaultRankAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchDefaultRankAdapter.kt @@ -2,16 +2,12 @@ package com.gh.gamecenter.search import android.content.Context import android.graphics.Typeface -import android.view.View import android.view.ViewGroup import com.gh.common.util.DirectUtils import com.gh.common.util.NewFlatLogUtils import com.gh.gamecenter.R import com.gh.gamecenter.common.base.BaseRecyclerViewHolder -import com.gh.gamecenter.common.utils.display -import com.gh.gamecenter.common.utils.toBinding -import com.gh.gamecenter.common.utils.toColor -import com.gh.gamecenter.common.utils.toDrawable +import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.databinding.SearchDefaultRankItemBinding import com.gh.gamecenter.feature.entity.SettingsEntity import com.lightgame.adapter.BaseRecyclerAdapter @@ -30,13 +26,11 @@ class SearchDefaultRankAdapter( override fun onBindViewHolder(holder: SearchDefaultRankItemViewHolder, position: Int) { val rank = mRankList.content[position] holder.binding.run { - if (mRankList.isShowIcon) { - icon.visibility = View.VISIBLE - icon.display(rank.icon) - } else { - icon.visibility = View.GONE + val gameEntity = rank.linkGame?.toGameEntity() + icon.goneIf(!mRankList.isShowIcon) { + icon.display(if (rank.link.type == "game") gameEntity?.icon else rank.icon) } - name.text = rank.name.ifBlank { rank.link.text } + name.text = if (rank.link.type == "game") gameEntity?.name else rank.name.ifBlank { rank.link.text } index.run { typeface = Typeface.createFromAsset(mContext.assets, "fonts/d_din_bold_only_number.ttf") text = (position + 1).toString() diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexItemViewHolder.kt index e7efbc4a7d..c0671ec1b6 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexItemViewHolder.kt @@ -4,12 +4,10 @@ import android.content.Context import android.view.View import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.gh.gamecenter.feature.exposure.ExposureEvent -import com.gh.gamecenter.feature.exposure.ExposureSource import com.gh.common.util.DirectUtils import com.gh.gamecenter.R -import com.gh.gamecenter.common.utils.setDrawableEnd import com.gh.gamecenter.common.utils.goneIf +import com.gh.gamecenter.common.utils.setDrawableEnd import com.gh.gamecenter.common.utils.toColor import com.gh.gamecenter.common.utils.toDrawable import com.gh.gamecenter.common.view.DrawableView @@ -17,6 +15,8 @@ import com.gh.gamecenter.databinding.SearchGameIndexItemBinding import com.gh.gamecenter.databinding.SearchSubjectItemBinding import com.gh.gamecenter.db.SearchHistoryDao import com.gh.gamecenter.feature.entity.GameEntity +import com.gh.gamecenter.feature.exposure.ExposureEvent +import com.gh.gamecenter.feature.exposure.ExposureSource class SearchGameIndexItemViewHolder(var binding: SearchGameIndexItemBinding) : RecyclerView.ViewHolder(binding.root) { fun initServerType(gameEntity: GameEntity) { @@ -58,7 +58,7 @@ class SearchSubjectItemViewHolder(var binding: SearchSubjectItemBinding) : Recyc val entity = itemData.subject ?: return val exposureList = arrayListOf() - for ((index, game) in entity.games.withIndex()) { + for ((index, game) in entity.getFilterGame().withIndex()) { game.sequence = index game.outerSequence = adapterPosition game.isAdData = entity.adIconActive @@ -77,7 +77,7 @@ class SearchSubjectItemViewHolder(var binding: SearchSubjectItemBinding) : Recyc binding.run { subjectRv.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) - subjectRv.adapter = SearchSubjectAdapter(context, entity.games, "($type-专题)") { + subjectRv.adapter = SearchSubjectAdapter(context, entity.getFilterGame(), "($type-专题)") { dao?.add(key) } headContainer.adLabelTv.goneIf(!entity.adIconActive) 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 d85ba43610..cd9bd603ba 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 @@ -119,7 +119,7 @@ class SettingsEntity( ) { class RankList( var title: String = "", - var content: List = listOf(), + var content: ArrayList = arrayListOf(), var isShowIcon: Boolean = false // 榜单Item是否显示图标(所有内容都配置了图标前端才可显示,否则均不显示图标) ) { class RankContent( @@ -132,6 +132,9 @@ class SettingsEntity( @SerializedName("recommend_type") var recommendType: String = "", var link: LinkEntity = LinkEntity(), + //link.type等于game时,字段存在 + @SerializedName("link_game") + var linkGame: SimpleGame? = null ) { var exposureEvent: ExposureEvent? = null