diff --git a/app/build.gradle b/app/build.gradle index 406437c486..b20d77649c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -473,6 +473,11 @@ andResGuard { "R.drawable.ic_search_no_18", "R.drawable.ic_search_no_19", "R.drawable.ic_search_no_20", + "R.drawable.ic_recommend_activity", + "R.drawable.ic_recommend_discount", + "R.drawable.ic_recommend_function", + "R.drawable.ic_recommend_gift", + "R.drawable.ic_recommend_role", "R.drawable.login_btn_bg", "R.drawable.ic_quick_login_check", "R.drawable.ic_quick_login_uncheck", diff --git a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java index c923e78177..4bee863678 100644 --- a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java +++ b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java @@ -138,7 +138,7 @@ public class DownloadItemUtils { holder.gameDownloadBtn.setText("已预约"); holder.gameDownloadBtn.setTextColor(ContextCompat.getColor(holder.gameDes.getContext(), R.color.aaaaaa)); holder.gameDownloadBtn.setBackgroundResource(R.drawable.button_round_f5f5f5); - updateItemViewStatus(holder, false, null); + updateItemViewStatus(holder, false, null, null); } } @@ -171,7 +171,7 @@ public class DownloadItemUtils { // 显示预约 if (gameEntity.isReservable()) { - updateItemViewStatus(holder, false, briefStyle); + updateItemViewStatus(holder, false, briefStyle, gameEntity.getColumnRecommend()); if (!ReservationRepository.thisGameHasBeenReserved(gameEntity.getId())) { holder.gameDownloadBtn.setText("预约"); holder.gameDownloadBtn.setTextColor(Color.WHITE); @@ -189,7 +189,7 @@ public class DownloadItemUtils { LinkEntity h5LinkEntity = gameEntity.getH5Link(); String offStatus = gameEntity.getDownloadOffStatus(); - updateItemViewStatus(holder, false, briefStyle); + updateItemViewStatus(holder, false, briefStyle, gameEntity.getColumnRecommend()); if (h5LinkEntity != null) { if ("play".equals(h5LinkEntity.getType())) { @@ -252,7 +252,7 @@ public class DownloadItemUtils { GameUtils.setDownloadBtnStatus(context, gameEntity, holder.gameDownloadBtn, pluginLocation); - updateItemViewStatus(holder, false, briefStyle); + updateItemViewStatus(holder, false, briefStyle, gameEntity.getColumnRecommend()); } // 更新插件的条目,有多个apk包 @@ -276,14 +276,14 @@ public class DownloadItemUtils { return; } } - updateItemViewStatus(holder, false, briefStyle); + updateItemViewStatus(holder, false, briefStyle, gameEntity.getColumnRecommend()); } // 更改进度条和提示文本的状态 public static void changeStatus(Context context, GameViewHolder holder, DownloadEntity downloadEntity, boolean isShowPlatform, boolean isNormal) { - updateItemViewStatus(holder, true, null); + updateItemViewStatus(holder, true, null, null); holder.gameProgressbar.setProgressDrawable(context.getResources().getDrawable(R.drawable.progressbar_bg_style)); String platform = PlatformUtils.getInstance(context).getPlatformName(downloadEntity.getPlatform()); @@ -377,22 +377,53 @@ public class DownloadItemUtils { } } - private static void updateItemViewStatus(GameViewHolder holder, boolean hasDownload, @Nullable String briefStyle) { + private static void updateItemViewStatus(GameViewHolder holder, + boolean hasDownload, + @Nullable String briefStyle, + @Nullable LinkEntity recommendStyle) { if (hasDownload) { if (holder.gameRating != null) holder.gameRating.setVisibility(View.GONE); holder.gameDes.setVisibility(View.GONE); holder.gameProgressbar.setVisibility(View.VISIBLE); holder.gameInfo.setVisibility(View.VISIBLE); + holder.recommendContainer.setVisibility(View.GONE); } else { holder.gameProgressbar.setVisibility(View.GONE); holder.gameInfo.setVisibility(View.GONE); + + // 推荐优先,有推荐内容时不执行下面的 star 和 brief 代码块 + if (briefStyle != null + && recommendStyle != null + && briefStyle.contains("recommend")) { + holder.recommendContainer.setVisibility(View.VISIBLE); + if (holder.gameRating != null) holder.gameRating.setVisibility(View.GONE); + holder.gameDes.setVisibility(View.GONE); + + holder.recommendTv.setText(recommendStyle.getText()); + if ("none".equals(recommendStyle.getType())) { + holder.recommendIv.setVisibility(View.GONE); + } else { + Context context = holder.recommendContainer.getContext(); + int drawableId = context.getResources().getIdentifier( + "ic_recommend_" + recommendStyle.getType(), + "drawable", + context.getPackageName()); + holder.recommendIv.setVisibility(View.VISIBLE); + holder.recommendIv.setImageResource(drawableId); + } + return; + } else { + holder.recommendContainer.setVisibility(View.GONE); + } + if (briefStyle != null && briefStyle.contains("star")) { if (holder.gameRating != null) holder.gameRating.setVisibility(View.VISIBLE); } else { if (holder.gameRating != null) holder.gameRating.setVisibility(View.GONE); } - if (TextUtils.isEmpty(briefStyle) || briefStyle.contains("brief")) { + // 缺省情况下回落到游戏简介 + if (TextUtils.isEmpty(briefStyle) || briefStyle.contains("brief") || briefStyle.contains("recommend")) { holder.gameDes.setVisibility(View.VISIBLE); } else { holder.gameDes.setVisibility(View.GONE); diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameHeadViewHolder.kt b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameHeadViewHolder.kt index 6aa80dcbcc..f80943c444 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameHeadViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameHeadViewHolder.kt @@ -7,7 +7,8 @@ import com.gh.common.util.dip2px import com.gh.gamecenter.databinding.GameHeadItemBinding import com.gh.gamecenter.entity.SubjectEntity -class GameHeadViewHolder(var binding: GameHeadItemBinding) : BaseRecyclerViewHolder(binding.root) { +class GameHeadViewHolder(var binding: GameHeadItemBinding) : + BaseRecyclerViewHolder(binding.root) { fun bindHead(subject: SubjectEntity) { val headContainerLp = binding.headContainer.layoutParams @@ -24,10 +25,19 @@ class GameHeadViewHolder(var binding: GameHeadItemBinding) : BaseRecyclerViewHol binding.subject = subject binding.headPb.visibility = View.GONE - val text = if ("change" == subject.home) "换一批" else "全部 >" + val text = if ("change" == subject.home) { + "换一批" + } else { + when (subject.home) { + "more" -> "更多 >" + "hide" -> "" + else -> "全部 >" + } + } binding.headMore.text = text if (subject.indexRightTop != null && subject.indexRightTop != "none") { + // 开测表用到的 binding.headMore.visibility = View.VISIBLE if (subject.indexRightTop == "all") { binding.headMore.text = "全部 >" @@ -40,6 +50,8 @@ class GameHeadViewHolder(var binding: GameHeadItemBinding) : BaseRecyclerViewHol && subject.type != "column_collection" && subject.type != "gallery_slide") { binding.headMore.visibility = View.GONE + } else if (subject.home == "hide"){ + binding.headMore.visibility = View.GONE } else { binding.headMore.visibility = View.VISIBLE } diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameViewHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameViewHolder.java index dfbfc82bb9..1a4b8cb666 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameViewHolder.java @@ -1,6 +1,7 @@ package com.gh.gamecenter.adapter.viewholder; import android.view.View; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; @@ -24,6 +25,9 @@ public class GameViewHolder extends BaseRecyclerViewHolder { public LinearLayout gameLabelList; public LinearLayout gameInfo; public ProgressBar gameProgressbar; + public View recommendContainer; + public TextView recommendTv; + public ImageView recommendIv; public TextView gameDownloadSpeed; public TextView gameDownloadPercentage; public TextView gameServerType; @@ -44,6 +48,9 @@ public class GameViewHolder extends BaseRecyclerViewHolder { gameDes = binding.gameDes; gameDownloadSpeed = binding.downloadSpeed; gameRating = binding.gameRating; + recommendContainer = binding.recommendContainer; + recommendTv = binding.recommendTv; + recommendIv = binding.recommendIv; } public void initServerType(GameEntity gameEntity) { diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt index 35be5cd4f4..784e4d7f59 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt @@ -238,6 +238,8 @@ data class GameEntity( val packageDialog: PackageDialogEntity? = null, @SerializedName("top_video") val topVideo: SimpleVideoEntity? = null, + @SerializedName("column_recommend") + val columnRecommend: LinkEntity? = null, // 本地字段,使用镜像信息 var useMirrorInfo: Boolean = false, @@ -573,6 +575,10 @@ data class GameEntity( return entity } + companion object { + const val TAG: String = "GameEntity" + } + @Parcelize data class Dialog(var title: String = "", var content: String = "", @@ -634,10 +640,6 @@ data class GameEntity( } } - companion object { - const val TAG: String = "GameEntity" - } - // 游戏位置, 根据游戏位置只显示某个单独的APK enum class GameLocation { INDEX, 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 df24665362..625ab244bf 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/SubjectEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/SubjectEntity.kt @@ -10,37 +10,41 @@ import kotlinx.android.parcel.Parcelize * Created by LGT on 2016/7/1. */ @Parcelize -data class SubjectEntity(@SerializedName("_id") - var id: String? = null, - var name: String? = null, - var more: Int? = null, - @SerializedName("order") - var isOrder: Boolean = false, - var home: String? = null, - var tag: String? = null, - var sort: Int = 0, - var data: MutableList? = null, - var type: String? = null, - var des: String? = null, - @SerializedName("relation_column_id") - var relatedColumnId: String? = null, - var style: String? = "", // 值为 "top" 时表示此专题(合集)为排行榜 https://gitlab.ghzs.com/pm/halo-app-issues/issues/699 - val list: Int = 0, +data class SubjectEntity( + @SerializedName("_id") + var id: String? = null, + var name: String? = null, + var more: Int? = null, + @SerializedName("order") + var isOrder: Boolean = false, + var home: String? = null, + var tag: String? = null, + var sort: Int = 0, + var data: MutableList? = null, + var type: String? = null, + var des: String? = null, + @SerializedName("relation_column_id") + var relatedColumnId: String? = null, + var style: String? = "", // 值为 "top" 时表示此专题(合集)为排行榜 https://gitlab.ghzs.com/pm/halo-app-issues/issues/699 + val list: Int = 0, - @SerializedName("show_name") - var showName: Boolean = true, // 是否显示“专题名字”,true、false - @SerializedName("show_suffix") - var showSuffix: Boolean = true, // 是否显示”游戏后缀“,true、false - @SerializedName("type_style") - var typeStyle: String = "", // 横屏样式,不显示(default)、评分(star)、备注(remark) - @SerializedName("brief_style") - var briefStyle: String = "", // 简介样式,大小+简介(size&brief)、评分+简介(star&brief)、评分(star) + @SerializedName("show_name") + var showName: Boolean = true, // 是否显示“专题名字”,true、false + @SerializedName("show_suffix") + var showSuffix: Boolean = true, // 是否显示”游戏后缀“,true、false + @SerializedName("type_style") + var typeStyle: String = "", // 横屏样式,不显示(default)、评分(star)、备注(remark) + @SerializedName("brief_style") + var briefStyle: String = "", // 简介样式,大小+简介(size&brief)、评分+简介(star&brief)、评分(star)、推荐优先(recommend) + @SerializedName("more_link") + var moreLink: LinkEntity? = null, - @SerializedName("index_right_top") - var indexRightTop: String? = null, - @SerializedName("index_right_top_link") - var indexRightTopLink: LinkEntity? = null, - var remark: String? = null // 开测表备注 + // 开测表部分字段 + @SerializedName("index_right_top") + var indexRightTop: String? = null, + @SerializedName("index_right_top_link") + var indexRightTopLink: LinkEntity? = null, + var remark: String? = null // 开测表备注 ) : Parcelable { fun getFilterName(): String { diff --git a/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt b/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt index b6f1bf7d31..719ce328db 100644 --- a/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt @@ -7,6 +7,7 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.LinearLayout +import android.widget.TextView import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -578,11 +579,15 @@ class GameFragmentAdapter(context: Context, val column = mItemDataList[position].columnHead holder.bindHead(column!!) - holder.binding.headMore.setOnClickListener { + holder.binding.headMore.setOnClickListener { it as TextView if ("change" == column.home) { MtaHelper.onEvent("游戏专题", "换一批", column.name) holder.binding.headPb.visibility = View.VISIBLE mViewModel.changeSubjectGame(column.id!!) + } else if ("more" == column.home) { + column.moreLink?.let { link -> + DirectUtils.directToLinkPage(it.context, link, "(板块)", "(游戏-专题:" + column.name + "-全部)") + } } else { if (column.type == "column_collection") { MtaHelper.onEvent("游戏专题合集", "全部", column.name) @@ -605,6 +610,7 @@ class GameFragmentAdapter(context: Context, MtaHelper.onEvent("游戏专题", "全部", column.name) } } + NewLogUtils.logSubjectTopTabClick(it.text.toString(), column.name, column.moreLink) } } diff --git a/app/src/main/java/com/gh/gamecenter/home/LegacyHomeFragmentAdapterAssistant.kt b/app/src/main/java/com/gh/gamecenter/home/LegacyHomeFragmentAdapterAssistant.kt index a7f31113a8..aaa723c4ea 100644 --- a/app/src/main/java/com/gh/gamecenter/home/LegacyHomeFragmentAdapterAssistant.kt +++ b/app/src/main/java/com/gh/gamecenter/home/LegacyHomeFragmentAdapterAssistant.kt @@ -5,6 +5,7 @@ import android.graphics.Color import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.TextView import androidx.core.content.ContextCompat import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.DefaultItemAnimator @@ -503,7 +504,7 @@ class LegacyHomeFragmentAdapterAssistant(private var mContext: Context, val column = item.columnHead holder.bindHead(column!!) - holder.binding.headMore.setOnClickListener { + holder.binding.headMore.setOnClickListener { it as TextView if ("change" == column.home) { MtaHelper.onEvent("游戏专题", "新首页专题点击", "内容" + item.blockPosition + "_换一批") holder.binding.headPb.visibility = View.VISIBLE @@ -512,6 +513,10 @@ class LegacyHomeFragmentAdapterAssistant(private var mContext: Context, if (mAdapter is HomeFragmentAdapter) { (mAdapter as HomeFragmentAdapter).viewModel.changeSubjectGame(column.id!!) } + } else if ("more" == column.home) { + column.moreLink?.let { link -> + DirectUtils.directToLinkPage(it.context, link, "(首页)", "(游戏-专题:" + column.name + "-全部)") + } } else { if (column.type == "column_collection") { MtaHelper.onEvent("游戏专题合集", "新首页合辑点击", "内容" + item.blockPosition + "_全部") @@ -538,6 +543,7 @@ class LegacyHomeFragmentAdapterAssistant(private var mContext: Context, MtaHelper.onEvent("游戏专题", "新首页专题点击", "内容" + item.blockPosition + "_全部") } } + NewLogUtils.logSubjectTopTabClick(it.text.toString(), column.name, column.moreLink) } } diff --git a/app/src/main/res/drawable-xxxhdpi/ic_recommend_activity.webp b/app/src/main/res/drawable-xxxhdpi/ic_recommend_activity.webp new file mode 100644 index 0000000000..4dd50dfeee Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_recommend_activity.webp differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_recommend_discount.webp b/app/src/main/res/drawable-xxxhdpi/ic_recommend_discount.webp new file mode 100644 index 0000000000..a115ee3c72 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_recommend_discount.webp differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_recommend_function.webp b/app/src/main/res/drawable-xxxhdpi/ic_recommend_function.webp new file mode 100644 index 0000000000..b663dc122f Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_recommend_function.webp differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_recommend_gift.webp b/app/src/main/res/drawable-xxxhdpi/ic_recommend_gift.webp new file mode 100644 index 0000000000..7de7d2cf76 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_recommend_gift.webp differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_recommend_role.webp b/app/src/main/res/drawable-xxxhdpi/ic_recommend_role.webp new file mode 100644 index 0000000000..a377af987d Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_recommend_role.webp differ diff --git a/app/src/main/res/drawable/bg_game_item_recommend.xml b/app/src/main/res/drawable/bg_game_item_recommend.xml new file mode 100644 index 0000000000..d9a0d4bf63 --- /dev/null +++ b/app/src/main/res/drawable/bg_game_item_recommend.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/game_item.xml b/app/src/main/res/layout/game_item.xml index da9a93a05d..4ed9aea442 100644 --- a/app/src/main/res/layout/game_item.xml +++ b/app/src/main/res/layout/game_item.xml @@ -1,6 +1,7 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> @@ -72,8 +73,8 @@ imageUrl="@{game.getRawIconInAdvanced()}" android:layout_width="64dp" android:layout_height="64dp" - fresco:roundedCornerRadius="10dp" - fresco:viewAspectRatio="1" /> + app:roundedCornerRadius="10dp" + app:viewAspectRatio="1" /> + app:viewAspectRatio="1" /> @@ -111,7 +112,8 @@ android:singleLine="true" android:textColor="@color/text_333333" android:textSize="14sp" - android:textStyle="bold" /> + android:textStyle="bold" + tools:text="地海争霸:巫妖王再怒" /> + android:textSize="10sp" + tools:text="巫妖王再怒霜之哀殤又飢渴" /> + + + + + + + + #F10000 #EA3333 #FF700F + #FF7C1F #181927 #e6f3ff #1383EB diff --git a/dependencies.gradle b/dependencies.gradle index cfddf2bd91..0634a87f0b 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,8 +7,8 @@ ext { targetSdkVersion = 26 // application info (每个大版本之间的 versionCode 增加 20) - versionCode = 330 - versionName = "4.9.0" + versionCode = 350 + versionName = "5.0.0" applicationId = "com.gh.gamecenter" // AndroidX diff --git a/gradle.properties b/gradle.properties index d908b526c5..f2ae90fa01 100644 --- a/gradle.properties +++ b/gradle.properties @@ -48,10 +48,10 @@ QUICK_LOGIN_APPID=300012035775 QUICK_LOGIN_APPKEY=002BAABA2C078342DA33BEAB0A4C6A25 # hosts -DEV_API_HOST=https\://dev-and-api.ghzs.com/v4d9d0/ +DEV_API_HOST=https\://dev-and-api.ghzs.com/v5d0d0/ -API_HOST=https\://and-api.ghzs.com/v4d8d0/ -SENSITIVE_API_HOST=https\://and-api.ghzs.com/v4d8d0/ +API_HOST=https\://and-api.ghzs.com/v4d9d0/ +SENSITIVE_API_HOST=https\://and-api.ghzs.com/v4d9d0/ # 请不要手动改动下面的值,除非你明确需要以某个apk作为基准包,需要打包请以scripts/tinker*.sh为准 TINKER_ENABLE=