Merge branch 'dev-4.8.0' of git.ghzs.com:halo/assistant-android into dev-4.8.0

This commit is contained in:
张玉久
2021-03-19 16:20:56 +08:00
12 changed files with 144 additions and 30 deletions

View File

@ -306,7 +306,7 @@ public class Config {
@Override
public void onSuccess(NewSettingsEntity data) {
mNewSettingsEntity = data;
SPUtils.setString(Constants.SP_NEW_SETTINGS, data.toString());
SPUtils.setString(Constants.SP_NEW_SETTINGS, GsonUtils.toJson(data));
}
});
}

View File

@ -1271,7 +1271,7 @@ object DirectUtils {
} else {
Constants.INVITE_FRIENDS_ADDRESS
}
directToFullScreenWebPage(context, url, false)
directToFullScreenWebPage(context, url, true)
}
/**

View File

@ -75,7 +75,7 @@ object BrowserInstallHelper {
if (SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL)) {
false
} else {
!SPUtils.getBoolean(Constants.SP_SHOULD_SHOW_USE_BROWSER_TO_INSTALL_HINT)
SPUtils.getBoolean(Constants.SP_SHOULD_SHOW_USE_BROWSER_TO_INSTALL_HINT, true)
}
} else {
false

View File

@ -18,11 +18,13 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.gh.base.OnListClickListener
import com.gh.common.constant.Constants
import com.gh.common.exposure.ExposureEvent
import com.gh.common.exposure.ExposureManager
import com.gh.common.exposure.ExposureSource
import com.gh.common.util.*
import com.gh.common.view.ExpandTextView
import com.gh.common.view.GridSpacingItemColorDecoration
import com.gh.common.view.divider.HorizontalDividerItemDecoration
import com.gh.common.view.divider.VerticalDividerItemDecoration
import com.gh.gamecenter.GameNewsActivity
import com.gh.gamecenter.R
import com.gh.gamecenter.SuggestionActivity
@ -39,7 +41,6 @@ import com.gh.gamecenter.gamedetail.entity.DetailEntity
import com.gh.gamecenter.gamedetail.entity.NewGameDetailEntity
import com.gh.gamecenter.gamedetail.fuli.kaifu.ServersCalendarActivity
import com.gh.gamecenter.gamedetail.history.HistoryApkListActivity
import com.gh.gamecenter.home.amway.LeftPagerSnapHelper
import com.gh.gamecenter.suggest.SuggestType
import com.lightgame.adapter.BaseRecyclerAdapter
import org.greenrobot.eventbus.EventBus
@ -259,10 +260,23 @@ class DescAdapter(context: Context,
if (subjectEntity != null) {
var subjectAdapter = viewHolder.binding.galleryRv.adapter
if (subjectAdapter == null) {
val exposureEventList = arrayListOf<ExposureEvent>()
for ((index, game) in subjectEntity.data!!.take(4).withIndex()) {
game.sequence = index
val event = ExposureEvent.createEvent(gameEntity = game, source = listOf(
ExposureSource("游戏详情", gameName ?: ""),
ExposureSource("大家都在玩")
))
exposureEventList.add(event)
ExposureManager.log(event)
}
viewHolder.binding.galleryRv.layoutManager = GridLayoutManager(mContext, 4)
subjectAdapter = GameHorizontalAdapter(mContext, subjectEntity, true)
subjectAdapter.gameName = gameName ?: ""
subjectAdapter.entrance = mEntrance
subjectAdapter.exposureEventList = exposureEventList
(viewHolder.binding.galleryRv.itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false
val dividerWidth = (DisplayUtils.getScreenWidth() - 20F.dip2px() * 2 - 64F.dip2px() * 4) / 3
@ -327,6 +341,20 @@ class DescAdapter(context: Context,
.size(DisplayUtils.dip2px(16f))
.color(ContextCompat.getColor(mContext, R.color.white)).build()
addItemDecoration(itemDecoration)
// 曝光相关
relatedVersionAdapter.exposureEventList.clear()
for ((index, simpleGame) in relatedVersion.withIndex()) {
val game = simpleGame.game?.toGameEntity()
game?.sequence = index
val event = ExposureEvent.createEvent(gameEntity = game, source = listOf(
ExposureSource("游戏详情", gameName ?: ""),
ExposureSource("相关游戏")
))
relatedVersionAdapter.exposureEventList.add(event)
ExposureManager.log(event)
}
}
}
viewHolder.binding.titleTv.text = "相关游戏"

View File

@ -6,7 +6,11 @@ import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.RecyclerView
import com.gh.common.util.*
import com.gh.common.exposure.ExposureEvent
import com.gh.common.util.GameViewUtils
import com.gh.common.util.MtaHelper
import com.gh.common.util.StringUtils
import com.gh.common.util.safelyGetInRelease
import com.gh.gamecenter.GameDetailActivity
import com.gh.gamecenter.R
import com.gh.gamecenter.databinding.ItemGameDetailRelatedVersionBinding
@ -15,6 +19,9 @@ import com.gh.gamecenter.entity.GameDetailEntity
class GameRelatedVersionAdapter(val context: Context, val gameName: String, val datas: ArrayList<GameDetailEntity.RelatedVersion>, val mEntrance: String) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
var isExpand = false
private val mShowItemCount: Int = 3
var exposureEventList: ArrayList<ExposureEvent> = arrayListOf()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return if (viewType == RELATED_VERSION_ITEM) {
@ -48,7 +55,7 @@ class GameRelatedVersionAdapter(val context: Context, val gameName: String, val
holder.itemView.setOnClickListener {
MtaHelper.onEvent("游戏详情_新", "相关游戏版本", "${gameName}+${relatedVersion.gameName}")
GameDetailActivity.startGameDetailActivity(context, relatedVersion.gameId,
StringUtils.buildString(mEntrance, "+(", "游戏详情", "[", relatedVersion.gameName, "]:相关游戏[", (position + 1).toString(), "])"))
StringUtils.buildString(mEntrance, "+(", "游戏详情", "[", relatedVersion.gameName, "]:相关游戏[", (position + 1).toString(), "])"), exposureEventList.safelyGetInRelease(position))
}
}
is MoreViewHolder -> {

View File

@ -1,12 +1,19 @@
package com.gh.gamecenter.mygame
import android.content.Context
import android.util.SparseArray
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.gh.common.constant.ItemViewType
import com.gh.common.util.*
import com.gh.common.exposure.ExposureEvent
import com.gh.common.exposure.ExposureSource
import com.gh.common.exposure.IExposable
import com.gh.common.util.DialogUtils
import com.gh.common.util.MtaHelper
import com.gh.common.util.addSelectableItemBackground
import com.gh.common.util.removeSelectableItemBackground
import com.gh.common.view.DrawableView
import com.gh.gamecenter.GameDetailActivity
import com.gh.gamecenter.R
@ -17,9 +24,11 @@ import com.gh.gamecenter.databinding.ItemFollowedGameBinding
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.gamedetail.GameDetailFragment
class MyFollowedGameAdapter(context: Context, var mViewModel: MyFollowedGameViewModel) : ListAdapter<GameEntity>(context) {
class MyFollowedGameAdapter(context: Context, var mViewModel: MyFollowedGameViewModel)
: ListAdapter<GameEntity>(context), IExposable {
private val mEntrance = "(我的关注)"
private val mExposureEventSparseArray: SparseArray<ExposureEvent> = SparseArray()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
@ -61,11 +70,16 @@ class MyFollowedGameAdapter(context: Context, var mViewModel: MyFollowedGameView
executePendingBindings()
}
val exposureEvent = ExposureEvent.createEvent(
gameEntity,
listOf(ExposureSource("我的游戏", "关注")))
mExposureEventSparseArray.append(position, exposureEvent)
itemView.setOnClickListener {
MtaHelper.onEvent("我的光环", path, "点击其他位置")
MtaHelper.onEvent("我的光环", newPath, "点击其他位置")
MtaHelper.onEvent("我的光环_新", path, "点击其他位置")
GameDetailActivity.startGameDetailActivity(mContext, gameEntity.id, mEntrance)
GameDetailActivity.startGameDetailActivity(mContext, gameEntity.id, mEntrance, exposureEvent)
}
}
}
@ -86,6 +100,10 @@ class MyFollowedGameAdapter(context: Context, var mViewModel: MyFollowedGameView
}
}
}
override fun getEventByPosition(pos: Int): ExposureEvent = mExposureEventSparseArray.get(pos)
override fun getEventListByPosition(pos: Int) = null
}
class MyFollowedGameViewHolder(var binding: ItemFollowedGameBinding) : RecyclerView.ViewHolder(binding.root) {

View File

@ -10,6 +10,7 @@ import androidx.recyclerview.widget.RecyclerView
import butterknife.BindView
import butterknife.OnClick
import com.gh.base.OnRequestCallBackListener
import com.gh.common.exposure.ExposureListener
import com.gh.common.util.goneIf
import com.gh.common.util.ifLogin
import com.gh.common.util.viewModelProvider
@ -45,6 +46,7 @@ class MyFollowedGameFragment : ListFragment<GameEntity, MyFollowedGameViewModel>
private lateinit var mViewModel: MyFollowedGameViewModel
private var mRecommendAdapter: MyConcernRecommendAdapter? = null
private var mExposureListener: ExposureListener? = null
@BindView(R.id.reuse_tv_none_data)
lateinit var noDataTv: TextView
@ -69,6 +71,7 @@ class MyFollowedGameFragment : ListFragment<GameEntity, MyFollowedGameViewModel>
// 不需要分页
mListRv.clearOnScrollListeners()
mListRv.addOnScrollListener(mExposureListener!!)
recommendRecyclerView.setHasFixedSize(true)
recommendRecyclerView.layoutManager = GridLayoutManager(context, 4)
@ -134,8 +137,10 @@ class MyFollowedGameFragment : ListFragment<GameEntity, MyFollowedGameViewModel>
}
override fun provideListAdapter(): ListAdapter<GameEntity> {
return mAdapter
?: MyFollowedGameAdapter(requireContext(), mViewModel).apply { mAdapter = this }
return mAdapter ?: MyFollowedGameAdapter(requireContext(), mViewModel).apply {
mAdapter = this
mExposureListener = ExposureListener(this@MyFollowedGameFragment, this)
}
}
@OnClick(R.id.reuse_tv_none_data, R.id.concern_rl_title, R.id.concernManageRl)

View File

@ -5,6 +5,7 @@ import android.os.Build
import android.os.Bundle
import com.gh.base.BaseActivity_TabLayout
import com.gh.common.constant.Constants
import com.gh.common.exposure.ExposureListener
import com.gh.common.runOnIoThread
import com.gh.common.util.SPUtils
import com.gh.common.util.UsageStatsHelper
@ -35,7 +36,10 @@ class MyPlayedGameFragment : PlayedGameFragment() {
override fun provideListAdapter(): ListAdapter<GameEntity> {
return mAdapter
?: PlayedGameAdapter(requireContext(), mViewModel, true).apply { mAdapter = this }
?: PlayedGameAdapter(requireContext(), mViewModel, true).apply {
mAdapter = this
mExposureListener = ExposureListener(this@MyPlayedGameFragment, this)
}
}
override fun onChanged(ts: MutableList<GameEntity>?) {

View File

@ -1,12 +1,14 @@
package com.gh.gamecenter.mygame
import android.content.Context
import android.view.Gravity
import android.view.View
import android.util.SparseArray
import android.view.ViewGroup
import android.widget.LinearLayout
import androidx.recyclerview.widget.RecyclerView
import com.gh.common.constant.ItemViewType
import com.gh.common.exposure.ExposureEvent
import com.gh.common.exposure.ExposureSource
import com.gh.common.exposure.IExposable
import com.gh.common.util.*
import com.gh.gamecenter.GameDetailActivity
import com.gh.gamecenter.R
@ -18,11 +20,13 @@ import com.gh.gamecenter.databinding.ItemFollowedGameBinding
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.eventbus.EBDownloadStatus
import com.gh.gamecenter.game.GameAndPosition
import java.util.ArrayList
import java.util.*
class MyReservationAdapter(context: Context, var mViewModel: MyReservationViewModel) : ListAdapter<GameEntity>(context) {
class MyReservationAdapter(context: Context, var mViewModel: MyReservationViewModel)
: ListAdapter<GameEntity>(context), IExposable {
private val mEntrance = "(我的预约)"
private val mExposureEventSparseArray: SparseArray<ExposureEvent> = SparseArray()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
@ -59,13 +63,18 @@ class MyReservationAdapter(context: Context, var mViewModel: MyReservationViewMo
holder.initShortcut(gameEntity, mEntrance, path, newPath)
holder.binding.executePendingBindings()
val exposureEvent = ExposureEvent.createEvent(
gameEntity,
listOf(ExposureSource("我的游戏", "预约")))
mExposureEventSparseArray.append(position, exposureEvent)
DownloadItemUtils.updateItemWithReserveStatus(GameViewHolder(holder.binding.gameItemIncluded), gameEntity)
holder.itemView.setOnClickListener {
MtaHelper.onEvent("我的光环", path, "点击其他位置")
MtaHelper.onEvent("我的光环", newPath, "点击其他位置")
MtaHelper.onEvent("我的光环_新", path, "点击其他位置")
GameDetailActivity.startGameDetailActivity(mContext, gameEntity.id, mEntrance)
GameDetailActivity.startGameDetailActivity(mContext, gameEntity.id, mEntrance, exposureEvent)
}
if ("appointment" == gameEntity.reserveStatus) {
@ -145,4 +154,8 @@ class MyReservationAdapter(context: Context, var mViewModel: MyReservationViewMo
})
}
override fun getEventByPosition(pos: Int): ExposureEvent = mExposureEventSparseArray.get(pos)
override fun getEventListByPosition(pos: Int) = null
}

View File

@ -1,11 +1,13 @@
package com.gh.gamecenter.mygame
import android.os.Bundle
import android.text.TextUtils
import android.view.View
import android.widget.TextView
import androidx.core.content.ContextCompat
import butterknife.BindView
import butterknife.OnClick
import com.gh.common.exposure.ExposureListener
import com.gh.common.util.ifLogin
import com.gh.common.util.viewModelProvider
import com.gh.download.DownloadManager
@ -16,26 +18,25 @@ import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.eventbus.EBDownloadStatus
import com.gh.gamecenter.eventbus.EBPackage
import com.gh.gamecenter.eventbus.EBReuse
import com.gh.gamecenter.game.GameAndPosition
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.personal.PersonalFragment
import com.lightgame.download.DataWatcher
import com.lightgame.download.DownloadEntity
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import java.util.ArrayList
class MyReservationFragment : ListFragment<GameEntity, MyReservationViewModel>() {
private var mAdapter: MyReservationAdapter? = null
private lateinit var mViewModel: MyReservationViewModel
private var mExposureListener: ExposureListener? = null
@BindView(R.id.reuse_tv_none_data)
lateinit var noDataTv: TextView
private val dataWatcher = object : DataWatcher() {
override fun onDataChanged(downloadEntity: DownloadEntity) {
val data = mAdapter?.getGameEntityByPackage(downloadEntity.packageName)?: arrayListOf()
val data = mAdapter?.getGameEntityByPackage(downloadEntity.packageName) ?: arrayListOf()
for (gameAndPosition in data) {
if (gameAndPosition.entity != null && gameAndPosition.entity.name == downloadEntity.name) {
val entryMap = gameAndPosition.entity.getEntryMap()
@ -46,6 +47,12 @@ class MyReservationFragment : ListFragment<GameEntity, MyReservationViewModel>()
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mListRv.addOnScrollListener(mExposureListener!!)
}
override fun onStart() {
super.onStart()
if (TextUtils.isEmpty(UserManager.getInstance().userId)) {
@ -68,8 +75,10 @@ class MyReservationFragment : ListFragment<GameEntity, MyReservationViewModel>()
}
override fun provideListAdapter(): ListAdapter<GameEntity> {
return mAdapter
?: MyReservationAdapter(requireContext(), mViewModel).apply { mAdapter = this }
return mAdapter ?: MyReservationAdapter(requireContext(), mViewModel).apply {
mAdapter = this
mExposureListener = ExposureListener(this@MyReservationFragment, this)
}
}
override fun provideListViewModel(): MyReservationViewModel {
@ -107,7 +116,7 @@ class MyReservationFragment : ListFragment<GameEntity, MyReservationViewModel>()
//下载被删除事件
@Subscribe(threadMode = ThreadMode.MAIN)
fun onEventMainThread(status: EBDownloadStatus) {
if ( "delete" == status.status) {
if ("delete" == status.status) {
mAdapter?.notifyItemAndRemoveDownload(status)
}
}

View File

@ -7,6 +7,7 @@ import android.text.Spanned
import android.text.TextPaint
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.util.SparseArray
import android.util.TypedValue
import android.view.Gravity
import android.view.LayoutInflater
@ -17,6 +18,9 @@ import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.gh.common.constant.ItemViewType
import com.gh.common.exposure.ExposureEvent
import com.gh.common.exposure.ExposureSource
import com.gh.common.exposure.IExposable
import com.gh.common.util.*
import com.gh.common.view.BugFixedPopupWindow
import com.gh.common.view.DrawableView
@ -35,10 +39,11 @@ import com.lightgame.download.DownloadEntity
open class PlayedGameAdapter(context: Context,
private val mViewModel: PlayedGameViewModel,
private val mIsMyPlayedGame: Boolean)
: ListAdapter<GameEntity>(context) {
: ListAdapter<GameEntity>(context), IExposable {
private val mPositionAndPackageMap = HashMap<String, Int>()
private val mEntrance = if (mIsMyPlayedGame) "我的玩过" else "玩过的游戏"
private val mExposureEventSparseArray: SparseArray<ExposureEvent> = SparseArray()
override fun setListData(updateData: MutableList<GameEntity>?) {
if (!updateData.isNullOrEmpty()) {
@ -110,13 +115,20 @@ open class PlayedGameAdapter(context: Context,
holder.binding.gameItemIncluded.labelList.addView(runTimeView)
val exposureSourceKey = if (mIsMyPlayedGame) "我的游戏" else "玩过的游戏"
val exposureSourceValue = if (mIsMyPlayedGame) "玩过" else ""
val exposureEvent = ExposureEvent.createEvent(
gameEntity,
listOf(ExposureSource(exposureSourceKey, exposureSourceValue)))
mExposureEventSparseArray.append(position, exposureEvent)
DownloadItemUtils.setOnClickListener(mContext,
holder.binding.gameItemIncluded.downloadBtn,
gameEntity,
position,
this,
"(${mEntrance})",
StringUtils.buildString(mEntrance, ":", gameEntity.name))
StringUtils.buildString(mEntrance, ":", gameEntity.name), exposureEvent)
DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding.gameItemIncluded), true, true)
holder.binding.optionsContainer.goneIf(!mIsMyPlayedGame)
@ -125,7 +137,7 @@ open class PlayedGameAdapter(context: Context,
}
holder.itemView.setOnClickListener {
GameDetailActivity.startGameDetailActivity(mContext, gameEntity.id, "(${mEntrance})")
GameDetailActivity.startGameDetailActivity(mContext, gameEntity.id, "(${mEntrance})", exposureEvent)
}
val downloadBtnText = holder.binding.gameItemIncluded.downloadBtn.text
@ -283,4 +295,8 @@ open class PlayedGameAdapter(context: Context,
mPositionAndPackageMap.clear()
}
override fun getEventByPosition(pos: Int): ExposureEvent = mExposureEventSparseArray.get(pos)
override fun getEventListByPosition(pos: Int) = null
}

View File

@ -1,7 +1,10 @@
package com.gh.gamecenter.mygame
import android.os.Bundle
import android.view.View
import android.widget.TextView
import butterknife.BindView
import com.gh.common.exposure.ExposureListener
import com.gh.common.util.EntranceUtils
import com.gh.common.util.viewModelProvider
import com.gh.download.DownloadManager
@ -25,6 +28,8 @@ open class PlayedGameFragment : ListFragment<GameEntity, PlayedGameViewModel>()
protected var mAdapter: PlayedGameAdapter? = null
protected lateinit var mViewModel: PlayedGameViewModel
protected var mExposureListener: ExposureListener? = null
@BindView(R.id.reuse_tv_none_data)
lateinit var noDataTv: TextView
@ -34,6 +39,12 @@ open class PlayedGameFragment : ListFragment<GameEntity, PlayedGameViewModel>()
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mListRv.addOnScrollListener(mExposureListener!!)
}
override fun onResume() {
if (isEverPause && mAdapter != null) mAdapter?.notifyDataSetChanged()
super.onResume()
@ -46,14 +57,17 @@ open class PlayedGameFragment : ListFragment<GameEntity, PlayedGameViewModel>()
}
override fun provideListViewModel(): PlayedGameViewModel {
val userId = arguments?.getString(EntranceUtils.KEY_USER_ID) ?: UserManager.getInstance().userId
val userId = arguments?.getString(EntranceUtils.KEY_USER_ID)
?: UserManager.getInstance().userId
mViewModel = viewModelProvider(PlayedGameViewModel.Factory(HaloApp.getInstance().application, userId))
return mViewModel
}
override fun provideListAdapter(): ListAdapter<GameEntity> {
return mAdapter
?: PlayedGameAdapter(requireContext(), mViewModel, false).apply { mAdapter = this }
return mAdapter ?: PlayedGameAdapter(requireContext(), mViewModel, false).apply {
mAdapter = this
mExposureListener = ExposureListener(this@PlayedGameFragment, this)
}
}
@Subscribe(threadMode = ThreadMode.MAIN)