diff --git a/app/src/main/java/com/gh/common/databind/BindingAdapters.java b/app/src/main/java/com/gh/common/databind/BindingAdapters.java index 56c4f589e4..8308df2f79 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -262,7 +262,7 @@ public class BindingAdapters { public static void setGameIcon(View view, GameEntity gameEntity) { if (gameEntity != null && view instanceof GameIconView) { - ((GameIconView) view).displayGameIcon(gameEntity.getIcon(), gameEntity.getIconSubscript()); + ((GameIconView) view).displayGameIcon(gameEntity.getIcon(), gameEntity.getIconSubscript(), gameEntity.getIconFloat()); } } diff --git a/app/src/main/java/com/gh/common/history/HistoryDatabase.kt b/app/src/main/java/com/gh/common/history/HistoryDatabase.kt index 291db67894..d446fff269 100644 --- a/app/src/main/java/com/gh/common/history/HistoryDatabase.kt +++ b/app/src/main/java/com/gh/common/history/HistoryDatabase.kt @@ -19,7 +19,7 @@ import com.halo.assistant.HaloApp @Database( entities = [AnswerEntity::class, ArticleEntity::class, NewsEntity::class, HistoryGameEntity::class, MyVideoEntity::class, GamesCollectionEntity::class], - version = 12, + version = 13, exportSchema = false ) @TypeConverters( @@ -40,7 +40,8 @@ import com.halo.assistant.HaloApp MeConverter::class, SimpleGameListConverter::class, TagInfoListConverter::class, - ActivityLabelListConverter::class + ActivityLabelListConverter::class, + IconFloatConverter::class ) abstract class HistoryDatabase : RoomDatabase() { @@ -136,6 +137,12 @@ abstract class HistoryDatabase : RoomDatabase() { } } + val MIGRATION_12_13: Migration = object : Migration(12, 13) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("Alter TABLE HistoryGameEntity add iconFloat TEXT") + } + } + val instance by lazy { Room.databaseBuilder( HaloApp.getInstance().application, @@ -152,6 +159,7 @@ abstract class HistoryDatabase : RoomDatabase() { .addMigrations(MIGRATION_9_10) .addMigrations(MIGRATION_10_11) .addMigrations(MIGRATION_11_12) + .addMigrations(MIGRATION_12_13) .build() } } diff --git a/app/src/main/java/com/gh/common/history/HistoryHelper.kt b/app/src/main/java/com/gh/common/history/HistoryHelper.kt index 03ffceb51d..68c40bd872 100644 --- a/app/src/main/java/com/gh/common/history/HistoryHelper.kt +++ b/app/src/main/java/com/gh/common/history/HistoryHelper.kt @@ -56,6 +56,7 @@ object HistoryHelper { historyGame.des = "" historyGame.icon = updateEntity.rawIcon ?: updateEntity.icon historyGame.iconSubscript = updateEntity.iconSubscript + historyGame.iconFloat = updateEntity.iconFloat historyGame.name = updateEntity.name historyGame.tagStyle = updateEntity.tagStyle return historyGame @@ -70,6 +71,7 @@ object HistoryHelper { historyGame.des = gameEntity.des historyGame.icon = gameEntity.rawIcon ?: gameEntity.icon historyGame.iconSubscript = gameEntity.iconSubscript + historyGame.iconFloat = gameEntity.iconFloat historyGame.name = gameEntity.name historyGame.tagStyle = gameEntity.tagStyle historyGame.tag = gameEntity.getTag() diff --git a/app/src/main/java/com/gh/common/util/GameUtils.java b/app/src/main/java/com/gh/common/util/GameUtils.java index 3906766d87..c1aa81a51a 100644 --- a/app/src/main/java/com/gh/common/util/GameUtils.java +++ b/app/src/main/java/com/gh/common/util/GameUtils.java @@ -204,6 +204,7 @@ public class GameUtils { gameUpdateEntity.setIcon(gameEntity.getIcon()); gameUpdateEntity.setRawIcon(gameEntity.getRawIcon()); gameUpdateEntity.setIconSubscript(gameEntity.getIconSubscript()); + gameUpdateEntity.setIconFloat(gameEntity.getIconFloat()); gameUpdateEntity.setName(gameEntity.getName()); gameUpdateEntity.setPackageName(apkEntity.getPackageName()); gameUpdateEntity.setSize(apkEntity.getSize()); diff --git a/app/src/main/java/com/gh/common/util/PackageUtils.java b/app/src/main/java/com/gh/common/util/PackageUtils.java index ef114fc4cd..2a1b117e29 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -118,6 +118,7 @@ public class PackageUtils { updateEntity.setIcon(gameEntity.getIcon()); updateEntity.setRawIcon(gameEntity.getRawIcon()); updateEntity.setIconSubscript(gameEntity.getIconSubscript()); + updateEntity.setIconFloat(gameEntity.getIconFloat()); updateEntity.setPackageName(apkEntity.getPackageName()); updateEntity.setSize(apkEntity.getSize()); updateEntity.setVersion(apkEntity.getVersion()); @@ -185,6 +186,7 @@ public class PackageUtils { updateEntity.setIcon(gameEntity.getIcon()); updateEntity.setRawIcon(gameEntity.getRawIcon()); updateEntity.setIconSubscript(gameEntity.getIconSubscript()); + updateEntity.setIconFloat(gameEntity.getIconFloat()); updateEntity.setPackageName(apkEntity.getPackageName()); updateEntity.setSize(apkEntity.getSize()); updateEntity.setVersion(apkEntity.getVersion()); diff --git a/app/src/main/java/com/gh/download/DownloadManager.java b/app/src/main/java/com/gh/download/DownloadManager.java index 8d992b4cc0..7ea0edb6a5 100644 --- a/app/src/main/java/com/gh/download/DownloadManager.java +++ b/app/src/main/java/com/gh/download/DownloadManager.java @@ -326,6 +326,11 @@ public class DownloadManager implements DownloadStatusListener { ExtensionsKt.addMetaExtra(downloadEntity, Constants.GAME_ICON_SUBSCRIPT, gameEntity.getIconSubscript()); ExtensionsKt.addMetaExtra(downloadEntity, Constants.IS_PLATFORM_RECOMMEND, apkEntity.getRecommend() != null ? "true" : "false"); ExtensionsKt.addMetaExtra(downloadEntity, Constants.GAME_NAME, gameEntity.getName()); + if (gameEntity.getIconFloat() != null) { + ExtensionsKt.addMetaExtra(downloadEntity, Constants.GAME_ICON_FLOAT_TOP_TEXT, gameEntity.getIconFloat().getUpperLeftText()); + ExtensionsKt.addMetaExtra(downloadEntity, Constants.GAME_ICON_FLOAT_TOP_COLOR, gameEntity.getIconFloat().getUpperLeftColor()); + ExtensionsKt.addMetaExtra(downloadEntity, Constants.GAME_ICON_FLOAT_BOTTOM_TEXT, gameEntity.getIconFloat().getBottomText()); + } if (SimulatorGameManager.isSimulatorGame(gameEntity)) { ExtensionsKt.addMetaExtra(downloadEntity, Constants.SIMULATOR_GAME, apkEntity.getFormat()); ExtensionsKt.addMetaExtra(downloadEntity, Constants.SIMULATOR, GsonUtils.toJson(gameEntity.getSimulator())); diff --git a/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java index 1ee0a83e06..68177c07bd 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java @@ -200,11 +200,11 @@ public class LibaoDetailAdapter extends BaseRecyclerAdapter { ExtensionsKt.setRootBackgroundColor(holder.binding.getRoot(), R.color.background_white); if (mLibaoEntity.getGame() != null) { - holder.binding.libaodetailGameIcon.displayGameIcon(mLibaoEntity.getGame().getIcon(), mLibaoEntity.getGame().getIconSubscript()); + holder.binding.libaodetailGameIcon.displayGameIcon(mLibaoEntity.getGame().getIcon(), mLibaoEntity.getGame().getIconSubscript(), mLibaoEntity.getGame().getIconFloat()); GameEntity gameEntity = mLibaoEntity.getGame().toGameEntity(); GameItemViewHolder.initGameSubtitle(gameEntity, holder.binding.gameSubtitleTv, null, null, false, null); } else { - holder.binding.libaodetailGameIcon.displayGameIcon(mLibaoEntity.getIcon(), null); + holder.binding.libaodetailGameIcon.displayGameIcon(mLibaoEntity.getIcon(), null, mLibaoEntity.getGame().getIconFloat()); } holder.binding.libaodetailName.setText(mLibaoEntity.getName()); if (TextUtils.isEmpty(mLibaoEntity.getPlatform())) { diff --git a/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java index c613390101..78365bb06b 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java @@ -291,9 +291,9 @@ public class MessageDetailAdapter extends BaseRecyclerAdapter { } if (mConcernEntity.getGame() != null) { - viewHolder.binding.newsDigestThumb.displayGameIcon(mConcernEntity.getGame().getIcon(), mConcernEntity.getGame().getIconSubscript()); + viewHolder.binding.newsDigestThumb.displayGameIcon(mConcernEntity.getGame().getIcon(), mConcernEntity.getGame().getIconSubscript(), mConcernEntity.getGame().getIconFloat()); } else { - viewHolder.binding.newsDigestThumb.displayGameIcon(mConcernEntity.getGameIcon(), null); + viewHolder.binding.newsDigestThumb.displayGameIcon(mConcernEntity.getGameIcon(), null, mConcernEntity.getGame().getIconFloat()); } viewHolder.binding.newsDigestTitle.setText(mConcernEntity.getGameName()); NewsUtils.setNewsPublishOn(viewHolder.binding.newsDigestTime, mConcernEntity.getTime()); diff --git a/app/src/main/java/com/gh/gamecenter/amway/AmwayAdapter.kt b/app/src/main/java/com/gh/gamecenter/amway/AmwayAdapter.kt index 55307e5a59..08f6954c3f 100644 --- a/app/src/main/java/com/gh/gamecenter/amway/AmwayAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/amway/AmwayAdapter.kt @@ -255,7 +255,7 @@ class AmwayAdapter( binding.gameIconView.displayGameIcon( amway.game.rawIcon - ?: amway.game.icon, amway.game.iconSubscript + ?: amway.game.icon, amway.game.iconSubscript, amway.game.iconFloat ) amway.game.tag?.let { diff --git a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java index 4f21437232..1a3b5a4a8e 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java @@ -17,6 +17,7 @@ import androidx.recyclerview.widget.RecyclerView.ViewHolder; import com.gh.common.util.DialogUtils; import com.gh.common.util.PackageInstaller; import com.gh.common.util.PackageUtils; +import com.gh.gamecenter.common.entity.IconFloat; import com.gh.gamecenter.feature.utils.PlatformUtils; import com.gh.gamecenter.feature.view.DownloadButton; import com.gh.common.xapk.XapkInstaller; @@ -125,7 +126,12 @@ class GameDownloadFragmentAdapter extends BaseRecyclerAdapter { if (!TextUtils.isEmpty(rawIcon)) { icon = rawIcon; } - viewHolder.binding.dmItemIvIcon.displayGameIcon(icon, ExtensionsKt.getMetaExtra(downloadEntity, Constants.GAME_ICON_SUBSCRIPT)); + IconFloat iconFloat = new IconFloat( + ExtensionsKt.getMetaExtra(downloadEntity, Constants.GAME_ICON_FLOAT_TOP_TEXT), + ExtensionsKt.getMetaExtra(downloadEntity, Constants.GAME_ICON_FLOAT_TOP_COLOR), + ExtensionsKt.getMetaExtra(downloadEntity, Constants.GAME_ICON_FLOAT_BOTTOM_TEXT) + ); + viewHolder.binding.dmItemIvIcon.displayGameIcon(icon, ExtensionsKt.getMetaExtra(downloadEntity, Constants.GAME_ICON_SUBSCRIPT), iconFloat); } else { ImageUtils.display(viewHolder.binding.dmItemIvIcon.getIconIv(), R.mipmap.logo); viewHolder.binding.dmItemIvIcon.getIconDecoratorIv().setVisibility(View.GONE); diff --git a/app/src/main/java/com/gh/gamecenter/download/NewInstalledGameFragmentAdapter.kt b/app/src/main/java/com/gh/gamecenter/download/NewInstalledGameFragmentAdapter.kt index 1ccab6b4c5..b03493afb2 100644 --- a/app/src/main/java/com/gh/gamecenter/download/NewInstalledGameFragmentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/download/NewInstalledGameFragmentAdapter.kt @@ -82,12 +82,13 @@ class NewInstalledGameFragmentAdapter(context: Context, private var mViewModel: name = gameEntity.name binding.gameIconView.displayGameIcon( gameEntity.getRawIconInAdvanced(), - gameEntity.iconSubscript + gameEntity.iconSubscript, + gameEntity.iconFloat ) binding.gameDes.text = gameEntity.brief } if (isSimulatorGame(gameEntity)) { - binding.gameIconView.displayGameIcon(gameEntity.icon, gameEntity.iconSubscript) + binding.gameIconView.displayGameIcon(gameEntity.icon, gameEntity.iconSubscript, gameEntity.iconFloat) } binding.gameName.text = name generateExposureEvent(gameEntity) diff --git a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt index 333e38b0d0..a660599b0d 100644 --- a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt @@ -168,7 +168,7 @@ class UpdatableGameAdapter(private var mViewModel: UpdatableGameViewModel) : container.setBackgroundColor(R.color.background_white.toColor(context)) } - iconIv.displayGameIcon(update.rawIcon ?: update.icon, update.iconSubscript) + iconIv.displayGameIcon(update.rawIcon ?: update.icon, update.iconSubscript, update.iconFloat) val nameText = if (!update.readablePlatform.isNullOrEmpty()) { update.name + " - " + update.readablePlatform } else { diff --git a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt index 818e341afd..e17936d0e7 100644 --- a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt @@ -586,6 +586,11 @@ class UpdatableGameViewModel( downloadEntity.addMetaExtra(Constants.GAME_ICON_SUBSCRIPT, update.iconSubscript) downloadEntity.addMetaExtra(Constants.DOWNLOAD_ID, downloadId) downloadEntity.addMetaExtra(Constants.APK_MD5, update.md5) + if (update.iconFloat != null) { + downloadEntity.addMetaExtra(Constants.GAME_ICON_FLOAT_TOP_TEXT, update.iconFloat?.upperLeftText) + downloadEntity.addMetaExtra(Constants.GAME_ICON_FLOAT_TOP_COLOR, update.iconFloat?.upperLeftColor) + downloadEntity.addMetaExtra(Constants.GAME_ICON_FLOAT_BOTTOM_TEXT, update.iconFloat?.bottomText) + } val platform = PlatformUtils.getInstance(getApplication()).getPlatformName(update.platform) if ("官方版" != platform) { diff --git a/app/src/main/java/com/gh/gamecenter/entity/AmwayCommentEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/AmwayCommentEntity.kt index ad5362e3ec..4a0cba2049 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/AmwayCommentEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/AmwayCommentEntity.kt @@ -1,6 +1,7 @@ package com.gh.gamecenter.entity import android.os.Parcelable +import com.gh.gamecenter.common.entity.IconFloat import com.gh.gamecenter.feature.entity.GameEntity import com.gh.gamecenter.feature.entity.TagStyleEntity import com.google.gson.annotations.SerializedName @@ -37,6 +38,8 @@ data class AmwayCommentEntity( var subtitle: String? = "", @SerializedName("subtitle_style") var subtitleStyle: TagStyleEntity? = null, + @SerializedName("icon_float") + var iconFloat: IconFloat? = null, // 曝光用的位置 var sequence: Int = 0, @@ -54,6 +57,7 @@ data class AmwayCommentEntity( gameEntity.icon = icon gameEntity.rawIcon = rawIcon gameEntity.iconSubscript = iconSubscript + gameEntity.iconFloat = iconFloat gameEntity.platform = "" gameEntity.subtitle = subtitle ?: "" diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameInstall.kt b/app/src/main/java/com/gh/gamecenter/entity/GameInstall.kt index f8fd413c8c..1be15caaf9 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameInstall.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/GameInstall.kt @@ -1,6 +1,7 @@ package com.gh.gamecenter.entity import com.gh.common.util.PackageUtils +import com.gh.gamecenter.common.entity.IconFloat import com.gh.gamecenter.feature.entity.GameEntity import com.google.gson.annotations.SerializedName import com.halo.assistant.HaloApp @@ -12,6 +13,7 @@ data class GameInstall( var name: String? = "", var icon: String? = "", var iconSubScript: String? = "", + var iconFloat: IconFloat? = null, var isSignByGh: Boolean = false, var installTime: Long = 0, var version: String = "", @@ -29,6 +31,7 @@ data class GameInstall( gameInstall.name = game.name gameInstall.icon = game.rawIcon ?: game.icon gameInstall.iconSubScript = game.iconSubscript + gameInstall.iconFloat = game.iconFloat gameInstall.version = PackageUtils.getVersionNameByPackageName(installedPkgName) ?: "unknown" gameInstall.packageName = installedPkgName gameInstall.isSmoothGame = game.isVGame() diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt index 3e4dcf50f4..19e2f43c6d 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt @@ -1,5 +1,6 @@ package com.gh.gamecenter.entity +import com.gh.gamecenter.common.entity.IconFloat import com.gh.gamecenter.feature.exposure.ExposureEvent import com.gh.gamecenter.feature.entity.* import com.google.gson.annotations.SerializedName @@ -13,6 +14,8 @@ data class GameUpdateEntity( var rawIcon: String? = null, @SerializedName("icon_subscript") var iconSubscript: String? = "", + @SerializedName("icon_float") + var iconFloat: IconFloat? = null, @SerializedName("package") var packageName: String = "", var size: String? = null, @@ -60,6 +63,7 @@ data class GameUpdateEntity( gameEntity.icon = icon gameEntity.rawIcon = rawIcon gameEntity.iconSubscript = iconSubscript + gameEntity.iconFloat = iconFloat gameEntity.tagStyle = tagStyle gameEntity.brief = brief gameEntity.download = download diff --git a/app/src/main/java/com/gh/gamecenter/entity/HistoryGameEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/HistoryGameEntity.kt index 0e29ce48bf..b192cc8f48 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/HistoryGameEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/HistoryGameEntity.kt @@ -2,6 +2,7 @@ package com.gh.gamecenter.entity import androidx.room.Entity import androidx.room.PrimaryKey +import com.gh.gamecenter.common.entity.IconFloat import com.gh.gamecenter.feature.entity.GameEntity import com.gh.gamecenter.feature.entity.TagStyleEntity import com.google.gson.annotations.SerializedName @@ -12,6 +13,7 @@ data class HistoryGameEntity( var id: String = "", var icon: String? = null, var iconSubscript: String? = null, + var iconFloat: IconFloat? = null, var name: String? = null, var brief: String? = null, @@ -36,6 +38,7 @@ data class HistoryGameEntity( gameEntity.des = des gameEntity.rawIcon = icon gameEntity.iconSubscript = iconSubscript + gameEntity.iconFloat = iconFloat gameEntity.subtitle = subtitle gameEntity.subtitleStyle = subtitleStyle gameEntity.name = name diff --git a/app/src/main/java/com/gh/gamecenter/entity/PersonalHistoryEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/PersonalHistoryEntity.kt index 6667e3595b..6ed1cdca44 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/PersonalHistoryEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/PersonalHistoryEntity.kt @@ -5,6 +5,7 @@ import android.os.Parcelable import com.gh.gamecenter.common.annotation.SyncPage import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.entity.CommunityEntity +import com.gh.gamecenter.common.entity.IconFloat import com.gh.gamecenter.common.syncpage.SyncFieldConstants import com.gh.gamecenter.core.utils.SPUtils import com.gh.gamecenter.core.utils.TimeUtils @@ -133,6 +134,8 @@ data class PersonalHistoryEntity( var rawIcon: String? = null, @SerializedName("icon_subscript") var iconSubscript: String? = null, + @SerializedName("icon_float") + var iconFloat: IconFloat? = null, @SerializedName("played_time") val playedTime: Long = 0 diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt index 38ec0a4d19..5dfc3c7d8e 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt @@ -342,8 +342,8 @@ class ForumDetailFragment : BaseLazyTabFragment(), IScrollable { mBinding.forumThumbSmall.displayGameIcon(icon, null) mBinding.forumThumbBig.displayGameIcon(icon, null) } else { - mBinding.forumThumbSmall.displayGameIcon(game.getIcon(), game.iconSubscript) - mBinding.forumThumbBig.displayGameIcon(game.getIcon(), game.iconSubscript) + mBinding.forumThumbSmall.displayGameIcon(game.getIcon(), game.iconSubscript, game.iconFloat) + mBinding.forumThumbBig.displayGameIcon(game.getIcon(), game.iconSubscript, game.iconFloat) } mBinding.toolbar.setNavigationIcon(if (!mIsDarkModeOn) R.drawable.ic_bar_back else R.drawable.ic_bar_back_light) mBinding.searchIv.setImageDrawable( diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleAskItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleAskItemViewHolder.kt index 22a92b3c45..59436cec93 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleAskItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleAskItemViewHolder.kt @@ -326,7 +326,11 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : if (entity.bbs.type == "official_bbs") { forumIcon?.displayGameIcon(entity.bbs.icon, null) } else { - forumIcon?.displayGameIcon(entity.bbs.game?.getIcon(), entity.bbs.game?.iconSubscript) + forumIcon?.displayGameIcon( + entity.bbs.game?.getIcon(), + entity.bbs.game?.iconSubscript, + entity.bbs.game?.iconFloat + ) } forumNameTv.setOnClickListener { diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumRecordsAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumRecordsAdapter.kt index 663cc84d99..549f864ab8 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumRecordsAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumRecordsAdapter.kt @@ -48,7 +48,11 @@ class ForumRecordsAdapter( if (forumEntity.type == "official_bbs") { forumIv.displayGameIcon(forumEntity.icon, null) } else { - forumIv.displayGameIcon(forumEntity.game.getIcon(), forumEntity.game.iconSubscript) + forumIv.displayGameIcon( + forumEntity.game.getIcon(), + forumEntity.game.iconSubscript, + forumEntity.game.iconFloat + ) } root.setOnClickListener { diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/HorizontalForumsAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/home/HorizontalForumsAdapter.kt index c86a57e982..54a26b3008 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/HorizontalForumsAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/HorizontalForumsAdapter.kt @@ -55,7 +55,11 @@ class HorizontalForumsAdapter( if (forumEntity.type == "official_bbs") { forumIv.displayGameIcon(forumEntity.icon, null) } else { - forumIv.displayGameIcon(forumEntity.game.getIcon(), forumEntity.game.iconSubscript) + forumIv.displayGameIcon( + forumEntity.game.getIcon(), + forumEntity.game.iconSubscript, + forumEntity.game.iconFloat + ) } followTv.run { diff --git a/app/src/main/java/com/gh/gamecenter/forum/list/ForumListAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/list/ForumListAdapter.kt index 4f430cac7b..547ded9a73 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/list/ForumListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/list/ForumListAdapter.kt @@ -65,7 +65,11 @@ class ForumListAdapter( if (forumEntity?.type == "official_bbs") { forumIcon.displayGameIcon(forumEntity.icon, null) } else { - forumIcon.displayGameIcon(forumEntity.game.getIcon(), forumEntity.game.iconSubscript) + forumIcon.displayGameIcon( + forumEntity.game.getIcon(), + forumEntity.game.iconSubscript, + forumEntity.game.iconFloat + ) } topLine.visibility = if (position == 0) View.GONE else View.VISIBLE 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 c67177cd7d..e1460c75f7 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -1119,7 +1119,9 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { } mBodyBinding.gamedetailTvName.isSelected = true val ranking = mNewGameDetailEntity!!.ranking - if (ranking != null) { + val shouldShowRank = + (ranking != null && (mGameEntity?.iconFloat == null || mGameEntity?.iconFloat?.bottomText.isNullOrEmpty())) || (ranking != null && ranking.no.toInt() <= 10 && mGameEntity?.iconFloat != null && !mGameEntity?.iconFloat?.bottomText.isNullOrEmpty()) + if (ranking != null && shouldShowRank) { mBodyBinding.gameDetailRankLl.visibility = View.VISIBLE mBodyBinding.gameDetailRankTv.text = "${ranking.columnName}第${ranking.no}名" mBodyBinding.gameDetailRankTv.isSelected = true @@ -1134,7 +1136,9 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { } } - BindingAdapters.setGame(mBodyBinding.gamedetailIvThumb, mGameEntity) + BindingAdapters.setGame(mBodyBinding.gamedetailIvThumb, mGameEntity?.apply { + if (shouldShowRank && iconFloat != null) iconFloat!!.bottomText = "" + }) BindingAdapters.setGame(mBodyBinding.gamedetailThumbSmall, mGameEntity) mNewGameDetailEntity?.event?.let { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/myrating/MyRatingAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/myrating/MyRatingAdapter.kt index 627a27605a..1a15c414a4 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/myrating/MyRatingAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/myrating/MyRatingAdapter.kt @@ -62,7 +62,11 @@ class MyRatingAdapter( holder.binding.tvComment.setExpandMaxLines(maxDesLines) holder.binding.tvComment.setIsExpanded(Int.MAX_VALUE == maxDesLines) - holder.binding.gameIcon.displayGameIcon(rating.game.getRawIconIfExisted(), rating.game.iconSubscript) + holder.binding.gameIcon.displayGameIcon( + rating.game.getRawIconIfExisted(), + rating.game.iconSubscript, + rating.game.iconFloat + ) val m = Pattern.compile(RatingEditActivity.LABEL_REGEX).matcher(rating.content) if (m.find()) { diff --git a/app/src/main/java/com/gh/gamecenter/info/ConcernAdapter.java b/app/src/main/java/com/gh/gamecenter/info/ConcernAdapter.java index 7aa39d8774..5c158a7acf 100644 --- a/app/src/main/java/com/gh/gamecenter/info/ConcernAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/info/ConcernAdapter.java @@ -362,9 +362,9 @@ class ConcernAdapter extends BaseRecyclerAdapter { viewHolder.setClickData(concernEntity); if (concernEntity.getGame() != null) { - viewHolder.binding.newsDigestThumb.displayGameIcon(concernEntity.getGame().getIcon(), concernEntity.getGame().getIconSubscript()); + viewHolder.binding.newsDigestThumb.displayGameIcon(concernEntity.getGame().getIcon(), concernEntity.getGame().getIconSubscript(), concernEntity.getGame().getIconFloat()); } else { - viewHolder.binding.newsDigestThumb.displayGameIcon(concernEntity.getGameIcon(), null); + viewHolder.binding.newsDigestThumb.displayGameIcon(concernEntity.getGameIcon(), null, concernEntity.getGame().getIconFloat()); } viewHolder.binding.newsDigestTitle.setText(concernEntity.getGameName()); diff --git a/app/src/main/java/com/gh/gamecenter/libao/Libao2FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/libao/Libao2FragmentAdapter.java index 8afae28d62..ad88ded1fe 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/Libao2FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/libao/Libao2FragmentAdapter.java @@ -207,7 +207,7 @@ class Libao2FragmentAdapter extends BaseRecyclerAdapter { holder.setClickData(libaoEntity); ExtensionsKt.setRootBackgroundColor(holder.binding.getRoot(), R.color.background_white); holder.binding.libaoName.setText(libaoEntity.getName()); - holder.binding.libaoGameIcon.displayGameIcon(libaoEntity.getIcon(), libaoEntity.getIconSubscript()); + holder.binding.libaoGameIcon.displayGameIcon(libaoEntity.getIcon(), libaoEntity.getIconSubscript(), libaoEntity.getGame().getIconFloat()); if (TextUtils.isEmpty(libaoEntity.getPlatform())) { holder.binding.libaoGameName.setText(libaoEntity.getGame().getName()); } else { diff --git a/app/src/main/java/com/gh/gamecenter/libao/Libao3FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/libao/Libao3FragmentAdapter.java index a708118eb0..b0404c345d 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/Libao3FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/libao/Libao3FragmentAdapter.java @@ -205,7 +205,7 @@ class Libao3FragmentAdapter extends BaseRecyclerAdapter final LibaoEntity libaoEntity = mLibaoList.get(position); ExtensionsKt.setRootBackgroundColor(holder.binding.getRoot(), R.color.background_white); holder.binding.libaoName.setText(libaoEntity.getName()); - holder.binding.libaoGameIcon.displayGameIcon(libaoEntity.getIcon(), libaoEntity.getIconSubscript()); + holder.binding.libaoGameIcon.displayGameIcon(libaoEntity.getIcon(), libaoEntity.getIconSubscript(), libaoEntity.getGame().getIconFloat()); if (mFilter.equals("expires:false") && libaoEntity.getExpires() > 0) { holder.binding.expiresTime.setVisibility(View.VISIBLE); holder.binding.expiresTime.setText(String.format(Locale.CHINA, "%s过期", TimeUtils.getFormatTime(libaoEntity.getExpires(), "MM.dd"))); diff --git a/app/src/main/java/com/gh/gamecenter/libao/LibaoHistoryAdapter.java b/app/src/main/java/com/gh/gamecenter/libao/LibaoHistoryAdapter.java index 32a9ec002b..c5a5c7c65e 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/LibaoHistoryAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/libao/LibaoHistoryAdapter.java @@ -161,7 +161,7 @@ public class LibaoHistoryAdapter extends BaseRecyclerAdapter { viewHolder.binding.libaoName.setText(libaoEntity.getName()); viewHolder.binding.libaoDes.setText(libaoEntity.getContent()); viewHolder.binding.libaoGameName.setText(libaoEntity.getGame().getName()); - viewHolder.binding.libaoGameIcon.displayGameIcon(libaoEntity.getIcon(), libaoEntity.getIconSubscript()); + viewHolder.binding.libaoGameIcon.displayGameIcon(libaoEntity.getIcon(), libaoEntity.getIconSubscript(), libaoEntity.getGame().getIconFloat()); //领取状态 if (TextUtils.isEmpty(libaoEntity.getStatus())) { diff --git a/app/src/main/java/com/gh/gamecenter/libao/LibaoNewAdapter.kt b/app/src/main/java/com/gh/gamecenter/libao/LibaoNewAdapter.kt index 426e808326..05102f5f23 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/LibaoNewAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/libao/LibaoNewAdapter.kt @@ -201,7 +201,11 @@ class LibaoNewAdapter( .getPlatformName(libaoEntity.platform) ) } - holder.binding.libaoGameIcon.displayGameIcon(libaoEntity.getIcon(), libaoEntity.getIconSubscript()) + holder.binding.libaoGameIcon.displayGameIcon( + libaoEntity.getIcon(), + libaoEntity.getIconSubscript(), + libaoEntity.game?.iconFloat + ) val content: String if (libaoEntity.content!!.contains("
")) { diff --git a/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchAdapter.kt b/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchAdapter.kt index 56c1f04a77..c40a9b438d 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchAdapter.kt @@ -222,7 +222,11 @@ class LibaoSearchAdapter( .getPlatformName(libaoEntity.platform) ) } - holder.binding.libaoGameIcon.displayGameIcon(libaoEntity.getIcon(), libaoEntity.getIconSubscript()) + holder.binding.libaoGameIcon.displayGameIcon( + libaoEntity.getIcon(), + libaoEntity.getIconSubscript(), + libaoEntity.game?.iconFloat + ) val content: String if (libaoEntity.content!!.contains("
")) { diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/InstalledGameAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/InstalledGameAdapter.kt index 3fdb06d208..63b8623d77 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/InstalledGameAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/InstalledGameAdapter.kt @@ -23,7 +23,11 @@ class InstalledGameAdapter(mContext: Context, val games: ArrayList) override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { val gameInstall = games[position] holder.itemView.apply { - findViewById(R.id.game_icon).displayGameIcon(gameInstall.icon, gameInstall.iconSubScript) + findViewById(R.id.game_icon).displayGameIcon( + gameInstall.icon, + gameInstall.iconSubScript, + gameInstall.iconFloat + ) findViewById(R.id.game_name).text = gameInstall.name } } diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/PersonalItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/personalhome/PersonalItemViewHolder.kt index 03bed12d67..89518888bb 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/PersonalItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/PersonalItemViewHolder.kt @@ -16,7 +16,11 @@ class PersonalItemViewHolder(val binding: CommunityAnswerItemBinding) : if (entity.community.type == "official_bbs") { forumIcon?.displayGameIcon(entity.community.icon, null) } else { - forumIcon?.displayGameIcon(entity.community.game?.getIcon(), entity.community.game?.iconSubscript) + forumIcon?.displayGameIcon( + entity.community.game?.getIcon(), + entity.community.game?.iconSubscript, + entity.community.game?.iconFloat + ) } forumNameContainer?.setOnClickListener { diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/home/game/UserCommentHistoryAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/home/game/UserCommentHistoryAdapter.kt index a4be8052c3..253a1a6474 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/home/game/UserCommentHistoryAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/home/game/UserCommentHistoryAdapter.kt @@ -80,7 +80,11 @@ class UserCommentHistoryAdapter( holder.binding.tvComment.setExpandMaxLines(maxDesLines) holder.binding.tvComment.setIsExpanded(Int.MAX_VALUE == maxDesLines) - holder.binding.gameIcon.displayGameIcon(rating.game.getRawIconIfExisted(), rating.game.iconSubscript) + holder.binding.gameIcon.displayGameIcon( + rating.game.getRawIconIfExisted(), + rating.game.iconSubscript, + rating.game.iconFloat + ) val m = Pattern.compile(RatingEditActivity.LABEL_REGEX).matcher(rating.content) if (m.find()) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/BaseAnswerOrArticleItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/BaseAnswerOrArticleItemViewHolder.kt index c89092c14f..ba1f9d3f56 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/BaseAnswerOrArticleItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/BaseAnswerOrArticleItemViewHolder.kt @@ -136,7 +136,11 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH if (entity.bbs.type == "official_bbs") { forumIcon?.displayGameIcon(entity.bbs.icon, null) } else { - forumIcon?.displayGameIcon(entity.bbs.game?.getIcon(), entity.bbs.game?.iconSubscript) + forumIcon?.displayGameIcon( + entity.bbs.game?.getIcon(), + entity.bbs.game?.iconSubscript, + entity.bbs.game?.iconFloat + ) } val contentType = when (entity.type) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailContentViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailContentViewHolder.kt index b91cff18cd..6347656215 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailContentViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailContentViewHolder.kt @@ -183,7 +183,7 @@ class ArticleDetailContentViewHolder( val icon = if (!entity.icon.isNullOrEmpty()) entity.icon else entity.game?.getIcon() val iconSubscript = if (!entity.iconSubscript.isNullOrEmpty()) entity.iconSubscript else entity.game?.iconSubscript - forumIconView.displayGameIcon(icon, iconSubscript) + forumIconView.displayGameIcon(icon, iconSubscript, entity.game?.iconFloat) forumContainer.setOnClickListener { DirectUtils.directForumDetail(forumContainer.context, entity.id, "帖子详情") LogUtils.uploadAccessToBbs(entity.id, "文章内所属论坛") diff --git a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerAdapter.kt index dbb94e3b46..8c5094ed7a 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerAdapter.kt @@ -72,7 +72,7 @@ class ChooseForumContainerAdapter( ) val icon = forumEntity.icon.ifEmpty { forumEntity.game.getIcon() } - holder.binding.forumIcon.displayGameIcon(icon, forumEntity.game.iconSubscript) + holder.binding.forumIcon.displayGameIcon(icon, forumEntity.game.iconSubscript, forumEntity.game.iconFloat) holder.binding.followTv.visibility = View.GONE holder.itemView.setOnClickListener { val tabType = if (type == ChooseForumContainerFragment.ChooseForumType.SEARCH.value) "论坛tab" else "" diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt index 40f0b92bbe..e2ad6ab5c2 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt @@ -160,7 +160,7 @@ class QuestionDetailContentViewHolder( val icon = if (!entity.icon.isNullOrEmpty()) entity.icon else entity.game?.getIcon() val iconSubscript = if (!entity.iconSubscript.isNullOrEmpty()) entity.iconSubscript else entity.game?.iconSubscript - forumIconView.displayGameIcon(icon, iconSubscript) + forumIconView.displayGameIcon(icon, iconSubscript, entity.game?.iconFloat) forumContainer.setOnClickListener { DirectUtils.directForumDetail(forumContainer.context, entity.id, "问题详情") LogUtils.uploadAccessToBbs(entity.id, "文章内所属论坛") diff --git a/app/src/main/java/com/gh/gamecenter/room/converter/IconFloatConverter.kt b/app/src/main/java/com/gh/gamecenter/room/converter/IconFloatConverter.kt new file mode 100644 index 0000000000..72f318240b --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/room/converter/IconFloatConverter.kt @@ -0,0 +1,18 @@ +package com.gh.gamecenter.room.converter + +import androidx.room.TypeConverter +import com.gh.gamecenter.common.entity.IconFloat +import com.gh.gamecenter.common.utils.toJson +import com.gh.gamecenter.common.utils.toObject + +class IconFloatConverter { + @TypeConverter + fun toIconFloatString(data: IconFloat?): String { + return data?.toJson() ?: "" + } + + @TypeConverter + fun toIconFloat(token: String?): IconFloat { + return token?.toObject() ?: IconFloat() + } +} diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt b/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt index 6f150c0a1e..7627f69404 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt @@ -214,7 +214,7 @@ class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: Attrib mBinding.gameIconView.displayGameIcon( videoEntity.game?.rawIcon - ?: videoEntity.gameIcon, videoEntity.game?.iconSubscript + ?: videoEntity.gameIcon, videoEntity.game?.iconSubscript, videoEntity.game?.iconFloat ) ImageUtils.display(mBinding.userIconIv, videoEntity.user.icon) if (videoEntity.user.border.isNotEmpty()) { diff --git a/app/src/main/java/com/gh/gamecenter/video/game/GameVideoActivity.kt b/app/src/main/java/com/gh/gamecenter/video/game/GameVideoActivity.kt index 5f58f8dd7c..8dbf886768 100644 --- a/app/src/main/java/com/gh/gamecenter/video/game/GameVideoActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/video/game/GameVideoActivity.kt @@ -74,7 +74,7 @@ class GameVideoActivity : ToolBarActivity() { if (it.status == Status.SUCCESS) { mBinding.gameIcon.displayGameIcon( it.data?.game?.getIcon() - ?: it.data?.gameIcon, it.data?.game?.iconSubscript + ?: it.data?.gameIcon, it.data?.game?.iconSubscript, it.data?.game?.iconFloat ) mBinding.gameName.text = it.data?.game?.name mBinding.likeCount.text = NumberUtils.transSimpleCount(it.data?.likeCount ?: 0) diff --git a/app/src/main/java/com/gh/vspace/HomeRecentVGameViewHolder.kt b/app/src/main/java/com/gh/vspace/HomeRecentVGameViewHolder.kt index bc1ff99f6c..ce112c3b92 100644 --- a/app/src/main/java/com/gh/vspace/HomeRecentVGameViewHolder.kt +++ b/app/src/main/java/com/gh/vspace/HomeRecentVGameViewHolder.kt @@ -10,6 +10,7 @@ import com.gh.download.DownloadManager import com.gh.gamecenter.R import com.gh.gamecenter.common.baselist.DiffUtilAdapter import com.gh.gamecenter.common.constant.Constants +import com.gh.gamecenter.common.entity.IconFloat import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.common.view.GridSpacingItemColorDecoration import com.gh.gamecenter.core.utils.ToastUtils @@ -115,9 +116,15 @@ class HomeRecentVGameAdapter(context: Context) : DiffUtilAdapter( fun bindView(entity: VGameItemData) { if (mBinding.gameIconIv.getTag(R.string.app_name) != entity.downloadEntity.packageName) { + val iconFloat = IconFloat( + entity.downloadEntity.getMetaExtra(Constants.GAME_ICON_FLOAT_TOP_TEXT), + entity.downloadEntity.getMetaExtra(Constants.GAME_ICON_FLOAT_TOP_COLOR), + entity.downloadEntity.getMetaExtra(Constants.GAME_ICON_FLOAT_BOTTOM_TEXT) + ) mBinding.gameIconIv.displayGameIcon( entity.downloadEntity.getMetaExtra(Constants.RAW_GAME_ICON), - entity.downloadEntity.getMetaExtra(Constants.GAME_ICON_SUBSCRIPT) + entity.downloadEntity.getMetaExtra(Constants.GAME_ICON_SUBSCRIPT), + iconFloat ) mBinding.gameIconIv.setTag(R.string.app_name, entity.downloadEntity.packageName) } diff --git a/app/src/main/java/com/gh/vspace/VHelper.kt b/app/src/main/java/com/gh/vspace/VHelper.kt index 5769fbbda5..bb4c40dc5c 100644 --- a/app/src/main/java/com/gh/vspace/VHelper.kt +++ b/app/src/main/java/com/gh/vspace/VHelper.kt @@ -774,6 +774,20 @@ object VHelper { updateEntity.iconSubscript ) originDownloadEntity.addMetaExtra(Constants.APK_MD5, updateEntity.md5) + if (updateEntity.iconFloat != null) { + originDownloadEntity.addMetaExtra( + Constants.GAME_ICON_FLOAT_TOP_TEXT, + updateEntity.iconFloat?.upperLeftText + ) + originDownloadEntity.addMetaExtra( + Constants.GAME_ICON_FLOAT_TOP_COLOR, + updateEntity.iconFloat?.upperLeftColor + ) + originDownloadEntity.addMetaExtra( + Constants.GAME_ICON_FLOAT_BOTTOM_TEXT, + updateEntity.iconFloat?.bottomText + ) + } PackageRepository.removeUpdate(updateEntity.id, true) } diff --git a/app/src/main/res/layout/catalog_subject_item.xml b/app/src/main/res/layout/catalog_subject_item.xml index 29c4d9af46..9511f2b432 100644 --- a/app/src/main/res/layout/catalog_subject_item.xml +++ b/app/src/main/res/layout/catalog_subject_item.xml @@ -2,4 +2,5 @@ + android:layout_height="wrap_content" + android:clipChildren="false" /> diff --git a/app/src/main/res/layout/dialog_installed_game.xml b/app/src/main/res/layout/dialog_installed_game.xml index 7e49ef1364..c985ffd7c8 100644 --- a/app/src/main/res/layout/dialog_installed_game.xml +++ b/app/src/main/res/layout/dialog_installed_game.xml @@ -22,7 +22,11 @@ android:id="@+id/dialog_installed_game_rv" android:layout_width="match_parent" android:layout_height="200dp" + android:layout_marginTop="-2dp" + android:clipChildren="false" + android:clipToPadding="false" android:paddingLeft="24dp" + android:paddingTop="2dp" android:paddingRight="24dp" /> diff --git a/app/src/main/res/layout/forum_record_item.xml b/app/src/main/res/layout/forum_record_item.xml index 9db72c1dc6..a9c6a16f27 100644 --- a/app/src/main/res/layout/forum_record_item.xml +++ b/app/src/main/res/layout/forum_record_item.xml @@ -8,15 +8,6 @@ android:gravity="center_horizontal" android:orientation="vertical"> - - + + android:overScrollMode="never" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toBottomOf="@+id/followTitle" /> + android:layout_height="wrap_content" + android:clipChildren="false"> + android:overScrollMode="never" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toBottomOf="@+id/hotTitle" /> diff --git a/app/src/main/res/layout/game_gallery_slide_item.xml b/app/src/main/res/layout/game_gallery_slide_item.xml index 77c9910cc5..fbf61d06f4 100644 --- a/app/src/main/res/layout/game_gallery_slide_item.xml +++ b/app/src/main/res/layout/game_gallery_slide_item.xml @@ -20,6 +20,8 @@ android:id="@+id/container" android:layout_width="match_parent" android:layout_height="wrap_content" + android:clipChildren="false" + android:clipToPadding="false" android:descendantFocusability="blocksDescendants" android:orientation="vertical" android:paddingTop="12dp" @@ -29,6 +31,7 @@ android:id="@+id/firstRecyclerView" android:layout_width="match_parent" android:layout_height="wrap_content" + android:clipChildren="false" android:clipToPadding="false" android:paddingLeft="12dp" /> @@ -37,6 +40,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="12dp" + android:clipChildren="false" android:clipToPadding="false" android:paddingLeft="26dp" /> @@ -45,6 +49,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="12dp" + android:clipChildren="false" android:clipToPadding="false" android:paddingLeft="8dp" /> diff --git a/app/src/main/res/layout/home_amway_list.xml b/app/src/main/res/layout/home_amway_list.xml index ab0fc8fda1..908a60295c 100644 --- a/app/src/main/res/layout/home_amway_list.xml +++ b/app/src/main/res/layout/home_amway_list.xml @@ -4,6 +4,7 @@ android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" + android:clipChildren="false" android:clipToPadding="false" android:descendantFocusability="blocksDescendants" android:paddingTop="12dp" diff --git a/app/src/main/res/layout/item_home_recent_vgame.xml b/app/src/main/res/layout/item_home_recent_vgame.xml index a3168f740b..1384abbaa6 100644 --- a/app/src/main/res/layout/item_home_recent_vgame.xml +++ b/app/src/main/res/layout/item_home_recent_vgame.xml @@ -64,9 +64,11 @@ diff --git a/app/src/main/res/layout/layout_float_load_complete.xml b/app/src/main/res/layout/layout_float_load_complete.xml index a492126422..907fa48891 100644 --- a/app/src/main/res/layout/layout_float_load_complete.xml +++ b/app/src/main/res/layout/layout_float_load_complete.xml @@ -21,7 +21,11 @@ android:id="@+id/viewPager" android:layout_width="0dp" android:layout_height="0dp" + android:layout_marginStart="-1dp" android:layout_marginEnd="12dp" + android:clipChildren="false" + android:clipToPadding="false" + android:paddingStart="1dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/launchTv" app:layout_constraintStart_toEndOf="@+id/closeIv" diff --git a/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java b/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java index 6bf962bc64..933b11316a 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java +++ b/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java @@ -57,6 +57,10 @@ public class Constants { public static final String RAW_GAME_ICON = "raw_game_icon"; public static final String GAME_ICON_SUBSCRIPT = "game_icon_subscript"; + public static final String GAME_ICON_FLOAT_TOP_TEXT = "game_icon_float_top"; + public static final String GAME_ICON_FLOAT_TOP_COLOR = "game_icon_float_top_color"; + public static final String GAME_ICON_FLOAT_BOTTOM_TEXT = "game_icon_float_bottom"; + public static final String IS_PLATFORM_RECOMMEND = "isPlatformRecommend"; public static final String APK_MD5 = "apk_md5"; diff --git a/module_common/src/main/java/com/gh/gamecenter/common/entity/CommunityEntity.kt b/module_common/src/main/java/com/gh/gamecenter/common/entity/CommunityEntity.kt index 0065b5e199..d53806baef 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/entity/CommunityEntity.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/entity/CommunityEntity.kt @@ -33,7 +33,9 @@ data class CommunityEntity( @SerializedName("ori_icon") var mRawIcon: String? = null, @SerializedName("icon_subscript") - var iconSubscript: String? = null + var iconSubscript: String? = null, + @SerializedName("icon_float") + var iconFloat: IconFloat? = null ) : Parcelable { @IgnoredOnParcel diff --git a/module_common/src/main/java/com/gh/gamecenter/common/entity/IconFloat.kt b/module_common/src/main/java/com/gh/gamecenter/common/entity/IconFloat.kt new file mode 100644 index 0000000000..9f7c29fd5c --- /dev/null +++ b/module_common/src/main/java/com/gh/gamecenter/common/entity/IconFloat.kt @@ -0,0 +1,15 @@ +package com.gh.gamecenter.common.entity + +import android.os.Parcelable +import com.google.gson.annotations.SerializedName +import kotlinx.parcelize.Parcelize + +@Parcelize +data class IconFloat( + @SerializedName("upper_left_text") + var upperLeftText: String = "", + @SerializedName("upper_left_color") + var upperLeftColor: String = "", + @SerializedName("bottom_text") + var bottomText: String = "" +) : Parcelable \ No newline at end of file diff --git a/module_common/src/main/res/drawable-xxxhdpi/label_bottom.webp b/module_common/src/main/res/drawable-xxxhdpi/label_bottom.webp new file mode 100644 index 0000000000..8178e526f5 Binary files /dev/null and b/module_common/src/main/res/drawable-xxxhdpi/label_bottom.webp differ diff --git a/module_common/src/main/res/drawable-xxxhdpi/label_upperleft_blue.9.png b/module_common/src/main/res/drawable-xxxhdpi/label_upperleft_blue.9.png new file mode 100644 index 0000000000..1fd0bc524d Binary files /dev/null and b/module_common/src/main/res/drawable-xxxhdpi/label_upperleft_blue.9.png differ diff --git a/module_common/src/main/res/drawable-xxxhdpi/label_upperleft_red.9.png b/module_common/src/main/res/drawable-xxxhdpi/label_upperleft_red.9.png new file mode 100644 index 0000000000..96ce783c84 Binary files /dev/null and b/module_common/src/main/res/drawable-xxxhdpi/label_upperleft_red.9.png differ diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/GameEntity.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/GameEntity.kt index 3a6cfed4a1..e8530523e1 100644 --- a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/GameEntity.kt +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/GameEntity.kt @@ -7,6 +7,7 @@ import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.constant.RouteConsts import com.gh.gamecenter.common.entity.CommunityEntity import com.gh.gamecenter.common.entity.Display +import com.gh.gamecenter.common.entity.IconFloat import com.gh.gamecenter.common.entity.LinkEntity import com.gh.gamecenter.core.provider.* import com.gh.gamecenter.feature.HaloApp @@ -296,6 +297,9 @@ data class GameEntity( @SerializedName("recommend_tag") var recommendTag: String = "", + @SerializedName("icon_float") + var iconFloat: IconFloat? = null,//图标浮层 + // 专题id,用于曝光使用 var subjectId: String? = null, // 专题名字,用于曝光使用 @@ -930,6 +934,8 @@ class SimpleGame( var subtitleStyle: TagStyleEntity? = null, @SerializedName("advance_download") var advanceDownload: Boolean = false, + @SerializedName("icon_float") + var iconFloat: IconFloat? = null ) : Parcelable { @IgnoredOnParcel @@ -958,6 +964,7 @@ class SimpleGame( gameEntity.subtitle = subtitle ?: "" gameEntity.subtitleStyle = subtitleStyle gameEntity.advanceDownload = advanceDownload + gameEntity.iconFloat = iconFloat return gameEntity } @@ -967,6 +974,7 @@ class SimpleGame( gameEntity.mIcon = mIcon gameEntity.mRawIcon = mRawIcon gameEntity.iconSubscript = iconSubscript + gameEntity.iconFloat = iconFloat return gameEntity } } diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/view/GameIconUi.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/view/GameIconUi.kt index bf5b14c483..904d7ef8a2 100644 --- a/module_core_feature/src/main/java/com/gh/gamecenter/feature/view/GameIconUi.kt +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/view/GameIconUi.kt @@ -1,27 +1,37 @@ package com.gh.gamecenter.feature.view import android.content.Context +import android.graphics.Color +import android.graphics.Typeface import android.util.AttributeSet +import android.view.Gravity import android.view.View +import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout +import androidx.constraintlayout.widget.ConstraintSet import androidx.core.content.ContextCompat import com.facebook.drawee.drawable.ScalingUtils import com.facebook.drawee.view.SimpleDraweeView import com.gh.gamecenter.common.R +import splitties.views.assignAndGetGeneratedId import splitties.views.dsl.constraintlayout.* -import splitties.views.dsl.core.Ui -import splitties.views.dsl.core.add +import splitties.views.dsl.core.* import splitties.views.dsl.idepreview.UiPreView +import splitties.views.existingOrNewId class GameIconUi(override val ctx: Context) : Ui { val gameIconIv: SimpleDraweeView val gameIconDecorationIv: SimpleDraweeView val borderView: View + val bottomLabelTv: TextView override val root: ConstraintLayout = constraintLayout { gameIconIv = getIv(ctx) gameIconDecorationIv = getIv(ctx) - borderView = View(ctx) + borderView = View(ctx).apply { + assignAndGetGeneratedId() + } + bottomLabelTv = initBottomLabelTv() add(gameIconIv, lParams(0, 0) { startOfParent() topOfParent() @@ -40,10 +50,31 @@ class GameIconUi(override val ctx: Context) : Ui { endToEndOf(gameIconIv) bottomToBottomOf(gameIconIv) }) + add(bottomLabelTv, lParams(0, 0) { + startOfParent() + endOfParent() + bottomOfParent() + }) + ConstraintSet().also { + it.clone(this) + it.setDimensionRatio(bottomLabelTv.existingOrNewId, "h,1000:275") + }.applyTo(this) + } + + private fun initBottomLabelTv() = textView { + assignAndGetGeneratedId() + setBackgroundResource(R.drawable.label_bottom) + setTextColor(Color.WHITE) + isSingleLine = true + typeface = Typeface.DEFAULT_BOLD + textSize = 10F + gravity = Gravity.BOTTOM.xor(Gravity.CENTER_HORIZONTAL) + visibility = View.GONE } private fun getIv(context: Context): SimpleDraweeView { return SimpleDraweeView(context).apply { + assignAndGetGeneratedId() hierarchy.setPlaceholderImage( ContextCompat.getDrawable(context, R.drawable.occupy), ScalingUtils.ScaleType.FIT_XY diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/view/GameIconView.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/view/GameIconView.kt index b9cbace81e..45ce6d83f3 100644 --- a/module_core_feature/src/main/java/com/gh/gamecenter/feature/view/GameIconView.kt +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/view/GameIconView.kt @@ -2,23 +2,31 @@ package com.gh.gamecenter.feature.view import android.content.Context import android.graphics.Color +import android.graphics.Typeface import android.graphics.drawable.GradientDrawable import android.text.TextUtils import android.util.AttributeSet import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.TextView import androidx.annotation.ColorRes +import androidx.recyclerview.widget.RecyclerView +import androidx.viewpager.widget.ViewPager +import androidx.viewpager2.widget.ViewPager2 import com.facebook.drawee.generic.RoundingParams import com.facebook.drawee.view.SimpleDraweeView +import com.gh.gamecenter.common.entity.IconFloat import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.common.view.RadiusCardView import com.gh.gamecenter.core.utils.DisplayUtils import com.gh.gamecenter.feature.R import com.gh.gamecenter.feature.entity.GameEntity -import splitties.views.dsl.core.add -import splitties.views.dsl.core.lParams -import splitties.views.dsl.core.matchParent +import splitties.dimensions.dip +import splitties.views.dsl.core.* +import kotlin.math.abs -class GameIconView : RadiusCardView { +class GameIconView : FrameLayout { private var mCornerRadius = 0 private var mBorderColor = 0 @@ -26,9 +34,13 @@ class GameIconView : RadiusCardView { private var mBorderWidth = 1 private var mFadeDuration = -1 + private var mGameIconCv: RadiusCardView? = null private var mGameIconIv: SimpleDraweeView? = null private var mGameIconDecorationIv: SimpleDraweeView? = null private var mBorderView: View? = null + private var mTopLabelContainer: FrameLayout? = null + private var mTopLabelTv: TextView? = null + private var mBottomLabelTv: TextView? = null private var mIsRemoveCrevice = false constructor(context: Context) : super(context, null) { @@ -49,6 +61,7 @@ class GameIconView : RadiusCardView { fun initView(attrs: AttributeSet?) { val gameIconUi = GameIconUi(context) + mGameIconCv = RadiusCardView(context) if (attrs != null && !isInEditMode) { val ta = context.obtainStyledAttributes(attrs, R.styleable.GameIconView) @@ -64,15 +77,32 @@ class GameIconView : RadiusCardView { ta.recycle() } - add(gameIconUi.root, lParams(matchParent, matchParent) { }) + mGameIconCv?.add(gameIconUi.root, lParams(matchParent, matchParent) { }) + add(mGameIconCv!!, lParams(matchParent, matchParent) { }) mGameIconIv = gameIconUi.gameIconIv mGameIconDecorationIv = gameIconUi.gameIconDecorationIv mBorderView = gameIconUi.borderView + mBottomLabelTv = gameIconUi.bottomLabelTv mGameIconIv?.dimOnDarkMode() mGameIconDecorationIv?.dimOnDarkMode() + mTopLabelTv = textView { + setBackgroundResource(R.drawable.label_upperleft_blue) + setPadding(dip(6), dip(2), dip(6), 0) + setTextColor(Color.WHITE) + isSingleLine = true + typeface = Typeface.DEFAULT_BOLD + textSize = 10F + } + mTopLabelContainer = FrameLayout(context).apply { + visibility = View.GONE + add(mTopLabelTv!!, lParams(wrapContent, dip(24)) { }) + } + + add(mTopLabelContainer!!, lParams(DisplayUtils.getScreenWidth(), wrapContent) { }) + if (mFadeDuration != -1) { mGameIconIv?.hierarchy?.fadeDuration = mFadeDuration } @@ -81,23 +111,45 @@ class GameIconView : RadiusCardView { fun displayGameIcon(game: GameEntity) { if (!TextUtils.isEmpty(game.rawIcon)) { - displayGameIcon(game.rawIcon ?: "", game.iconSubscript) + displayGameIcon(game.rawIcon ?: "", game.iconSubscript, game.iconFloat) } else { - displayGameIcon(game.icon ?: "", null) + displayGameIcon(game.icon ?: "", null, game.iconFloat) } } - fun displayGameIcon(icon: String?, iconSubscript: String?) { - displayGameIcon(icon, iconSubscript, false) + fun displayGameIcon(icon: String?, iconSubscript: String?, iconFloat: IconFloat? = null) { + displayGameIcon(icon, iconSubscript, false, iconFloat) } - fun displayGameIcon(icon: String?, iconSubscript: String?, goneIfEmpty: Boolean = false) { + fun displayGameIcon( + icon: String?, + iconSubscript: String?, + goneIfEmpty: Boolean = false, + iconFloat: IconFloat? = null + ) { if (getTag(ImageUtils.TAG_TARGET_WIDTH) == null) { setTag(ImageUtils.TAG_TARGET_WIDTH, layoutParams.width) } mGameIconIv?.display(icon) - mGameIconDecorationIv?.display(iconSubscript, true) + if (iconFloat == null || (iconFloat.upperLeftText.isEmpty() && iconFloat.bottomText.isEmpty())) { + mGameIconDecorationIv?.visibility = View.VISIBLE + mTopLabelContainer?.visibility = View.GONE + mBottomLabelTv?.visibility = View.GONE + mGameIconDecorationIv?.display(iconSubscript, true) + } else { + mGameIconDecorationIv?.visibility = View.GONE + if (iconFloat.upperLeftText.isNotEmpty() && iconFloat.upperLeftColor.isNotEmpty()) { + mTopLabelContainer?.visibility = View.VISIBLE + mTopLabelTv?.text = iconFloat.upperLeftText + mTopLabelTv?.setBackgroundResource(if (iconFloat.upperLeftColor == "blue") R.drawable.label_upperleft_blue else R.drawable.label_upperleft_red) + mTopLabelTv?.setPadding(dip(6), dip(2), dip(6), 0) + } + if (iconFloat.bottomText.isNotEmpty()) { + mBottomLabelTv?.visibility = View.VISIBLE + mBottomLabelTv?.text = iconFloat.bottomText + } + } if (goneIfEmpty) { visibility = if (TextUtils.isEmpty(icon)) View.GONE else View.VISIBLE } @@ -116,6 +168,49 @@ class GameIconView : RadiusCardView { override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { super.onSizeChanged(w, h, oldw, oldh) setBorder(w) + setIconFloat(w) + } + + private fun setIconFloat(width: Int) { + val ratio = width / SIZE_80.toFloat() + val topLabelMarginLeft = dip(-2) * ratio + val topLabelMarginTop = dip(-2) * ratio + val bottomLabelPaddingBottom = (dip(4) * ratio).toInt() + val offsetX = abs(topLabelMarginLeft) + val offsetY = abs(topLabelMarginTop) + + mTopLabelTv?.run { + pivotX = 0F + pivotY = 0F + scaleX = ratio + scaleY = ratio + } + mTopLabelContainer?.run { + layoutParams = (layoutParams as MarginLayoutParams).apply { + setMargins(topLabelMarginLeft.toInt(), topLabelMarginTop.toInt(), 0, 0) + } + } + mBottomLabelTv?.run { + textSize = ratio * 10F + setPadding(0, 0, 0, bottomLabelPaddingBottom) + } + setParentClip(this, offsetX, offsetY) + } + + private fun setParentClip(view: View, offsetX: Float, offsetY: Float) { + val viewParent = view.parent + if (viewParent != null && viewParent is ViewGroup) { + viewParent.clipChildren = false + if (viewParent.paddingLeft != 0 || viewParent.paddingTop != 0) { + viewParent.clipToPadding = false + } + if (view.x < offsetX || view.y < offsetY) { + val parentOffsetX = if (view.x < offsetX) offsetX - view.x else 0F + val parentOffsetY = if (view.y < offsetY) offsetY - view.y else 0F + if (viewParent.parent is RecyclerView || viewParent.parent is ViewPager || viewParent.parent is ViewPager2) return + setParentClip(viewParent, parentOffsetX, parentOffsetY) + } + } } private fun setBorder(width: Int) { @@ -125,8 +220,8 @@ class GameIconView : RadiusCardView { 0F } - setRadiusPx(cornerRadius, cornerRadius, cornerRadius, cornerRadius) - cardElevation = 0F + mGameIconCv?.setRadiusPx(cornerRadius, cornerRadius, cornerRadius, cornerRadius) + mGameIconCv?.cardElevation = 0F // 一些设备(没错,又是 vivo),代码设置 CardView 的 radius 无效(xml 设置有效) // 被迫再设置一次 SimpleDraweeView 的 radius :(