diff --git a/app/src/main/java/com/gh/common/util/LogUtils.java b/app/src/main/java/com/gh/common/util/LogUtils.java index 97c9560a83..d21a6a963a 100644 --- a/app/src/main/java/com/gh/common/util/LogUtils.java +++ b/app/src/main/java/com/gh/common/util/LogUtils.java @@ -1064,6 +1064,24 @@ public class LogUtils { LoghubUtils.log(object, "event", false); } + public static void logGameDetailFixedTopArticleClick(String gameId, String gameName, String url) { + JSONObject object = new JSONObject(); + try { + object.put("event", "game_detail_click_top_strategy"); + object.put("game_id", gameId); + object.put("game_name", gameName); + object.put("top_strategy_url", url); + object.put("meta", getMetaObject()); + object.put("timestamp", System.currentTimeMillis() / 1000); + } catch (JSONException e) { + e.printStackTrace(); + } + if (BuildConfig.DEBUG) { + Utils.log("LogUtils->" + object.toString()); + } + LoghubUtils.log(object, "event", false); + } + public static void logHomeTopTabClick(String tabName, String linkType, String linkTitle, int sequence) { JSONObject object = new JSONObject(); try { diff --git a/app/src/main/java/com/gh/gamecenter/entity/NewsEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/NewsEntity.kt index 53cfc9731d..b39478e4cc 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/NewsEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/NewsEntity.kt @@ -21,6 +21,7 @@ class NewsEntity : Parcelable, Cloneable { @SerializedName("time") var publishOn: Long = 0 + @SerializedName(value = "thumb", alternate = ["image"]) var thumb: String? = null var thumbnail: ThumbnailEntity? = null @@ -30,6 +31,7 @@ class NewsEntity : Parcelable, Cloneable { var views: Int = 0 + @SerializedName(value = "link", alternate = ["url"]) var link: String? = null @SerializedName("game_name") 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 1cf6c6d226..b062087294 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 @@ -530,18 +530,30 @@ class DescAdapter(context: Context, params.rightMargin = 0 layoutParams = params layoutManager = LinearLayoutManager(mContext, RecyclerView.HORIZONTAL, false) - val raidersAdapter = GameRaidersAdapter(mContext, article!!, mEntrance, gameName) + val raidersAdapter = GameRaidersAdapter(mContext, article!!, mEntrance, mViewModel.game) adapter = raidersAdapter } } - viewHolder.binding.titleTv.text = "资讯攻略" - viewHolder.binding.moreTv.goneIf((article?.size ?: 0) < 3) + viewHolder.binding.titleTv.text = "新手攻略" + if (mViewModel.game?.zone?.style == "link") { + viewHolder.binding.moreTv.text = "进入攻略专区" + viewHolder.binding.moreTv.visibility = View.VISIBLE + } else { + viewHolder.binding.moreTv.text = "更多" + viewHolder.binding.moreTv.goneIf((article?.size ?: 0) < 3) + } + viewHolder.binding.moreTv.setOnClickListener { - MtaHelper.onEvent("游戏详情_新", "资讯攻略卡片_更多", gameName) + MtaHelper.onEvent("游戏详情_新", "新手攻略卡片_更多", gameName) + + if (viewHolder.binding.titleTv.text == "更多") { + val intent = GameNewsActivity.getIntent(mContext, mViewModel.game?.name, mViewModel.game?.id, + mEntrance + "+(游戏详情[" + mViewModel.game?.name + "]:新手攻略-全部)") + mContext.startActivity(intent) + } else { + EventBus.getDefault().post(EBReuse(GameDetailFragment.SKIP_FULI)) + } LogUtils.logGameDetailStrategyButtonEvent(mViewModel.gameId, gameName, viewHolder.binding.moreTv.text.toString()) - val intent = GameNewsActivity.getIntent(mContext, mViewModel.game?.name, mViewModel.game?.id, - mEntrance + "+(游戏详情[" + mViewModel.game?.name + "]:资讯攻略-全部)") - mContext.startActivity(intent) } } @@ -763,7 +775,7 @@ class DescAdapter(context: Context, const val IMAGE_GALLERY = 130//图片 const val UPDATE_CONTENT = 131//更新内容 const val LATEST_SERVICE = 132//最新开服 - const val INFO_RAIDERS = 133//资讯攻略 + const val INFO_RAIDERS = 133//新手攻略 const val LIBAO = 134//游戏礼包 const val GAME_DETAIL = 135//游戏详细信息 const val NOTICE = 136 //公告 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 d67f009f8b..3ef471d770 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 @@ -246,6 +246,17 @@ class DescViewModel(application: Application, detailEntityList[index + 1].shouldBoundTogetherWithPreviousItem = true } } + + // 处理置顶文章 + if (rawItem.type == "article") { + if (rawItem.articleTop != null && rawItem.articleTop?.size != 0) { + for ((i, article) in rawItem.articleTop!!.withIndex()) { + article.priority = Int.MAX_VALUE + rawItem.article?.add(i, article) + } + rawItem.articleTop?.clear() + } + } } // D 处理自定义栏目相关的东西 @@ -285,7 +296,8 @@ class DescViewModel(application: Application, rawItem.customColumn?.desBrief = rawItem.customColumn?.desBrief?.replaceUnsupportedHtmlTag() } - rawItem.customColumn?.des = rawItem.customColumn?.desFull ?: rawItem.customColumn?.des + rawItem.customColumn?.des = rawItem.customColumn?.desFull + ?: rawItem.customColumn?.des } } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameRaidersAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameRaidersAdapter.kt index 46e66d47ea..38070971f9 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameRaidersAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameRaidersAdapter.kt @@ -5,47 +5,89 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.RecyclerView +import com.gh.common.DefaultUrlHandler import com.gh.common.util.* import com.gh.gamecenter.NewsDetailActivity import com.gh.gamecenter.R import com.gh.gamecenter.databinding.ItemGameRaidersBinding +import com.gh.gamecenter.databinding.ItemGameRaidersFixedTopBinding +import com.gh.gamecenter.entity.GameEntity import com.gh.gamecenter.entity.NewsEntity -class GameRaidersAdapter(val context: Context, val articles: ArrayList, val mEntrance: String, val gameName: String?) : RecyclerView.Adapter() { +class GameRaidersAdapter(val context: Context, val articles: ArrayList, val mEntrance: String, val game: GameEntity?) + : RecyclerView.Adapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - return RaidersViewHolder(DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.item_game_raiders, parent, false)) + return if (viewType == TYPE_ARTICLE) { + RaidersViewHolder(DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.item_game_raiders, parent, false)) + } else { + RaidersFixedTopViewHolder(ItemGameRaidersFixedTopBinding.inflate(LayoutInflater.from(context), parent, false)) + } } override fun getItemCount(): Int = articles.size + override fun getItemViewType(position: Int): Int { + return if (articles[position].priority == Int.MAX_VALUE) { + TYPE_ARTICLE_FIXED_TOP + } else { + TYPE_ARTICLE + } + } + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - val params = holder.itemView.layoutParams as RecyclerView.LayoutParams - params.leftMargin = DisplayUtils.dip2px(if (position == 0) 20f else 8f) - params.rightMargin = DisplayUtils.dip2px(if (position == itemCount - 1) 20f else 0f) - holder.itemView.layoutParams = params - val newsEntity = articles[position] if (holder is RaidersViewHolder) { + val params = holder.itemView.layoutParams as RecyclerView.LayoutParams + params.leftMargin = DisplayUtils.dip2px(if (position == 0) 20F else 8F) + params.rightMargin = DisplayUtils.dip2px(if (position == itemCount - 1) 20F else 0F) + holder.itemView.layoutParams = params + val newsEntity = articles[position] holder.binding.titleTv.text = newsEntity.title ?: "" holder.binding.contentTv.text = newsEntity.intro ?: "" holder.binding.timeTv.text = if (TimeUtils.isToday(newsEntity.publishOn)) "今天" else TimeUtils.getFormatTime(newsEntity.publishOn) holder.itemView.setOnClickListener { skipNewsDetail(newsEntity, position) } + } else if (holder is RaidersFixedTopViewHolder) { + val params = holder.itemView.layoutParams as RecyclerView.LayoutParams + params.leftMargin = DisplayUtils.dip2px(if (position == 0) 20F else 8F) + params.rightMargin = DisplayUtils.dip2px(if (position == itemCount - 1) 20F else 0F) + holder.itemView.layoutParams = params + val newsEntity = articles[position] + holder.binding.titleTv.text = newsEntity.title ?: "" + ImageUtils.display(holder.binding.backgroundIv, newsEntity.thumb) + holder.binding.descTv.text = newsEntity.type + holder.itemView.setOnClickListener { + LogUtils.logGameDetailFixedTopArticleClick(game?.id, game?.name, newsEntity.link) + + val isUrlIntercepted = DefaultUrlHandler.interceptUrl( + context, + newsEntity.link ?: "", + "新手攻略") + if (!isUrlIntercepted) { + DirectUtils.directToWebView(context, newsEntity.link ?: "") + } + } } } private fun skipNewsDetail(article: NewsEntity, position: Int) { + DataCollectionUtils.uploadClick(context, "新手攻略", "游戏详情", article.title) - DataCollectionUtils.uploadClick(context, "资讯攻略", "游戏详情", article.title) - - DataUtils.onMtaEvent(context, "游戏详情_新", "资讯攻略", gameName + "->" + article.title) - MtaHelper.onEvent("游戏详情_新", "资讯攻略卡片", "${gameName}+${article.title}") + DataUtils.onMtaEvent(context, "游戏详情_新", "新手攻略", game?.name + "->" + article.title) + MtaHelper.onEvent("游戏详情_新", "新手攻略卡片", "${game?.name}+${article.title}") // 统计阅读量 NewsUtils.statNewsViews(context, article.id) NewsDetailActivity.startNewsDetailActivity(context, article, - mEntrance + "+(游戏详情[" + gameName + "]:资讯攻略-列表[" + (position + 1) + "])") + mEntrance + "+(游戏详情[" + game?.name + "]:新手攻略-列表[" + (position + 1) + "])") + } + + companion object { + const val TYPE_ARTICLE = 123 + const val TYPE_ARTICLE_FIXED_TOP = 124 } class RaidersViewHolder(var binding: ItemGameRaidersBinding) : RecyclerView.ViewHolder(binding.root) + class RaidersFixedTopViewHolder(var binding: ItemGameRaidersFixedTopBinding) : RecyclerView.ViewHolder(binding.root) } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/entity/DetailEntity.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/entity/DetailEntity.kt index 6444edd04f..35af3508e3 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/entity/DetailEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/entity/DetailEntity.kt @@ -29,6 +29,8 @@ data class DetailEntity( var relatedGames: ArrayList? = null, var recommendedGames: SubjectEntity? = null, var article: ArrayList? = null, + @SerializedName("article_top") + var articleTop: ArrayList? = null, // 仅用于镜像 @SerializedName(value = "new_tag_style") diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/FuLiAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/FuLiAdapter.kt index 01afbd4176..5c7f477ca7 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/FuLiAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/FuLiAdapter.kt @@ -11,7 +11,6 @@ import androidx.recyclerview.widget.RecyclerView import com.gh.base.OnListClickListener import com.gh.common.util.* import com.gh.common.view.MarqueeView -import com.gh.common.view.divider.HorizontalDividerItemDecoration import com.gh.gamecenter.GameNewsActivity import com.gh.gamecenter.NewsDetailActivity import com.gh.gamecenter.R @@ -175,14 +174,17 @@ class FuLiAdapter(context: Context, adapter = newsAdapter } } - viewHolder.binding.titleTv.text = "资讯攻略" + viewHolder.binding.titleTv.text = "新手攻略" viewHolder.binding.moreTv.goneIf(article.size < 3) viewHolder.binding.moreTv.setOnClickListener { - DataCollectionUtils.uploadClick(mContext, "资讯攻略-全部", "游戏详情", mFuLiViewModel?.game?.name) + DataCollectionUtils.uploadClick(mContext, "新手攻略-全部", "游戏详情", mFuLiViewModel?.game?.name) - MtaHelper.onEvent("游戏详情_新", "资讯攻略-更多", mFuLiViewModel?.game?.name) - val intent = GameNewsActivity.getIntent(mContext, mFuLiViewModel?.game?.name, mFuLiViewModel?.game?.id, - mEntrance + "+(游戏详情[" + mFuLiViewModel?.game?.name + "]:资讯攻略-全部)") + MtaHelper.onEvent("游戏详情_新", "新手攻略-更多", mFuLiViewModel?.game?.name) + val intent = GameNewsActivity.getIntent( + mContext, + mFuLiViewModel?.game?.name, + mFuLiViewModel?.game?.id, + mEntrance + "+(游戏详情[" + mFuLiViewModel?.game?.name + "]:新手攻略-全部)") mContext.startActivity(intent) } } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/GameNewsAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/GameNewsAdapter.kt index 7e86b70d42..6c7c499940 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/GameNewsAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/GameNewsAdapter.kt @@ -1,8 +1,6 @@ package com.gh.gamecenter.gamedetail.fuli import android.content.Context -import android.text.SpannableStringBuilder -import android.text.Spanned import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.content.ContextCompat @@ -10,10 +8,8 @@ import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.RecyclerView import com.gh.common.util.DataCollectionUtils import com.gh.common.util.DataUtils -import com.gh.common.util.DisplayUtils import com.gh.common.util.NewsUtils import com.gh.common.view.DrawableView -import com.gh.common.view.GradientRoundBackgroundColorSpan import com.gh.gamecenter.NewsDetailActivity import com.gh.gamecenter.R import com.gh.gamecenter.databinding.ItemGameDetailNewsBinding @@ -47,14 +43,14 @@ class GameNewsAdapter(val context: Context, val article: ArrayList, private fun skipNewsDetail(articles: List, position: Int) { val newsEntity = articles[position] - DataCollectionUtils.uploadClick(context, "资讯攻略", "游戏详情", newsEntity.title) + DataCollectionUtils.uploadClick(context, "新手攻略", "游戏详情", newsEntity.title) - DataUtils.onMtaEvent(context, "游戏详情_新", "资讯攻略", "${mFuLiViewModel?.game?.name}+${newsEntity.title}") + DataUtils.onMtaEvent(context, "游戏详情_新", "新手攻略", "${mFuLiViewModel?.game?.name}+${newsEntity.title}") // 统计阅读量 NewsUtils.statNewsViews(context, newsEntity.id) NewsDetailActivity.startNewsDetailActivity(context, newsEntity, - mEntrance + "+(游戏详情[" + mFuLiViewModel?.game?.name + "]:资讯攻略-列表[" + (position + 1) + "])") + mEntrance + "+(游戏详情[" + mFuLiViewModel?.game?.name + "]:新手攻略-列表[" + (position + 1) + "])") } class NewsViewHolder(var binding: ItemGameDetailNewsBinding) : RecyclerView.ViewHolder(binding.root) diff --git a/app/src/main/res/layout/item_game_raiders.xml b/app/src/main/res/layout/item_game_raiders.xml index b6319cbe49..81ea773774 100644 --- a/app/src/main/res/layout/item_game_raiders.xml +++ b/app/src/main/res/layout/item_game_raiders.xml @@ -4,7 +4,7 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ed6bd38bee..39bde5ac89 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -58,7 +58,7 @@ 有奖反馈 礼包名称 游戏礼包 - 资讯攻略 + 新手攻略 全部 插件介绍 关注