Compare commits
35 Commits
fix/GHZSCY
...
feat/dsp-o
| Author | SHA1 | Date | |
|---|---|---|---|
| cfde1e1e62 | |||
| 0f382baec1 | |||
| 62f80bbfdd | |||
| 63be9ac221 | |||
| ade32ef92d | |||
| 58702b46aa | |||
| e6d6fc5309 | |||
| 1460348582 | |||
| c49b3c5efe | |||
| 4f7c468cde | |||
| df93bdda2e | |||
| 086796915b | |||
| f99e5f403d | |||
| 9785f4fa13 | |||
| 6cdff338ed | |||
| 761093a768 | |||
| e5a0db4513 | |||
| a3df62bba8 | |||
| ee773f7e31 | |||
| 227a5e677f | |||
| c41939cd79 | |||
| 125ef60176 | |||
| e2bf2773e4 | |||
| e3596c758e | |||
| 75ca0a8379 | |||
| ef7d2860e5 | |||
| bfc8981253 | |||
| 12d6d338aa | |||
| 4da3c3aec1 | |||
| e608a51cce | |||
| fd5a3104c4 | |||
| 486dd57a24 | |||
| 058b51f050 | |||
| 149a49fdd8 | |||
| 4314797166 |
@ -72,7 +72,6 @@ android_build:
|
||||
only:
|
||||
- dev
|
||||
- release
|
||||
- fix/GHZSCY-8001
|
||||
|
||||
# 代码检查
|
||||
sonarqube_analysis:
|
||||
@ -104,7 +103,6 @@ sonarqube_analysis:
|
||||
only:
|
||||
- dev
|
||||
- release
|
||||
- fix/GHZSCY-8001
|
||||
|
||||
## 发送简易检测结果报告
|
||||
send_sonar_report:
|
||||
@ -123,7 +121,6 @@ send_sonar_report:
|
||||
only:
|
||||
- dev
|
||||
- release
|
||||
- fix/GHZSCY-8001
|
||||
|
||||
oss-upload&send-email:
|
||||
tags:
|
||||
@ -160,5 +157,4 @@ oss-upload&send-email:
|
||||
only:
|
||||
- dev
|
||||
- release
|
||||
- fix/GHZSCY-8001
|
||||
|
||||
|
||||
@ -5,6 +5,7 @@ import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.graphics.drawable.Animatable
|
||||
import android.os.Build
|
||||
import android.os.Message
|
||||
import android.text.TextUtils
|
||||
import android.view.View
|
||||
@ -43,6 +44,7 @@ import com.gh.gamecenter.feature.exposure.ExposureType
|
||||
import com.gh.gamecenter.retrofit.RetrofitManager
|
||||
import com.halo.assistant.HaloApp
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
import java.util.Locale
|
||||
|
||||
/**
|
||||
* 广告实现代理类
|
||||
@ -120,7 +122,12 @@ object AdDelegateHelper {
|
||||
if (isFromRetry && mAdConfigList.isNotEmpty()) {
|
||||
return
|
||||
}
|
||||
val paramsMap = if (keyword.isNotEmpty()) mapOf("keyword" to keyword) else mapOf()
|
||||
|
||||
val paramsMap = if (keyword.isNotEmpty()) {
|
||||
mapOf("keyword" to keyword, "android_sdk_version" to Build.VERSION.SDK_INT)
|
||||
} else {
|
||||
mapOf("android_sdk_version" to Build.VERSION.SDK_INT)
|
||||
}
|
||||
RetrofitManager.getInstance()
|
||||
.newApi
|
||||
.getAdConfig(paramsMap)
|
||||
@ -182,11 +189,16 @@ object AdDelegateHelper {
|
||||
// HarmonyOS 2.2.0 版本不展示第三方开屏广告 (因为会引起奇怪的闪退)
|
||||
if (MetaUtil.getRom().name == "HarmonyOS"
|
||||
&& MetaUtil.getRom().versionName == "2.2.0"
|
||||
&& config.displayRule.adSource == "third_party_ads") {
|
||||
&& config.displayRule.adSource == AD_TYPE_SDK) {
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// 华为系 Android 10 不展示第三方开屏广告 (因为会引起奇怪的闪退)
|
||||
if (isBuggyHuaweiDevice() && config.displayRule.adSource == AD_TYPE_SDK) {
|
||||
return
|
||||
}
|
||||
|
||||
mSplashAd = config
|
||||
}
|
||||
|
||||
@ -215,6 +227,7 @@ object AdDelegateHelper {
|
||||
private fun shouldShowStartUpAdWhenHotLaunch() = (mCsjAdImpl != null)
|
||||
&& mSplashAd?.displayRule?.hotStartSplashAd?.type == AD_TYPE_SDK
|
||||
&& mSplashAd?.hotStartThirdPartyAd != null
|
||||
&& !isBuggyHuaweiDevice()
|
||||
|
||||
/**
|
||||
* 是否需要显示下载管理广告
|
||||
@ -783,4 +796,16 @@ object AdDelegateHelper {
|
||||
mCsjAdImpl?.cancelSplashAd(context)
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否为有问题的华为系 Android 10 设备
|
||||
*/
|
||||
private fun isBuggyHuaweiDevice(): Boolean {
|
||||
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) {
|
||||
val manufacturer = Build.MANUFACTURER.lowercase(Locale.CHINA) ?: ""
|
||||
return manufacturer == "huawei" || manufacturer == "honor"
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -20,6 +20,7 @@ import com.gh.gamecenter.common.utils.setDrawableEnd
|
||||
import com.gh.gamecenter.common.utils.toColor
|
||||
import com.gh.gamecenter.entity.SubjectSettingEntity
|
||||
import com.google.android.flexbox.FlexboxLayout
|
||||
import splitties.views.leftPadding
|
||||
|
||||
class ConfigFilterView @JvmOverloads constructor(
|
||||
context: Context,
|
||||
@ -213,6 +214,10 @@ class ConfigFilterView @JvmOverloads constructor(
|
||||
fun initSubjectFilterView(subjectSetting: SubjectSettingEntity) {
|
||||
ratingTv.visibility = View.VISIBLE
|
||||
|
||||
if (subjectSetting.typeEntity.layout == "hide") {
|
||||
container.leftPadding = 8F.dip2px()
|
||||
}
|
||||
|
||||
if (subjectSetting.filterOptions.size > 1) {
|
||||
// 重排序
|
||||
subjectSetting.filterOptions.forEachIndexed { index, s ->
|
||||
|
||||
@ -135,7 +135,7 @@ class DetailViewHolder(
|
||||
vUpdate = view.findViewById(R.id.v_update)
|
||||
tvUpdate = view.findViewById(R.id.tv_update)
|
||||
|
||||
context = view.context
|
||||
context = view.context.getActivity() ?: view.context
|
||||
com.gh.gamecenter.common.R.color.text_aw_primary.toColor()
|
||||
|
||||
var gameDownloadMode = gameEntity.getGameDownloadButtonMode()
|
||||
|
||||
@ -122,7 +122,9 @@ data class SubjectEntity(
|
||||
@SerializedName("column_type")
|
||||
private val _columnType: String? = null,
|
||||
@SerializedName("size")
|
||||
private val _size: Size? = null
|
||||
private val _size: Size? = null,
|
||||
@SerializedName("onlyFee")
|
||||
private val _onlyFee: Boolean? = false,
|
||||
) : Parcelable {
|
||||
|
||||
@IgnoredOnParcel
|
||||
@ -161,6 +163,9 @@ data class SubjectEntity(
|
||||
val size: Size
|
||||
get() = _size ?: Size()
|
||||
|
||||
val onlyFee: Boolean
|
||||
get() = _onlyFee ?: false
|
||||
|
||||
var isDspSubject: Boolean = false
|
||||
|
||||
companion object {
|
||||
@ -173,9 +178,13 @@ data class SubjectEntity(
|
||||
@Parcelize
|
||||
data class Size(
|
||||
@SerializedName("index")
|
||||
private val _index: Int? = null
|
||||
private val _index: Int? = null,
|
||||
@SerializedName("limit")
|
||||
private val _limit: Int? = null,
|
||||
) : Parcelable {
|
||||
val index: Int
|
||||
get() = _index ?: 0
|
||||
val limit: Int
|
||||
get() = _limit ?: -1
|
||||
}
|
||||
}
|
||||
@ -14,6 +14,7 @@ import android.widget.ImageView
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.appcompat.view.menu.ActionMenuItemView
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import androidx.core.view.doOnNextLayout
|
||||
import androidx.core.view.isVisible
|
||||
@ -96,6 +97,7 @@ import io.reactivex.disposables.Disposable
|
||||
import org.greenrobot.eventbus.Subscribe
|
||||
import org.greenrobot.eventbus.ThreadMode
|
||||
import retrofit2.HttpException
|
||||
import splitties.views.horizontalPadding
|
||||
import java.util.*
|
||||
|
||||
class GameDetailWrapperFragment : BaseLazyFragment(), IScrollable {
|
||||
@ -286,7 +288,7 @@ class GameDetailWrapperFragment : BaseLazyFragment(), IScrollable {
|
||||
initSkeleton()
|
||||
|
||||
binding.reuseNoneData.reuseNoneDataTv.text = "页面不见了"
|
||||
bodyBinding.tabIndicator.setIndicatorWidth(12)
|
||||
bodyBinding.tabIndicator.setIndicatorWidth(16)
|
||||
bodyBinding.viewPager.offscreenPageLimit = 4
|
||||
binding.expandSpecialDownloadIv.enlargeTouchArea()
|
||||
|
||||
@ -357,8 +359,14 @@ class GameDetailWrapperFragment : BaseLazyFragment(), IScrollable {
|
||||
}
|
||||
backBtn.setOnClickListener { requireActivity().finish() }
|
||||
moreMenuItem = actionMenuView.menu.findItem(R.id.menu_more)
|
||||
downloadMenuItem = actionMenuView.menu.findItem(R.id.menu_download)
|
||||
downloadMenuItem = actionMenuView.menu.findItem(R.id.menu_download)?.apply {
|
||||
actionView?.updateLayoutParams<LayoutParams> { width = 40F.dip2px() }
|
||||
}
|
||||
downloadMenuItem?.isVisible = Config.isShow()
|
||||
actionMenuView.findViewById<ActionMenuItemView>(R.id.menu_more)?.run {
|
||||
updateLayoutParams<LayoutParams> { width = 40F.dip2px() }
|
||||
horizontalPadding = 8F.dip2px()
|
||||
}
|
||||
}
|
||||
|
||||
downloadMenuIcon = downloadMenuItem?.actionView?.findViewById(R.id.menu_download_iv)
|
||||
@ -910,7 +918,7 @@ class GameDetailWrapperFragment : BaseLazyFragment(), IScrollable {
|
||||
tab.customView = tabItemBinding.root
|
||||
updateTabStyle(tab, i == bodyBinding.viewPager.currentItem)
|
||||
tab.view.clipChildren = false
|
||||
tab.view.setPadding(0, 0, 0, 0)
|
||||
tab.view.setPadding(0, 0, if (i == tabEntityList.size - 1) 8F.dip2px() else 0, 0)
|
||||
tab.view.setOnTouchListener { _, event ->
|
||||
if (event.action == MotionEvent.ACTION_DOWN) {
|
||||
handleTabTouchEvent(tabEntity?.name ?: "")
|
||||
@ -937,7 +945,7 @@ class GameDetailWrapperFragment : BaseLazyFragment(), IScrollable {
|
||||
tab.customView?.findViewById<TextView>(R.id.tab_title)
|
||||
?.setTypeface(if (isChecked) Typeface.DEFAULT_BOLD else Typeface.DEFAULT)
|
||||
tab.customView?.findViewById<TextView>(R.id.tab_title)?.setTextColor(
|
||||
if (isChecked) com.gh.gamecenter.common.R.color.text_primary.toColor(requireContext()) else com.gh.gamecenter.common.R.color.text_tertiary.toColor(
|
||||
if (isChecked) com.gh.gamecenter.common.R.color.text_primary.toColor(requireContext()) else com.gh.gamecenter.common.R.color.text_secondary.toColor(
|
||||
requireContext()
|
||||
)
|
||||
)
|
||||
|
||||
@ -922,8 +922,10 @@ class GameDetailFragment : LazyFragment(), IScrollable {
|
||||
}
|
||||
|
||||
override fun scrollToTop() {
|
||||
binding.gamedetailAppbar.setExpanded(true)
|
||||
binding.detailRv.scrollToPosition(0)
|
||||
if (::binding.isInitialized) {
|
||||
binding.gamedetailAppbar.setExpanded(true)
|
||||
binding.detailRv.scrollToPosition(0)
|
||||
}
|
||||
}
|
||||
|
||||
// 登录事件/礼包状态变更事件
|
||||
|
||||
@ -246,10 +246,9 @@ class CustomPageFragment : LazyFragment(), ISmartRefreshContent, IScrollable, IB
|
||||
setNavigationTitle(it.title)
|
||||
})
|
||||
|
||||
dataList.observe(viewLifecycleOwner) {
|
||||
adapter.submitList(it) {
|
||||
dataList.observe(viewLifecycleOwner) { (shouldScrollToTop, data) ->
|
||||
adapter.submitList(data) {
|
||||
if (shouldScrollToTop) {
|
||||
shouldScrollToTop = false
|
||||
binding.gameList.scrollToPosition(0)
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -29,7 +29,7 @@ interface OnCustomPageEventListener {
|
||||
/**
|
||||
* 换一批
|
||||
*/
|
||||
fun onChangeABatch(subjectEntity: SubjectEntity)
|
||||
fun onChangeABatch(componentId: String, subjectEntity: SubjectEntity)
|
||||
|
||||
fun onChangeAppBarColor(color: Int)
|
||||
|
||||
@ -56,7 +56,10 @@ interface OnCustomPageEventListener {
|
||||
/**
|
||||
* 点击进入专题详情
|
||||
*/
|
||||
fun navigateSubjectDetailPage(item: CustomSubjectCollectionItem, subject: CustomPageData.LinkColumnCollection.CustomSubjectEntity)
|
||||
fun navigateSubjectDetailPage(
|
||||
item: CustomSubjectCollectionItem,
|
||||
subject: CustomPageData.LinkColumnCollection.CustomSubjectEntity
|
||||
)
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@ -35,9 +35,11 @@ class SubjectEventHelper(viewModel: CustomPageViewModel) : CustomPageItemChildEv
|
||||
gameEntity.tempDspLogMap = map.toMap() // Return an immutable copy
|
||||
}
|
||||
}
|
||||
|
||||
gameEntity.isMiniGame() -> {
|
||||
tracker.trackMiniGameClick(_item, gameEntity)
|
||||
}
|
||||
|
||||
else -> {
|
||||
tracker.trackColumnClick(_item, gameEntity, "游戏")
|
||||
}
|
||||
@ -51,9 +53,11 @@ class SubjectEventHelper(viewModel: CustomPageViewModel) : CustomPageItemChildEv
|
||||
gameEntity.isDspGame -> {
|
||||
tracker.trackDspGameClick(_item, gameEntity, "按钮", "自定义页面")
|
||||
}
|
||||
|
||||
gameEntity.isMiniGame() -> {
|
||||
tracker.trackMiniGameClick(_item, gameEntity)
|
||||
}
|
||||
|
||||
else -> {
|
||||
tracker.trackColumnClick(_item, gameEntity, "按钮")
|
||||
}
|
||||
@ -67,9 +71,9 @@ class SubjectEventHelper(viewModel: CustomPageViewModel) : CustomPageItemChildEv
|
||||
}
|
||||
}
|
||||
|
||||
fun onChangeABatch(subject: SubjectEntity) {
|
||||
fun onChangeABatch(componentId: String, subject: SubjectEntity) {
|
||||
tracker.trackColumnClick(_item, null, "右上角", "换一批")
|
||||
viewModel.onChangeABatch(subject)
|
||||
viewModel.onChangeABatch(componentId,subject)
|
||||
}
|
||||
|
||||
fun onMoreClick(link: LinkEntity) {
|
||||
|
||||
@ -0,0 +1,185 @@
|
||||
package com.gh.gamecenter.home.custom.model
|
||||
|
||||
import com.gh.gamecenter.common.entity.LinkEntity
|
||||
import com.gh.gamecenter.common.entity.PKEntity
|
||||
import com.gh.gamecenter.entity.AmwayCommentEntity
|
||||
import com.gh.gamecenter.entity.DiscoveryCardEntity
|
||||
import com.gh.gamecenter.entity.HomeItemTestV2Entity
|
||||
import com.gh.gamecenter.entity.SubjectEntity
|
||||
import com.gh.gamecenter.feature.entity.AcctRecord
|
||||
import com.gh.gamecenter.feature.entity.GameEntity
|
||||
import com.gh.gamecenter.home.custom.model.CustomPageItem.Companion.CUSTOM_LINK_TYPE_COLUMN_COLLECTION
|
||||
import com.gh.vspace.VGameItemData
|
||||
|
||||
/**
|
||||
* 接口返回的原始数据模型,最终需要转化成 CustomPageItem 在ui层呈现
|
||||
*/
|
||||
sealed class CustomItemDTO(
|
||||
val componentId: String, // 当前组件的唯一标识,用于后续更新单个数据时,快速找到目标数据
|
||||
val link: LinkEntity
|
||||
)
|
||||
|
||||
// 游戏专题:展开大图样式专用
|
||||
class GameItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
val data: GameEntity,
|
||||
val linkColumn: SubjectEntity?,
|
||||
) : CustomItemDTO(_componentId, _link)
|
||||
|
||||
//游戏专题
|
||||
data class SubjectItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
var data: SubjectEntity
|
||||
) : CustomItemDTO(_componentId, _link) {
|
||||
|
||||
val scrollState = ScrollState()
|
||||
}
|
||||
|
||||
// 专题合集/游戏单合集
|
||||
class CollectionItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
val data: CustomPageData.LinkColumnCollection
|
||||
) : CustomItemDTO(_componentId, _link) {
|
||||
|
||||
val isSubjectCollection: Boolean // 是否是专题合集(还有可能是游戏单合集)
|
||||
get() = link.type == CUSTOM_LINK_TYPE_COLUMN_COLLECTION
|
||||
|
||||
var showPage: Int = 0
|
||||
var loadPage: Int = 1
|
||||
var isLoadedEnd: Boolean = false
|
||||
|
||||
val uiState = UIState()
|
||||
|
||||
/**
|
||||
* 保存ui层状态
|
||||
*/
|
||||
data class UIState(
|
||||
var isBackToStart: Boolean = false
|
||||
)
|
||||
}
|
||||
|
||||
// 最近在玩
|
||||
data class RecentGamesItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
var data: List<VGameItemData>
|
||||
) : CustomItemDTO(_componentId, _link)
|
||||
|
||||
// 微信小游戏-最近在玩
|
||||
data class RecentWechatMiniGamesItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
var data: List<GameEntity>
|
||||
) : CustomItemDTO(_componentId, _link)
|
||||
|
||||
// qq小游戏-最近在玩
|
||||
data class RecentQqMiniGamesItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
var data: List<GameEntity>,
|
||||
val linkQqGameRecentlyPlayed: CustomPageData.LinkRecentlyPlayed
|
||||
) : CustomItemDTO(_componentId, _link)
|
||||
|
||||
// 加速游戏最近在玩
|
||||
data class RecentAcceleratorGamesItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
var data: List<AcctRecord>,
|
||||
val moreLink: LinkEntity?
|
||||
) : CustomItemDTO(_componentId, _link)
|
||||
|
||||
// qq小游戏专题
|
||||
data class QqMiniGamesItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
val data: SubjectEntity
|
||||
) : CustomItemDTO(_componentId, _link) {
|
||||
|
||||
val scrollState = ScrollState()
|
||||
}
|
||||
|
||||
// 微信小游戏专题
|
||||
data class WechatMiniGamesItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
val data: SubjectEntity
|
||||
) : CustomItemDTO(_componentId, _link) {
|
||||
|
||||
val scrollState = ScrollState()
|
||||
}
|
||||
|
||||
// 微信小游戏CPM专题组件
|
||||
data class WeChatMiniGamesCPMSubjectItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
var data: SubjectEntity
|
||||
) : CustomItemDTO(_componentId, _link){
|
||||
|
||||
val scrollState = ScrollState()
|
||||
}
|
||||
|
||||
// DSP专题组件
|
||||
data class DSPItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
var data: SubjectEntity
|
||||
) : CustomItemDTO(_componentId, _link){
|
||||
|
||||
val scrollState = ScrollState()
|
||||
}
|
||||
|
||||
// 插件化区域
|
||||
data class PluginItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
var data: List<GameEntity>
|
||||
) : CustomItemDTO(_componentId, _link)
|
||||
|
||||
// 新游开测
|
||||
data class GameTestV2ItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
val data: HomeItemTestV2Entity
|
||||
) : CustomItemDTO(_componentId, _link)
|
||||
|
||||
// 光环推荐
|
||||
data class DiscoverCardItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
var data: DiscoveryCardEntity?
|
||||
) : CustomItemDTO(_componentId, _link)
|
||||
|
||||
// 安利墙
|
||||
data class AmwayItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
val data: List<AmwayCommentEntity>
|
||||
) : CustomItemDTO(_componentId, _link)
|
||||
|
||||
// 内容卡片
|
||||
data class ContentCardItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
val data: CustomPageData.ContentCard
|
||||
) : CustomItemDTO(_componentId, _link)
|
||||
|
||||
// 通用内容合集
|
||||
data class CommonContentCollectionItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
val data: CustomPageData.CommonContentCollection
|
||||
) : CustomItemDTO(_componentId, _link)
|
||||
|
||||
// PK
|
||||
data class PKItemDTO(
|
||||
private val _componentId: String,
|
||||
private val _link: LinkEntity,
|
||||
var data: PKEntity?
|
||||
) : CustomItemDTO(_componentId, _link)
|
||||
|
||||
class ScrollState(
|
||||
var scrolledOffset: Int = 0
|
||||
)
|
||||
@ -0,0 +1,42 @@
|
||||
package com.gh.gamecenter.home.custom.model
|
||||
|
||||
import android.util.LruCache
|
||||
import com.gh.gamecenter.feature.entity.GameEntity
|
||||
import io.reactivex.Observable
|
||||
import io.reactivex.Single
|
||||
|
||||
class CustomPageCacheDataSource {
|
||||
|
||||
// 计算内存缓存大小,这里取应用最大可用内存的1/8(单位:KB)
|
||||
private fun calculateMemoryCacheSize(): Int {
|
||||
val maxMemory = (Runtime.getRuntime().maxMemory() / 1024).toInt()
|
||||
return maxMemory / 8
|
||||
}
|
||||
|
||||
private val memoryCache: LruCache<String, List<GameEntity>> =
|
||||
object : LruCache<String, List<GameEntity>>(calculateMemoryCacheSize()) {
|
||||
override fun sizeOf(key: String, value: List<GameEntity>): Int {
|
||||
return value.toTypedArray().size / 1024 // 单位:KB
|
||||
}
|
||||
}
|
||||
|
||||
fun getGameList(subjectId: String) = Observable.create {
|
||||
val gameList = memoryCache.get(subjectId)
|
||||
if (gameList.isNullOrEmpty()) {
|
||||
it.onComplete()
|
||||
} else {
|
||||
it.onNext(gameList)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fun putGameList(subjectId: String?, data: List<GameEntity>) {
|
||||
if (!subjectId.isNullOrBlank()) {
|
||||
memoryCache.put(subjectId, data)
|
||||
}
|
||||
}
|
||||
|
||||
fun onClear() {
|
||||
memoryCache.evictAll()
|
||||
}
|
||||
}
|
||||
@ -15,10 +15,10 @@ import com.gh.gamecenter.feature.exposure.ExposureEvent
|
||||
import com.gh.vspace.VGameItemData
|
||||
|
||||
abstract class CustomPageItem(
|
||||
// 当前模块在数据列表中的位置(注意:非ui页面的位置,而是数据列表中的位置,因为某条数据可能会拆分成多个item)
|
||||
val link: LinkEntity,
|
||||
var position: Int,
|
||||
val componentPosition: Int
|
||||
var position: Int,// 当前模块在数据列表中的位置(注意:非ui页面的位置,而是数据列表中的位置,因为某条数据可能会拆分成多个item)
|
||||
val componentPosition: Int,
|
||||
val componentId: String,
|
||||
) {
|
||||
|
||||
abstract val itemType: Int
|
||||
@ -362,9 +362,11 @@ abstract class CustomPageItem(
|
||||
data class CustomSubjectItem(
|
||||
private val _link: LinkEntity,
|
||||
val data: SubjectEntity,
|
||||
private val scrollState: ScrollState,
|
||||
private val _position: Int,
|
||||
private val _componentPosition: Int
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentPosition: Int,
|
||||
private val _componentId: String,
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
override val itemType: Int
|
||||
get() = subjectTypeMap[data.type] ?: CUSTOM_PAGE_ITEM_TYPE_INVALID
|
||||
@ -379,7 +381,11 @@ data class CustomSubjectItem(
|
||||
get() = data.data ?: emptyList()
|
||||
|
||||
// 临时变量,记录横向列表滚动的距离
|
||||
var scrolledOffset: Int = 0
|
||||
var scrolledOffset: Int
|
||||
get() = scrollState.scrolledOffset
|
||||
set(value) {
|
||||
scrollState.scrolledOffset = value
|
||||
}
|
||||
|
||||
val exposureSource: List<ExposureSource>
|
||||
get() = listOf(ExposureSource("专题", "${data.name ?: ""}+$componentStyle+${data.id}"))
|
||||
@ -420,7 +426,7 @@ data class CustomSubjectItem(
|
||||
if (latestDayBeforeTodayPair.first >= testDayOffset) {
|
||||
latestDayBeforeTodayPair = Pair(testDayOffset, index)
|
||||
}
|
||||
} else if (testDayOffset > 0) {
|
||||
} else {
|
||||
if (testDayOffset <= latestDayAfterTodayPair.first) {
|
||||
latestDayAfterTodayPair = Pair(testDayOffset, index)
|
||||
}
|
||||
@ -440,11 +446,12 @@ data class CustomSubjectItem(
|
||||
data class CustomSplitSubjectItem(
|
||||
private val _link: LinkEntity,
|
||||
var data: SubjectEntity,
|
||||
val step: Int,
|
||||
val startChildPosition: Int,
|
||||
private val _position: Int,
|
||||
private val _componentPosition: Int,
|
||||
val step: Int,
|
||||
val startChildPosition: Int
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentId: String,
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
var splitItemCount: Int = -1 // 游戏专题拆分出来的子项数量
|
||||
|
||||
@ -509,8 +516,9 @@ data class CustomGameItem(
|
||||
val linkColumn: SubjectEntity?,
|
||||
val childPosition: Int,
|
||||
private val _position: Int, // 当前 item 在 ui 中的位置
|
||||
private val _componentPosition: Int // 当前组件的位置
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentPosition: Int, // 当前组件的位置
|
||||
private val _componentId: String
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
override val itemType: Int
|
||||
get() = CUSTOM_PAGE_ITEM_TYPE_GAME_HOME_GAME_ITEM
|
||||
@ -546,9 +554,11 @@ data class CustomGameItem(
|
||||
data class CustomSubjectCollectionItem(
|
||||
private val _link: LinkEntity,
|
||||
val data: CustomPageData.LinkColumnCollection,
|
||||
val uiState: CollectionItemDTO.UIState,
|
||||
private val _position: Int,
|
||||
private val _componentPosition: Int
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentPosition: Int,
|
||||
private val _componentId: String
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
val isSubjectCollection: Boolean // 是否是专题合集(还有可能是游戏单合集)
|
||||
get() = link.type == CUSTOM_LINK_TYPE_COLUMN_COLLECTION
|
||||
@ -572,19 +582,14 @@ data class CustomSubjectCollectionItem(
|
||||
emptyList()
|
||||
}
|
||||
|
||||
// 临时变量:记录合集中,轮换刷新时当前显示的页码
|
||||
//当前显示的页码
|
||||
var showPage: Int = 0
|
||||
|
||||
// 临时变量:记录合集中,轮换刷新时当前加载的页码
|
||||
var loadPage: Int = 1
|
||||
|
||||
// 临时变量,记录点击轮换刷新时,是否正在loading
|
||||
var isLoading: Boolean = false
|
||||
|
||||
// 临时变量,数据是否已全部加载完毕
|
||||
var isLoadedEnd: Boolean = false
|
||||
|
||||
var isBackToStart = true
|
||||
var isBackToStart: Boolean
|
||||
get() = uiState.isBackToStart
|
||||
set(value) {
|
||||
uiState.isBackToStart = value
|
||||
}
|
||||
|
||||
val showSubject: CustomPageData.LinkColumnCollection.CustomSubjectEntity?
|
||||
get() = data.data.getOrNull(showPage % data.data.size)
|
||||
@ -592,14 +597,12 @@ data class CustomSubjectCollectionItem(
|
||||
override fun doAreItemsTheSame(other: CustomPageItem): Boolean {
|
||||
return other is CustomSubjectCollectionItem
|
||||
&& data.id == other.data.id
|
||||
|
||||
}
|
||||
|
||||
override fun doAreContentsTheSames(other: CustomPageItem): Boolean {
|
||||
return other is CustomSubjectCollectionItem
|
||||
&& showPage == other.showPage
|
||||
&& isLoading == other.isLoading
|
||||
&& isLoadedEnd == other.isLoadedEnd
|
||||
&& showSubject == other.showSubject
|
||||
}
|
||||
}
|
||||
|
||||
@ -608,8 +611,9 @@ data class CustomRecentGamesItem(
|
||||
private val _link: LinkEntity,
|
||||
val data: List<VGameItemData>,
|
||||
private val _position: Int,
|
||||
private val _componentPosition: Int
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentPosition: Int,
|
||||
private val _componentId: String
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
override val itemType: Int
|
||||
get() = CUSTOM_PAGE_ITEM_TYPE_RECENT_PLAY
|
||||
@ -628,8 +632,9 @@ data class CustomRecentWeChatMiniGamesItem(
|
||||
private val _link: LinkEntity,
|
||||
val data: List<GameEntity>,
|
||||
private val _position: Int,
|
||||
private val _componentPosition: Int
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentPosition: Int,
|
||||
private val _componentId: String
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
override val itemType: Int
|
||||
get() = CUSTOM_PAGE_ITEM_TYPE_MINI_GAME_RECENT_PLAY
|
||||
@ -647,8 +652,9 @@ data class CustomWeChatMiniGamesCPMSubjectItem(
|
||||
private val _link: LinkEntity,
|
||||
val data: SubjectEntity,
|
||||
private val _position: Int,
|
||||
private val _componentPosition: Int
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentPosition: Int,
|
||||
private val _componentId: String
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
override val itemType: Int
|
||||
get() = CUSTOM_PAGE_ITEM_TYPE_MINI_GAME_RECENT_PLAY
|
||||
@ -667,8 +673,9 @@ data class CustomRecentQqMiniGamesItem(
|
||||
val data: List<GameEntity>,
|
||||
val linkQqGameRecentlyPlayed: CustomPageData.LinkRecentlyPlayed,
|
||||
private val _position: Int,
|
||||
private val _componentPosition: Int
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentPosition: Int,
|
||||
private val _componentId: String
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
override val itemType: Int
|
||||
get() = CUSTOM_PAGE_ITEM_TYPE_MINI_GAME_RECENT_PLAY
|
||||
@ -690,8 +697,9 @@ data class CustomRecentAcceleratorItem(
|
||||
val data: List<AcctRecord>,
|
||||
val moreLink: LinkEntity?,
|
||||
private val _position: Int,
|
||||
private val _componentPosition: Int
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentPosition: Int,
|
||||
private val _componentId: String
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
override val itemType: Int
|
||||
get() = CUSTOM_PAGE_ITEM_TYPE_ACCELERATOR_RECENT_PLAYED
|
||||
@ -713,8 +721,9 @@ data class CustomPluginItem(
|
||||
private val _link: LinkEntity,
|
||||
val data: List<GameEntity>,
|
||||
private val _position: Int,
|
||||
private val _componentPosition: Int
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentPosition: Int,
|
||||
private val _componentId: String
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
override val itemType: Int
|
||||
get() = CUSTOM_PAGE_ITEM_TYPE_PLUGIN
|
||||
@ -735,8 +744,9 @@ data class CustomGameTestV2Item(
|
||||
private val _link: LinkEntity,
|
||||
val data: HomeItemTestV2Entity,
|
||||
private val _position: Int,
|
||||
private val _componentPosition: Int
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentPosition: Int,
|
||||
private val _componentId: String
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
override val itemType: Int
|
||||
get() = CUSTOM_PAGE_ITEM_TYPE_NEW_GAME_TEST
|
||||
@ -754,8 +764,9 @@ data class CustomDiscoverCardItem(
|
||||
private val _link: LinkEntity,
|
||||
val data: DiscoveryCardEntity?,
|
||||
private val _position: Int,
|
||||
private val _componentPosition: Int
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentPosition: Int,
|
||||
private val _componentId: String
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
val spanCount = 3
|
||||
|
||||
@ -781,8 +792,9 @@ data class CustomAmwayItem(
|
||||
private val _link: LinkEntity,
|
||||
val data: List<AmwayCommentEntity>,
|
||||
private val _position: Int,
|
||||
private val _componentPosition: Int
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentPosition: Int,
|
||||
private val _componentId: String
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
override val itemType: Int
|
||||
get() = CUSTOM_PAGE_ITEM_TYPE_AMWAY_WALL
|
||||
@ -800,8 +812,9 @@ data class CustomContentCardItem(
|
||||
private val _link: LinkEntity,
|
||||
val data: CustomPageData.ContentCard,
|
||||
private val _position: Int,
|
||||
private val _componentPosition: Int
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentPosition: Int,
|
||||
private val _componentId: String
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
override val itemType: Int
|
||||
get() = CUSTOM_PAGE_ITEM_TYPE_CONTENT_CARD
|
||||
@ -822,8 +835,9 @@ data class CustomCommonContentCollectionItem(
|
||||
private val _link: LinkEntity,
|
||||
val data: CustomPageData.CommonContentCollection,
|
||||
private val _position: Int,
|
||||
private val _componentPosition: Int
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentPosition: Int,
|
||||
private val _componentId: String
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
override val itemType: Int
|
||||
get() = if (data.layout == COMMON_CONTENT_COLLECTION_LAYOUT_BANNER) {
|
||||
@ -861,10 +875,11 @@ data class CustomCommonContentCollectionItem(
|
||||
data class CustomSplitCommonContentCollectionItem(
|
||||
private val _link: LinkEntity,
|
||||
val data: CustomPageData.CommonContentCollection,
|
||||
val leftPosition: Int,
|
||||
private val _position: Int,
|
||||
private val _componentPosition: Int,
|
||||
val leftPosition: Int,
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentId: String
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
override val itemType
|
||||
get() = commonContentCollection[data.layout] ?: CUSTOM_PAGE_ITEM_TYPE_INVALID
|
||||
@ -897,8 +912,9 @@ data class CustomPKItem(
|
||||
private val _link: LinkEntity,
|
||||
val data: PKEntity?,
|
||||
private val _position: Int,
|
||||
private val _componentPosition: Int
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentPosition: Int,
|
||||
private val _componentId: String
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
override val itemType: Int
|
||||
get() = CUSTOM_PAGE_ITEM_TYPE_PK
|
||||
@ -916,8 +932,9 @@ data class CustomDspPlaceholderItem(
|
||||
private val _link: LinkEntity,
|
||||
val data: SubjectEntity,
|
||||
private val _position: Int,
|
||||
private val _componentPosition: Int
|
||||
) : CustomPageItem(_link, _position, _componentPosition) {
|
||||
private val _componentPosition: Int,
|
||||
private val _componentId: String
|
||||
) : CustomPageItem(_link, _position, _componentPosition, _componentId) {
|
||||
|
||||
override val itemType: Int
|
||||
get() = CUSTOM_PAGE_ITEM_TYPE_MINI_GAME_RECENT_PLAY
|
||||
@ -930,14 +947,9 @@ data class CustomDspPlaceholderItem(
|
||||
}
|
||||
}
|
||||
|
||||
object CustomFooterItem : CustomPageItem(LinkEntity(), -1, -1) {
|
||||
object CustomFooterItem : CustomPageItem(LinkEntity(), -1, -1, "") {
|
||||
override val itemType: Int
|
||||
get() = CUSTOM_PAGE_ITEM_TYPE_FOOTER
|
||||
}
|
||||
|
||||
object CustomInvalidItem : CustomPageItem(LinkEntity(), -2, -2) {
|
||||
override val itemType: Int
|
||||
get() = CUSTOM_PAGE_ITEM_TYPE_INVALID
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -1,8 +1,10 @@
|
||||
package com.gh.gamecenter.home.custom.model
|
||||
|
||||
import android.content.Context
|
||||
import android.util.LruCache
|
||||
import com.gh.gamecenter.core.utils.SPUtils
|
||||
import com.gh.gamecenter.feature.entity.FloatingWindowEntity
|
||||
import com.gh.gamecenter.feature.entity.GameEntity
|
||||
import com.halo.assistant.HaloApp
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
@ -56,12 +56,17 @@ class CustomPageRemoteDataSource(
|
||||
}
|
||||
}
|
||||
|
||||
fun loadCollectionContent(item: CustomSubjectCollectionItem): Single<List<CustomPageData.LinkColumnCollection.CustomSubjectEntity>> =
|
||||
if (item.isSubjectCollection) {
|
||||
newApi.getColumnsCollectionContents(item.data.id, "component", item.loadPage + 1, 1)
|
||||
} else {
|
||||
newApi.getGameCollectionContents(item.data.id, "component", item.loadPage + 1, 1)
|
||||
}
|
||||
fun loadColumnsCollectionContents(
|
||||
collectionId: String,
|
||||
page: Int
|
||||
): Single<MutableList<CustomPageData.LinkColumnCollection.CustomSubjectEntity>> =
|
||||
newApi.getColumnsCollectionContents(collectionId, "component", page, 1)
|
||||
|
||||
fun loadGameCollectionContents(
|
||||
collectionId: String,
|
||||
page: Int
|
||||
): Single<MutableList<CustomPageData.LinkColumnCollection.CustomSubjectEntity>> =
|
||||
newApi.getGameCollectionContents(collectionId, "component", page, 1)
|
||||
|
||||
fun loadChangeSubjectGame(subjectEntity: SubjectEntity): Observable<List<GameEntity>> =
|
||||
if (subjectEntity.isQQColumn) {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -2,10 +2,13 @@ package com.gh.gamecenter.home.custom.model
|
||||
|
||||
import androidx.annotation.MainThread
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MediatorLiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.asLiveData
|
||||
import com.gh.common.filter.RegionSettingHelper
|
||||
import com.gh.common.util.HomePluggableHelper
|
||||
import com.gh.common.util.PackageUtils
|
||||
import com.gh.download.DownloadManager
|
||||
import com.gh.gamecenter.common.constant.Constants
|
||||
import com.gh.gamecenter.common.constant.Constants.SP_HIDDEN_NOTIFICATIONS
|
||||
import com.gh.gamecenter.common.utils.observableToMain
|
||||
@ -17,7 +20,9 @@ import com.gh.gamecenter.entity.DiscoveryGameCardEntity
|
||||
import com.gh.gamecenter.entity.DiscoveryGameCardLabel
|
||||
import com.gh.gamecenter.feature.entity.AcctRecord
|
||||
import com.gh.gamecenter.feature.entity.GameEntity
|
||||
import com.gh.gamecenter.feature.entity.PluginLocation
|
||||
import com.gh.gamecenter.gamedetail.accelerator.AccelerationDataBase
|
||||
import com.gh.gamecenter.packagehelper.PackageRepository
|
||||
import com.gh.gamecenter.retrofit.RetrofitManager
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.reflect.TypeToken
|
||||
@ -34,6 +39,30 @@ class CustomPageShareRepository private constructor() {
|
||||
|
||||
private val compositeDisposable = CompositeDisposable()
|
||||
|
||||
private val _pluginGames = MediatorLiveData<List<GameEntity>>().apply {
|
||||
addSource(PackageRepository.gameUpdateLiveData) { updateList ->
|
||||
val gameList = arrayListOf<GameEntity>()
|
||||
updateList.forEach {
|
||||
if (it.isPluggable && it.indexPlugin == "open" && it.isShowPlugin(PluginLocation.only_index)) {
|
||||
val game = it.transformGameEntity()
|
||||
if (HomePluggableHelper.showHomePluggable(game)) {
|
||||
game.setEntryMap(DownloadManager.getInstance().getEntryMap(game.name))
|
||||
gameList.add(game)
|
||||
}
|
||||
}
|
||||
}
|
||||
// 下载七天排序
|
||||
gameList.sortWith { o1, o2 -> o2.download - o1.download }
|
||||
value = gameList
|
||||
}
|
||||
}
|
||||
|
||||
val pluginGames: LiveData<List<GameEntity>> = _pluginGames
|
||||
fun temporarilyBlockGameInPluginItem(gameId: String) {
|
||||
val gameList = _pluginGames.value ?: return
|
||||
_pluginGames.value = gameList.filterNot { it.id == gameId }
|
||||
}
|
||||
|
||||
private val _discoverData = MutableLiveData<DiscoveryCardEntity>()
|
||||
val discoverData: LiveData<DiscoveryCardEntity> = _discoverData
|
||||
|
||||
|
||||
@ -26,10 +26,7 @@ import com.gh.gamecenter.home.custom.createExposureEvent
|
||||
import com.gh.gamecenter.home.custom.eventlistener.CustomPageItemChildEventHelper
|
||||
import com.gh.gamecenter.home.custom.eventlistener.GameSubjectCollectionEventHelper
|
||||
import com.gh.gamecenter.home.custom.eventlistener.SubjectEventHelper
|
||||
import com.gh.gamecenter.home.custom.model.CustomPageItem
|
||||
import com.gh.gamecenter.home.custom.model.CustomSplitSubjectItem
|
||||
import com.gh.gamecenter.home.custom.model.CustomSubjectCollectionItem
|
||||
import com.gh.gamecenter.home.custom.model.CustomSubjectItem
|
||||
import com.gh.gamecenter.home.custom.model.*
|
||||
import com.lightgame.download.DownloadEntity
|
||||
|
||||
abstract class BaseCustomViewHolder(
|
||||
@ -98,7 +95,14 @@ abstract class BaseCustomViewHolder(
|
||||
titleBinding.root.goneIf(false)
|
||||
setSubjectTitle(
|
||||
titleBinding,
|
||||
CustomSubjectItem(item.link, item.data, item.position, item.componentPosition),
|
||||
CustomSubjectItem(
|
||||
item.link,
|
||||
item.data,
|
||||
ScrollState(),
|
||||
item.position,
|
||||
item.componentPosition,
|
||||
item.componentId
|
||||
),
|
||||
eventHelper,
|
||||
titleType
|
||||
)
|
||||
@ -189,7 +193,7 @@ abstract class BaseCustomViewHolder(
|
||||
when (subject.home) {
|
||||
HOME_CHANGE -> {
|
||||
// 点击换一批
|
||||
eventHelper.onChangeABatch(subject)
|
||||
eventHelper.onChangeABatch(item.componentId, subject)
|
||||
}
|
||||
|
||||
HOME_MORE -> {
|
||||
|
||||
@ -88,7 +88,7 @@ class CustomRefreshIconViewHolder(
|
||||
} else {
|
||||
_subjectEntity = subjectEntity
|
||||
}
|
||||
|
||||
println("kayn -->isBackToStart:${item.isBackToStart}")
|
||||
// 如果游戏全部被屏蔽,自动加载下一页
|
||||
if (subjectEntity.games.isEmpty()) {
|
||||
childEventHelper.onRotateRefresh()
|
||||
|
||||
@ -38,19 +38,12 @@ object MiniGameRecentlyPlayUseCase {
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(object : BiResponse<List<GameEntity>>() {
|
||||
override fun onSuccess(data: List<GameEntity>) {
|
||||
if (gameType == Constants.QQ_MINI_GAME) {
|
||||
_qqRecentGamesItemLiveData.value = data
|
||||
} else {
|
||||
_wechatRecentGamesItemLiveData.value = data
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFailure(exception: Exception) {
|
||||
super.onFailure(exception)
|
||||
if (gameType == Constants.QQ_MINI_GAME) {
|
||||
_qqRecentGamesItemLiveData.value = emptyList()
|
||||
} else {
|
||||
_wechatRecentGamesItemLiveData.value = emptyList()
|
||||
if (data.isNotEmpty()) {
|
||||
if (gameType == Constants.QQ_MINI_GAME) {
|
||||
_qqRecentGamesItemLiveData.value = data
|
||||
} else {
|
||||
_wechatRecentGamesItemLiveData.value = data
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
@ -90,10 +83,7 @@ object MiniGameRecentlyPlayUseCase {
|
||||
_qqRecentGamesItemLiveData.value
|
||||
} else {
|
||||
_wechatRecentGamesItemLiveData.value
|
||||
} ?: let {
|
||||
loadRecentlyPlayedMiniGameList(gameType)// 最近在玩数据为空时,则调用接口获取数据
|
||||
emptyList()
|
||||
}
|
||||
} ?: emptyList()
|
||||
|
||||
fun clearRecentlyPlayedMiniGameList(gameType: String = "") {
|
||||
when (gameType) {
|
||||
|
||||
@ -9,15 +9,19 @@ import io.reactivex.Observable
|
||||
import io.reactivex.Single
|
||||
|
||||
class QGameSubjectListRepository(
|
||||
private val api: ApiService = RetrofitManager.getInstance().newApi
|
||||
private val api: ApiService = RetrofitManager.getInstance().newApi,
|
||||
) : ISubjectListRepository {
|
||||
|
||||
override fun getColumn(column_id: String?,
|
||||
page: Int,
|
||||
sort: String?,
|
||||
order: String?,
|
||||
ad: String?,
|
||||
columnCollectionId: String?): Single<MutableList<GameEntity>> {
|
||||
override fun getColumn(
|
||||
column_id: String?,
|
||||
page: Int,
|
||||
sort: String?,
|
||||
order: String?,
|
||||
ad: String?,
|
||||
columnCollectionId: String?,
|
||||
minimumSize: Int,
|
||||
onlyFee: Boolean,
|
||||
): Single<MutableList<GameEntity>> {
|
||||
return api.getQGameColumn(column_id, order, page, 20)
|
||||
}
|
||||
|
||||
|
||||
@ -10,13 +10,17 @@ class WGameSubjectCPMListRepository(
|
||||
private val dataSource: WGameSubjectCPMRemoteDataSource = WGameSubjectCPMRemoteDataSource()
|
||||
) : ISubjectListRepository {
|
||||
|
||||
override fun getColumn(column_id: String?,
|
||||
page: Int,
|
||||
sort: String?,
|
||||
order: String?,
|
||||
ad: String?,
|
||||
columnCollectionId: String?): Single<MutableList<GameEntity>> {
|
||||
return dataSource.getEditorRecommendCPMList(page)
|
||||
override fun getColumn(
|
||||
column_id: String?,
|
||||
page: Int,
|
||||
sort: String?,
|
||||
order: String?,
|
||||
ad: String?,
|
||||
columnCollectionId: String?,
|
||||
minimumSize: Int,
|
||||
onlyFee: Boolean
|
||||
): Single<MutableList<GameEntity>> {
|
||||
return dataSource.getEditorRecommendCPMList(page = page, minimumSize = minimumSize, onlyFee = onlyFee)
|
||||
}
|
||||
|
||||
override fun getColumnSettings(column_id: String?): Observable<SubjectSettingEntity> {
|
||||
|
||||
@ -6,6 +6,7 @@ import com.gh.gamecenter.common.livedata.NonStickyMutableLiveData
|
||||
import com.gh.gamecenter.common.retrofit.BiResponse
|
||||
import com.gh.gamecenter.feature.entity.GameEntity
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.disposables.CompositeDisposable
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
|
||||
/**
|
||||
@ -14,11 +15,7 @@ import io.reactivex.schedulers.Schedulers
|
||||
class WGameSubjectCPMListUseCase(
|
||||
private val repository: WGameSubjectCPMListRepository = WGameSubjectCPMListRepository()
|
||||
) {
|
||||
|
||||
/**
|
||||
* 微信专题CPM请求记录,用于避免重复请求,以专题ID作为Key
|
||||
*/
|
||||
private val requestKeyList = mutableListOf<String>()
|
||||
private val compositeDisposable = CompositeDisposable()
|
||||
|
||||
/**
|
||||
* 微信小游戏CPM列表,这里的LiveData充当类似于EventBus的角色,因此使用NonStickyMutableLiveData
|
||||
@ -26,21 +23,18 @@ class WGameSubjectCPMListUseCase(
|
||||
private val _wechatMiniGameCPMListLiveData = NonStickyMutableLiveData<Pair<String, List<GameEntity>>>()
|
||||
val wechatMiniGameCPMListLiveData: LiveData<Pair<String, List<GameEntity>>> = _wechatMiniGameCPMListLiveData
|
||||
|
||||
@SuppressLint("CheckResult")
|
||||
fun getWechatMiniGameCPMList(subjectId: String?) {
|
||||
if (subjectId.isNullOrEmpty() || requestKeyList.contains(subjectId)) {
|
||||
return
|
||||
}
|
||||
|
||||
requestKeyList.add(subjectId)
|
||||
repository.getColumn(null, 1, null, null, null, null)
|
||||
fun getWechatMiniGameCPMList(componentId: String, minimumSize: Int, onlyFee: Boolean) {
|
||||
repository.getColumn(null, 1, null, null, null, null, minimumSize, onlyFee)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(object : BiResponse<List<GameEntity>>() {
|
||||
override fun onSuccess(data: List<GameEntity>) {
|
||||
requestKeyList.remove(subjectId)
|
||||
_wechatMiniGameCPMListLiveData.value = subjectId to data
|
||||
_wechatMiniGameCPMListLiveData.value = componentId to data
|
||||
}
|
||||
})
|
||||
}).let(compositeDisposable::add)
|
||||
}
|
||||
|
||||
fun onClear() {
|
||||
compositeDisposable.clear()
|
||||
}
|
||||
}
|
||||
@ -14,7 +14,12 @@ class WGameSubjectCPMRemoteDataSource(
|
||||
private val api: WGameCPMApiService = RetrofitManager.getInstance().wGameCPMApi
|
||||
) {
|
||||
|
||||
fun getEditorRecommendCPMList(page: Int, pageSize: Int = 10): Single<MutableList<GameEntity>> {
|
||||
fun getEditorRecommendCPMList(
|
||||
page: Int,
|
||||
pageSize: Int = 10,
|
||||
minimumSize: Int,
|
||||
onlyFee: Boolean
|
||||
): Single<MutableList<GameEntity>> {
|
||||
val meta = MetaUtil.getMeta()
|
||||
val request = mapOf(
|
||||
"head" to mapOf(
|
||||
@ -28,38 +33,44 @@ class WGameSubjectCPMRemoteDataSource(
|
||||
"body" to mapOf(
|
||||
"page" to page - 1,
|
||||
"pageSize" to pageSize,
|
||||
"onlyFee" to if (onlyFee) 1 else 0,
|
||||
)
|
||||
)
|
||||
return api.getEditorRecommendList(request.toRequestBody())
|
||||
.map {
|
||||
if (it.ret == 0) {
|
||||
it.appInfoList.map { info ->
|
||||
GameEntity(
|
||||
mName = info.appName,
|
||||
mIcon = info.logo,
|
||||
mBrief = info.briefIntro,
|
||||
miniGameUid = info.appID,
|
||||
miniGameAppId = info.userName,
|
||||
miniGameCategory = Constants.WECHAT_MINI_GAME,
|
||||
profit = Constants.WECHAT_MINI_GAME_PROFIT_CPM,
|
||||
miniGameAppStatus = 2,
|
||||
miniGameAppPath = info.wechatAppPath,
|
||||
miniGameExtData = info.extData,
|
||||
miniGameRecommendId = info.recommendID,
|
||||
mTagStyle = arrayListOf(
|
||||
TagStyleEntity(
|
||||
name = info.categoryName,
|
||||
color = TAG_COLOR,
|
||||
background = TAG_BACKGROUND
|
||||
),
|
||||
TagStyleEntity(
|
||||
name = info.subcategoryName,
|
||||
color = TAG_COLOR,
|
||||
background = TAG_BACKGROUND
|
||||
// 数量不满足最小值时直接返回空
|
||||
if (onlyFee && minimumSize > 0 && it.appInfoList.size < minimumSize) {
|
||||
mutableListOf()
|
||||
} else {
|
||||
it.appInfoList.map { info ->
|
||||
GameEntity(
|
||||
mName = info.appName,
|
||||
mIcon = info.logo,
|
||||
mBrief = info.briefIntro,
|
||||
miniGameUid = info.appID,
|
||||
miniGameAppId = info.userName,
|
||||
miniGameCategory = Constants.WECHAT_MINI_GAME,
|
||||
profit = Constants.WECHAT_MINI_GAME_PROFIT_CPM,
|
||||
miniGameAppStatus = 2,
|
||||
miniGameAppPath = info.wechatAppPath,
|
||||
miniGameExtData = info.extData,
|
||||
miniGameRecommendId = info.recommendID,
|
||||
mTagStyle = arrayListOf(
|
||||
TagStyleEntity(
|
||||
name = info.categoryName,
|
||||
color = TAG_COLOR,
|
||||
background = TAG_BACKGROUND
|
||||
),
|
||||
TagStyleEntity(
|
||||
name = info.subcategoryName,
|
||||
color = TAG_COLOR,
|
||||
background = TAG_BACKGROUND
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
}.toMutableList()
|
||||
}.toMutableList()
|
||||
}
|
||||
} else {
|
||||
mutableListOf()
|
||||
}
|
||||
|
||||
@ -9,15 +9,19 @@ import io.reactivex.Observable
|
||||
import io.reactivex.Single
|
||||
|
||||
class WGameSubjectListRepository(
|
||||
private val api: ApiService = RetrofitManager.getInstance().newApi
|
||||
private val api: ApiService = RetrofitManager.getInstance().newApi,
|
||||
) : ISubjectListRepository {
|
||||
|
||||
override fun getColumn(column_id: String?,
|
||||
page: Int,
|
||||
sort: String?,
|
||||
order: String?,
|
||||
ad: String?,
|
||||
columnCollectionId: String?): Single<MutableList<GameEntity>> {
|
||||
override fun getColumn(
|
||||
column_id: String?,
|
||||
page: Int,
|
||||
sort: String?,
|
||||
order: String?,
|
||||
ad: String?,
|
||||
columnCollectionId: String?,
|
||||
minimumSize: Int,
|
||||
onlyFee: Boolean,
|
||||
): Single<MutableList<GameEntity>> {
|
||||
return api.getWGameColumn(column_id, order, page, 20)
|
||||
}
|
||||
|
||||
|
||||
@ -9,15 +9,17 @@ import com.gh.common.filter.RegionSettingHelper
|
||||
import com.gh.common.util.GameUtils
|
||||
import com.gh.common.util.PackageHelper
|
||||
import com.gh.common.util.PackageUtils
|
||||
import com.gh.gamecenter.R
|
||||
import com.gh.gamecenter.common.constant.Constants
|
||||
import com.gh.gamecenter.common.entity.InstalledPackagesAction
|
||||
import com.gh.gamecenter.common.exposure.meta.MetaUtil
|
||||
import com.gh.gamecenter.common.loghub.LoghubUtils
|
||||
import com.gh.gamecenter.common.retrofit.BiResponse
|
||||
import com.gh.gamecenter.common.retrofit.EmptyResponse
|
||||
import com.gh.gamecenter.common.retrofit.ObservableUtil
|
||||
import com.gh.gamecenter.common.retrofit.Response
|
||||
import com.gh.gamecenter.common.utils.secondOrNull
|
||||
import com.gh.gamecenter.common.utils.toArrayList
|
||||
import com.gh.gamecenter.common.utils.toRequestBody
|
||||
import com.gh.gamecenter.common.utils.tryCatchInRelease
|
||||
import com.gh.gamecenter.core.runOnIoThread
|
||||
import com.gh.gamecenter.core.utils.SPUtils
|
||||
@ -41,10 +43,12 @@ import io.reactivex.SingleObserver
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.disposables.Disposable
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
import okhttp3.ResponseBody
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
import org.json.JSONException
|
||||
import org.json.JSONObject
|
||||
import java.util.*
|
||||
import kotlin.collections.HashSet
|
||||
|
||||
/**
|
||||
* 该类存储的是已安装的所有游戏(助手后台已收录的)和所有更新(包括插件化)数据
|
||||
@ -624,7 +628,20 @@ object PackageRepository {
|
||||
pkgSet.add(iterator.next())
|
||||
}
|
||||
|
||||
postInstalledPackageList(pkgSet)
|
||||
|
||||
PackagesManager.initInstallPkgSet(pkgSet)
|
||||
}
|
||||
|
||||
private fun postInstalledPackageList(pkgSet: HashSet<String>) {
|
||||
val requestBody = InstalledPackagesAction(
|
||||
action = "launch",
|
||||
packages = pkgSet.toList()
|
||||
).toRequestBody()
|
||||
|
||||
RetrofitManager.getInstance().newApi.postInstalledPackages(HaloApp.getInstance().gid, requestBody)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.subscribe(EmptyResponse<ResponseBody>())
|
||||
}
|
||||
|
||||
}
|
||||
@ -3521,4 +3521,11 @@ public interface ApiService {
|
||||
@Headers({"Content-Type: application/json", "Accept: application/json"})
|
||||
@POST("suggestions")
|
||||
Single<ResponseBody> uploadAcceleratorErrorLog(@Body RequestBody toRequestBody);
|
||||
|
||||
/**
|
||||
* 上传设备已安装的游戏
|
||||
*/
|
||||
@POST("/devices/{device_id}/installed_games")
|
||||
Single<ResponseBody> postInstalledPackages(@Path("device_id") String deviceId, @Body RequestBody body);
|
||||
|
||||
}
|
||||
@ -13,7 +13,9 @@ interface ISubjectListRepository {
|
||||
sort: String?,
|
||||
order: String?,
|
||||
ad: String?,
|
||||
columnCollectionId: String?
|
||||
columnCollectionId: String?,
|
||||
minimumSize: Int,
|
||||
onlyFee: Boolean
|
||||
): Single<MutableList<GameEntity>>
|
||||
|
||||
fun getColumnSettings(column_id: String?): Observable<SubjectSettingEntity>
|
||||
|
||||
@ -8,10 +8,19 @@ import io.reactivex.Observable
|
||||
import io.reactivex.Single
|
||||
|
||||
class SubjectListRepository(
|
||||
private val api: ApiService = RetrofitManager.getInstance().api
|
||||
private val api: ApiService = RetrofitManager.getInstance().api,
|
||||
) : ISubjectListRepository {
|
||||
|
||||
override fun getColumn(column_id: String?, page: Int, sort: String?, order: String?, ad: String?, columnCollectionId: String?): Single<MutableList<GameEntity>> {
|
||||
override fun getColumn(
|
||||
column_id: String?,
|
||||
page: Int,
|
||||
sort: String?,
|
||||
order: String?,
|
||||
ad: String?,
|
||||
columnCollectionId: String?,
|
||||
minimumSize: Int,
|
||||
onlyFee: Boolean,
|
||||
): Single<MutableList<GameEntity>> {
|
||||
return api.getColumn(column_id, sort, order, ad, columnCollectionId, page)
|
||||
}
|
||||
|
||||
|
||||
@ -49,7 +49,9 @@ open class SubjectListViewModel(
|
||||
subjectData.sort,
|
||||
subjectData.filter.ifEmpty { "type:全部" },
|
||||
AdHelper.getIdfaString(),
|
||||
columnCollectionId
|
||||
columnCollectionId,
|
||||
-1,
|
||||
false
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@ -134,6 +134,7 @@ class SubjectTabFragment : ToolbarFragment() {
|
||||
isSubject = subjectList.isEmpty()
|
||||
tabStyle = when {
|
||||
mIsFromMainWrapper && !isSubject -> TabStyle.COLUMN_COLLECTION_MAIN_WRAPPER
|
||||
mIsFromTabWrapper && !isSubject -> TabStyle.COLUMN_COLLECTION_TAB_WRAPPER
|
||||
isSubject -> TabStyle.SUBJECT_NORMAL
|
||||
else -> TabStyle.COLUMN_COLLECTION_NORMAL
|
||||
}
|
||||
@ -370,18 +371,19 @@ class SubjectTabFragment : ToolbarFragment() {
|
||||
}
|
||||
|
||||
private fun initTabLayout() {
|
||||
if (isCustomEnabled && SPUtils.getBoolean(Constants.SP_SHOW_COLUMN_COLLECTION_CUSTOM_TAB_GUIDE, true)) {
|
||||
binding.subjectTab.addOnTabSelectedListener(object : OnTabSelectedListener {
|
||||
override fun onTabSelected(tab: TabLayout.Tab?) {
|
||||
showSettingGuideIfNeeded(this)
|
||||
}
|
||||
override fun onTabUnselected(tab: TabLayout.Tab?) {}
|
||||
override fun onTabReselected(tab: TabLayout.Tab?) {
|
||||
showSettingGuideIfNeeded(this)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (tabStyle == TabStyle.COLUMN_COLLECTION_NORMAL) {
|
||||
if (isCustomEnabled && SPUtils.getBoolean(Constants.SP_SHOW_COLUMN_COLLECTION_CUSTOM_TAB_GUIDE, true)) {
|
||||
binding.subjectTab.addOnTabSelectedListener(object : OnTabSelectedListener {
|
||||
override fun onTabSelected(tab: TabLayout.Tab?) {
|
||||
showSettingGuideIfNeeded(this)
|
||||
}
|
||||
override fun onTabUnselected(tab: TabLayout.Tab?) {}
|
||||
override fun onTabReselected(tab: TabLayout.Tab?) {
|
||||
showSettingGuideIfNeeded(this)
|
||||
}
|
||||
})
|
||||
}
|
||||
binding.subjectTabIndicator.run {
|
||||
setIndicatorWidth(12)
|
||||
updateLayoutParams<ConstraintLayout.LayoutParams> {
|
||||
@ -420,10 +422,13 @@ class SubjectTabFragment : ToolbarFragment() {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
when (i) {
|
||||
0 -> tab.view.setPadding(16F.dip2px(), 0, 0, 0)
|
||||
binding.subjectTab.tabCount - 1 -> tab.view.setPadding(8F.dip2px(), 0, 16F.dip2px(), 0)
|
||||
else -> tab.view.setPadding(8F.dip2px(), 0, 0, 0)
|
||||
val leftPadding = if (i == 0) 16F.dip2px() else 8F.dip2px()
|
||||
val rightPadding = if (i == binding.subjectTab.tabCount - 1) 16F.dip2px() else 0
|
||||
tab.view.setPadding(leftPadding, 0, rightPadding, 0)
|
||||
tab.view.findViewById<View>(R.id.tab_title)?.let {
|
||||
it.post {
|
||||
tab.view.updateLayoutParams<ViewGroup.LayoutParams> { width = leftPadding + rightPadding + it.width }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -481,6 +486,7 @@ class SubjectTabFragment : ToolbarFragment() {
|
||||
if (tabTitle is CheckedTextView) {
|
||||
tabTitle.text = title
|
||||
}
|
||||
view.layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 32F.dip2px())
|
||||
return view
|
||||
}
|
||||
}
|
||||
@ -493,6 +499,7 @@ class SubjectTabFragment : ToolbarFragment() {
|
||||
binding.subjectTab.setTabTextColors(com.gh.gamecenter.common.R.color.text_secondary.toColor(requireContext()), com.gh.gamecenter.common.R.color.text_primary.toColor(requireContext()))
|
||||
}
|
||||
TabStyle.COLUMN_COLLECTION_MAIN_WRAPPER -> updateTabStyle(binding.subjectViewpager.currentItem, 0F)
|
||||
TabStyle.COLUMN_COLLECTION_TAB_WRAPPER,
|
||||
TabStyle.SUBJECT_NORMAL -> {
|
||||
for (i in 0 until binding.subjectTab.tabCount) {
|
||||
val tab = binding.subjectTab.getTabAt(i) ?: continue
|
||||
@ -828,9 +835,14 @@ class SubjectTabFragment : ToolbarFragment() {
|
||||
COLUMN_COLLECTION_MAIN_WRAPPER,
|
||||
|
||||
/**
|
||||
* 专题合集-常规样式
|
||||
* 专题合集-二级页面样式
|
||||
*/
|
||||
COLUMN_COLLECTION_NORMAL,
|
||||
|
||||
/**
|
||||
* 专题合集-关联多Tab导航栏样式
|
||||
*/
|
||||
COLUMN_COLLECTION_TAB_WRAPPER,
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
@ -25,6 +25,7 @@ import com.gh.gamecenter.history.IBatchDelete
|
||||
import com.gh.gamecenter.history.ManageOption
|
||||
import com.lightgame.download.DataWatcher
|
||||
import com.lightgame.download.DownloadEntity
|
||||
import com.lightgame.download.DownloadStatus
|
||||
import kotlinx.coroutines.flow.catch
|
||||
import kotlinx.coroutines.flow.collectLatest
|
||||
import kotlinx.coroutines.launch
|
||||
@ -109,7 +110,16 @@ class VDownloadManagerFragment :
|
||||
ToastUtils.showToast(it.message ?: "")
|
||||
}
|
||||
.collectLatest {
|
||||
onLoadRefresh()
|
||||
when (mViewModel.type) {
|
||||
VDownloadManagerViewModel.TYPE_DOWNLOADED -> {
|
||||
refreshApks(it.map { it.packageName })
|
||||
}
|
||||
|
||||
VDownloadManagerViewModel.TYPE_DOWNLOADING -> {
|
||||
refreshApks(DownloadManager.getInstance().allVDownloadTaskSnapshots.filter { it.status != DownloadStatus.done }
|
||||
.map { it.packageName })
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -125,9 +135,9 @@ class VDownloadManagerFragment :
|
||||
|
||||
override fun isAutomaticLoad(): Boolean = false
|
||||
|
||||
override fun onLoadRefresh() {
|
||||
private fun refreshApks(apks: List<String>) {
|
||||
mReuseNoData?.visibility = View.GONE
|
||||
mViewModel.refresh()
|
||||
mViewModel.refresh(apks)
|
||||
}
|
||||
|
||||
override fun onDarkModeChanged() {
|
||||
|
||||
@ -29,19 +29,19 @@ class VDownloadManagerViewModel(application: Application) :
|
||||
var type = ""
|
||||
var isFromHomeRecent = false
|
||||
|
||||
var loadPublishSubject: PublishSubject<LoadType> = PublishSubject.create()
|
||||
private var loadPublishSubject: PublishSubject<List<String>> = PublishSubject.create()
|
||||
|
||||
val disposable: Disposable = loadPublishSubject.debounce(300, TimeUnit.MILLISECONDS)
|
||||
.distinctUntilChanged()
|
||||
.distinctUntilChanged { p1, p2 -> p1.sorted() == p2.sorted() }
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe {
|
||||
load(it)
|
||||
load(LoadType.REFRESH)
|
||||
}
|
||||
|
||||
val vGames = VHelper.vGameDao.getAllGames()
|
||||
|
||||
fun refresh() {
|
||||
loadPublishSubject.onNext(LoadType.REFRESH)
|
||||
fun refresh(apks: List<String>) {
|
||||
loadPublishSubject.onNext(apks)
|
||||
}
|
||||
|
||||
override fun mergeResultLiveData() {
|
||||
@ -180,9 +180,13 @@ class VDownloadManagerViewModel(application: Application) :
|
||||
|
||||
fun pauseItems(idList: ArrayList<String>) {
|
||||
for (id in idList) {
|
||||
val apkEntity =
|
||||
mResultLiveData.value?.firstOrNull { id == it.id }?.getApk()?.firstOrNull()
|
||||
DownloadManager.getInstance().pause(apkEntity?.url)
|
||||
mResultLiveData.value?.firstOrNull { id == it.id }?.getApk()?.firstOrNull()?.url?.let { url ->
|
||||
DownloadManager.getInstance().getDownloadEntitySnapshot(url)
|
||||
?.takeIf { it.status != DownloadStatus.done }
|
||||
?.let {
|
||||
DownloadManager.getInstance().pause(url)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -97,12 +97,6 @@ class VDownloadManagerWrapperFragment : BaseLazyTabFragment() {
|
||||
}
|
||||
|
||||
fun onNewIntent(intent: Intent?) {
|
||||
childFragmentManager.fragments.forEach {
|
||||
if (it.isAdded && it is VDownloadManagerFragment) {
|
||||
it.onLoadRefresh()
|
||||
}
|
||||
}
|
||||
|
||||
intent?.getIntExtra(EntranceConsts.KEY_POSITION, 0)?.let {
|
||||
mViewPager.post { mViewPager.currentItem = it }
|
||||
}
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="48dp"
|
||||
android:gravity="center"
|
||||
android:textColor="@color/text_tertiary"
|
||||
android:textColor="@color/text_secondary"
|
||||
android:textSize="@dimen/secondary_title_text_size"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
||||
@ -33,14 +33,15 @@
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/backContainer"
|
||||
android:layout_width="48dp"
|
||||
android:layout_width="40dp"
|
||||
android:layout_height="48dp">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/backBtn"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginStart="12dp"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
@ -73,8 +74,8 @@
|
||||
<com.gh.gamecenter.common.view.TabIndicatorView
|
||||
android:id="@+id/tabIndicator"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="@dimen/default_tab_indicator_height"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:layout_height="4dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
app:indicatorColor="@color/primary_theme"
|
||||
app:disableIndicatorScaling="true"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
@ -97,6 +98,7 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="end"
|
||||
android:layout_marginHorizontal="8dp"
|
||||
android:minWidth="44dp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@ -1,20 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/tab_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center">
|
||||
|
||||
<CheckedTextView
|
||||
android:id="@+id/tab_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="32dp"
|
||||
android:background="@drawable/subject_tab_background_selector"
|
||||
android:gravity="center"
|
||||
android:paddingStart="12dp"
|
||||
android:paddingEnd="12dp"
|
||||
android:text="人气榜"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/text_tabbar_style"
|
||||
android:textSize="12sp" />
|
||||
|
||||
</LinearLayout>
|
||||
android:layout_height="32dp"
|
||||
android:background="@drawable/subject_tab_background_selector"
|
||||
android:gravity="center"
|
||||
android:paddingStart="12dp"
|
||||
android:paddingEnd="12dp"
|
||||
android:text="人气榜"
|
||||
android:textAlignment="center"
|
||||
android:textColor="@color/text_tabbar_style"
|
||||
android:textSize="12sp" />
|
||||
@ -14,10 +14,4 @@
|
||||
android:title="@string/menu_more"
|
||||
app:showAsAction="always" />
|
||||
|
||||
<item
|
||||
android:orderInCategory="-1"
|
||||
android:title=""
|
||||
app:actionLayout="@layout/layout_menu_inset"
|
||||
app:showAsAction="always" />
|
||||
|
||||
</menu>
|
||||
@ -7,8 +7,8 @@ ext {
|
||||
targetSdkVersion = 30 // 升级targetSdkVersion到 34 时需要根据官方文档补全前台服务的权限类型。比如 NDownloadService,KeepAliveService
|
||||
|
||||
// application info (每个大版本之间的 versionCode 增加 20)
|
||||
versionCode = 1190
|
||||
versionName = "5.42.0"
|
||||
versionCode = 1210
|
||||
versionName = "5.43.0"
|
||||
applicationId = "com.gh.gamecenter"
|
||||
applicationIdGat = "com.gh.gamecenter.intl"
|
||||
|
||||
|
||||
@ -0,0 +1,10 @@
|
||||
package com.gh.gamecenter.common.entity
|
||||
|
||||
import android.os.Parcelable
|
||||
import kotlinx.parcelize.Parcelize
|
||||
|
||||
@Parcelize
|
||||
class InstalledPackagesAction(
|
||||
val action: String,
|
||||
val packages: List<String>,
|
||||
): Parcelable
|
||||
2
vasdk
2
vasdk
Submodule vasdk updated: 950989924d...02d9241f8d
Reference in New Issue
Block a user