Compare commits
4 Commits
fix/system
...
feat/GHZSC
| Author | SHA1 | Date | |
|---|---|---|---|
| 0c1d1d72f2 | |||
| a5039ba682 | |||
| 43d92cf037 | |||
| bd0eb7eafd |
@ -2,6 +2,7 @@
|
||||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android' // kotlin
|
||||
apply plugin: 'kotlin-parcelize'
|
||||
apply plugin: 'com.google.devtools.ksp'
|
||||
apply plugin: 'kotlin-kapt'
|
||||
|
||||
import groovy.xml.XmlUtil
|
||||
@ -121,10 +122,9 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
kapt {
|
||||
arguments {
|
||||
arg("AROUTER_MODULE_NAME", project.name)
|
||||
}
|
||||
ksp {
|
||||
arg("AROUTER_MODULE_NAME", project.getName())
|
||||
arg("AROUTER_GENERATE_DOC", "enable")
|
||||
}
|
||||
|
||||
packagingOptions {
|
||||
@ -376,7 +376,7 @@ dependencies {
|
||||
implementation "androidx.annotation:annotation:${annotation}"
|
||||
|
||||
implementation "androidx.viewpager2:viewpager2:${viewpager2}"
|
||||
kapt "androidx.room:room-compiler:${room}"
|
||||
ksp("androidx.room:room-compiler:${room}")
|
||||
|
||||
implementation "com.tencent.vasdolly:helper:${apkChannelPackage}"
|
||||
implementation "com.tencent.vasdolly:writer:${apkChannelPackage}"
|
||||
@ -426,7 +426,8 @@ dependencies {
|
||||
|
||||
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:${desugarJdkLibs}"
|
||||
|
||||
kapt "com.alibaba:arouter-compiler:$arouterVersion"
|
||||
kapt "com.google.auto.service:auto-service:${autoServiceVersion}"
|
||||
ksp("com.github.JailedBird:ArouterKspCompiler:${arouterKspCompilerVersion}")
|
||||
|
||||
implementation project(':ndownload')
|
||||
implementation project(':vspace-bridge:vspace')
|
||||
|
||||
@ -638,7 +638,7 @@
|
||||
<!-- android:theme="@android:style/Theme.Translucent" />-->
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.SkipActivity"
|
||||
android:name="com.gh.gamecenter.SkipCompatActivity"
|
||||
android:exported="true"
|
||||
android:theme="@style/Theme.AppCompat.Light.Fullscreen.Transparent">
|
||||
<intent-filter>
|
||||
|
||||
@ -256,7 +256,7 @@ class DefaultJsApi(
|
||||
|
||||
@JavascriptInterface
|
||||
fun isInstalled(event: Any): String {
|
||||
val localInstalledPackageList = PackageHelper.getInstalledPackageNameList(HaloApp.getInstance().application, 0)
|
||||
val localInstalledPackageList = PackageUtils.getAllPackageName(HaloApp.getInstance().application)
|
||||
val packageNameList: ArrayList<String> = event.toString().toObject() ?: ArrayList()
|
||||
|
||||
for (packageName in packageNameList) {
|
||||
@ -555,7 +555,7 @@ class DefaultJsApi(
|
||||
|
||||
@JavascriptInterface
|
||||
fun getInstallStatus(event: Any): String {
|
||||
val localInstalledPackageList = PackageHelper.getInstalledPackageNameList(HaloApp.getInstance().application, 0)
|
||||
val localInstalledPackageList = PackageUtils.getAllPackageName(HaloApp.getInstance().application)
|
||||
val packageNameList: ArrayList<String> = event.toString().toObject() ?: ArrayList()
|
||||
val installStatusMap: HashMap<String, Boolean> = hashMapOf()
|
||||
|
||||
|
||||
@ -15,6 +15,7 @@ import com.gh.common.util.DirectUtils.directToLegacyVideoDetail
|
||||
import com.gh.common.util.DirectUtils.directToLinkPage
|
||||
import com.gh.common.util.DirectUtils.directToQa
|
||||
import com.gh.common.util.PackageUtils
|
||||
import com.gh.gamecenter.SkipCompatActivity
|
||||
import com.gh.gamecenter.WebActivity
|
||||
import com.gh.gamecenter.common.constant.Constants
|
||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
||||
@ -66,6 +67,10 @@ object DefaultUrlHandler {
|
||||
bringAppToFront: Boolean = false,
|
||||
sourceEntrance: String = ""): Boolean {
|
||||
val uri = Uri.parse(url)
|
||||
|
||||
// 优先交给新的路由拦截处理
|
||||
if (SkipCompatActivity.handleSkip(context, uri)) return true
|
||||
|
||||
if ("ghzhushou" == uri.scheme) {
|
||||
Utils.log("url = $url")
|
||||
Utils.log("url = " + uri.scheme!!)
|
||||
|
||||
@ -103,7 +103,6 @@ class AccelerateNotificationHandler(priority: Int) : PriorityChainHandler(priori
|
||||
context = activity,
|
||||
gameId = gameEntity.id,
|
||||
entrance = "首页插件上架弹窗",
|
||||
defaultTab = -1,
|
||||
isSkipGameComment = false,
|
||||
scrollToLibao = false,
|
||||
openVideoStreaming = false,
|
||||
|
||||
@ -54,7 +54,6 @@ class GameDetailProviderImpl : IGameDetailProvider {
|
||||
context: Context,
|
||||
gameId: String,
|
||||
entrance: String?,
|
||||
defaultTab: Int,
|
||||
isSkipGameComment: Boolean,
|
||||
scrollToLibao: Boolean,
|
||||
openVideoStreaming: Boolean,
|
||||
@ -65,7 +64,6 @@ class GameDetailProviderImpl : IGameDetailProvider {
|
||||
context,
|
||||
gameId,
|
||||
entrance,
|
||||
defaultTab,
|
||||
isSkipGameComment,
|
||||
scrollToLibao,
|
||||
openVideoStreaming,
|
||||
|
||||
@ -9,7 +9,7 @@ import com.gh.gamecenter.core.provider.IPackageHelperProvider
|
||||
@Route(path = RouteConsts.provider.packageHelper, name = "PackageHelper暴露服务")
|
||||
class PackageHelperProviderImpl : IPackageHelperProvider {
|
||||
|
||||
override fun getLocalPackageNameSet(): Set<String> {
|
||||
override fun getLocalPackageNameSet(): HashSet<String> {
|
||||
return PackageHelper.localPackageNameSet
|
||||
}
|
||||
|
||||
|
||||
@ -56,7 +56,6 @@ import com.gh.gamecenter.gamecollection.detail.GameCollectionDetailActivity
|
||||
import com.gh.gamecenter.gamecollection.hotlist.GameCollectionHotListActivity
|
||||
import com.gh.gamecenter.gamecollection.hotlist.GameCollectionListDetailActivity
|
||||
import com.gh.gamecenter.gamecollection.square.GameCollectionSquareActivity
|
||||
import com.gh.gamecenter.gamedetail.GameDetailFragment
|
||||
import com.gh.gamecenter.gamedetail.fuli.kaifu.ServersCalendarActivity
|
||||
import com.gh.gamecenter.gamedetail.fuli.kaifu.ServersCalendarManagementActivity
|
||||
import com.gh.gamecenter.gamedetail.fuli.kaifu.ServersSubscribedGameListActivity
|
||||
@ -69,7 +68,6 @@ import com.gh.gamecenter.minigame.MiniGameRecentlyPlayUseCase
|
||||
import com.gh.gamecenter.minigame.MiniGameSearchActivity
|
||||
import com.gh.gamecenter.minigame.qq.QGameHomeWrapperActivity
|
||||
import com.gh.gamecenter.newsdetail.NewsDetailActivity
|
||||
import com.gh.gamecenter.personalhome.UserHomeActivity
|
||||
import com.gh.gamecenter.personalhome.background.PersonalityBackgroundActivity
|
||||
import com.gh.gamecenter.personalhome.border.AvatarBorderActivity
|
||||
import com.gh.gamecenter.personalhome.home.UserHistoryViewModel
|
||||
@ -718,7 +716,7 @@ object DirectUtils {
|
||||
*/
|
||||
@JvmStatic
|
||||
fun directToHomeActivity(context: Context, userId: String?, entrance: String? = null, path: String? = null) {
|
||||
context.startActivity(UserHomeActivity.getIntent(context, userId ?: "", entrance, path))
|
||||
directToHomeActivity(context, userId, entrance, path, 0)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
@ -757,17 +755,20 @@ object DirectUtils {
|
||||
entrance: String? = null,
|
||||
path: String? = null
|
||||
) {
|
||||
|
||||
IntegralLogHelper.log("view_homepage", "个人主页")
|
||||
val bundle = Bundle()
|
||||
bundle.putString(KEY_USER_ID, userId)
|
||||
bundle.putString(KEY_TO, UserHomeActivity::class.java.name)
|
||||
bundle.putString(KEY_ENTRANCE, BaseActivity.mergeEntranceAndPath(entrance, path))
|
||||
bundle.putString(KEY_PATH, path)
|
||||
bundle.putString(KEY_TYPE, UserHistoryViewModel.TYPE.fromValue(type).value)
|
||||
bundle.putString(KEY_GAME, gameType)
|
||||
bundle.putInt(KEY_POSITION, position ?: 0)
|
||||
jumpActivity(context, bundle)
|
||||
|
||||
val uri = Uri.Builder()
|
||||
.path(RouteConsts.activity.userHomeActivity)
|
||||
.appendQueryParameter(KEY_USER_ID, userId)
|
||||
.appendQueryParameter(KEY_TAB_INDEX, position.toString())
|
||||
.appendQueryParameter(KEY_PATH, BaseActivity.mergeEntranceAndPath(entrance, path))
|
||||
.appendQueryParameter(KEY_COMMUNITY_TYPE, UserHistoryViewModel.TYPE.fromValue(type).value)
|
||||
.appendQueryParameter(KEY_GAME_TYPE, gameType)
|
||||
.build()
|
||||
|
||||
ARouter.getInstance()
|
||||
.build(uri)
|
||||
.navigation(context)
|
||||
}
|
||||
|
||||
|
||||
@ -799,10 +800,10 @@ object DirectUtils {
|
||||
bundle.putString(KEY_GAMEID, id)
|
||||
if (!TextUtils.isEmpty(tab)) {
|
||||
when (tab) {
|
||||
"comment" -> bundle.putString(KEY_TARGET, GameDetailFragment.TAB_RATING)
|
||||
"desc" -> bundle.putString(KEY_TARGET, GameDetailFragment.TAB_DESC)
|
||||
"forum" -> bundle.putString(KEY_TARGET, GameDetailFragment.TAB_BBS)
|
||||
"zone" -> bundle.putString(KEY_TARGET, GameDetailFragment.TAB_TRENDS)
|
||||
"comment" -> bundle.putString(KEY_TARGET, EntranceConsts.TAB_TYPE_RATING)
|
||||
"desc" -> bundle.putString(KEY_TARGET, EntranceConsts.TAB_TYPE_DESC)
|
||||
"forum" -> bundle.putString(KEY_TARGET, EntranceConsts.TAB_TYPE_BBS)
|
||||
"zone" -> bundle.putString(KEY_TARGET, EntranceConsts.TAB_TYPE_TRENDS)
|
||||
}
|
||||
}
|
||||
if (traceEvent != null) {
|
||||
@ -847,7 +848,7 @@ object DirectUtils {
|
||||
bundle.putString(KEY_ENTRANCE, entrance)
|
||||
bundle.putString(KEY_GAMEID, id)
|
||||
bundle.putBoolean(KEY_OPEN_VIDEO_STREAMING, true)
|
||||
bundle.putString(KEY_TARGET, GameDetailFragment.TAB_DESC)
|
||||
bundle.putString(KEY_TARGET, EntranceConsts.TAB_TYPE_DESC)
|
||||
jumpActivity(context, bundle)
|
||||
}
|
||||
|
||||
@ -855,7 +856,7 @@ object DirectUtils {
|
||||
fun directToGameDetail(
|
||||
context: Context,
|
||||
id: String,
|
||||
defaultTab: String = GameDetailFragment.TAB_DESC,
|
||||
defaultTab: String = EntranceConsts.TAB_TYPE_DESC,
|
||||
entrance: String? = null
|
||||
) {
|
||||
val bundle = Bundle()
|
||||
@ -1513,7 +1514,7 @@ object DirectUtils {
|
||||
response?.apply {
|
||||
if (zone.status == "on") {
|
||||
if (zone.style == "link") {
|
||||
directToGameDetail(context, gameId, GameDetailFragment.TAB_TRENDS, entrance)
|
||||
directToGameDetail(context, gameId, EntranceConsts.TAB_TYPE_TRENDS, entrance)
|
||||
} else {
|
||||
directToWebView(context, url, entrance)
|
||||
}
|
||||
@ -2032,8 +2033,14 @@ object DirectUtils {
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun directToMessageCenter(defaultTabIndex: Int) {
|
||||
ARouter.getInstance().build(RouteConsts.activity.messageWrapperActivity)
|
||||
fun directToMessageCenter(defaultTabIndex: Int, source: String) {
|
||||
val uri = Uri.Builder()
|
||||
.path(RouteConsts.activity.messageWrapperActivity)
|
||||
.appendQueryParameter(RouteConsts.QueryParams.REQUIRE_LOGIN, "true")
|
||||
.appendQueryParameter(RouteConsts.QueryParams.SOURCE, source)
|
||||
.build()
|
||||
|
||||
ARouter.getInstance().build(uri)
|
||||
.withInt(BaseActivity_TabLayout.PAGE_INDEX, defaultTabIndex)
|
||||
.navigation()
|
||||
}
|
||||
|
||||
@ -65,7 +65,7 @@ public class InstallUtils {
|
||||
if (!TextUtils.isEmpty(installVersion) && downloadEntity != null &&
|
||||
installVersion.equals(downloadEntity.getVersionName())) {
|
||||
if (!downloadEntity.isPluggable() || PackageUtils.isSignedByGh(context, packageName)) {
|
||||
EventBus.getDefault().post(new EBPackage(EBPackage.TYPE_INSTALLED, packageName, installVersion, false));
|
||||
EventBus.getDefault().post(new EBPackage(EBPackage.TYPE_INSTALLED, packageName, installVersion));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -82,7 +82,7 @@ public class InstallUtils {
|
||||
keys.add(packageName);
|
||||
} else if (!list.contains(packageName)) {
|
||||
keys.add(packageName);
|
||||
EventBus.getDefault().post(new EBPackage("卸载", packageName, "", false));
|
||||
EventBus.getDefault().post(new EBPackage("卸载", packageName, ""));
|
||||
}
|
||||
}
|
||||
for (String key : keys) {
|
||||
|
||||
@ -105,9 +105,14 @@ object PackageHelper {
|
||||
get() = _installedPackageApiSwitchStatusLiveData
|
||||
|
||||
// 本地已安装包的列表
|
||||
var localPackageNameSet = setOf<String>()
|
||||
var localPackageNameSet = hashSetOf<String>()
|
||||
get() {
|
||||
return HashSet(cachedInstalledPackageNameList)
|
||||
return if (field.isEmpty()) {
|
||||
field = getAllPackageName(HaloApp.getInstance().application)
|
||||
field
|
||||
} else {
|
||||
field
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -456,10 +461,9 @@ object PackageHelper {
|
||||
* 进行包名初始化相关的操作
|
||||
*/
|
||||
fun initPackageRelatedData() {
|
||||
PackageRepository.initData {
|
||||
refreshLocalPackageList()
|
||||
refreshPackageNameList()
|
||||
}
|
||||
PackageRepository.initData()
|
||||
refreshLocalPackageList()
|
||||
refreshPackageNameList()
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -577,7 +577,8 @@ public class PackageUtils {
|
||||
}
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
boolean isInstalled = PackageHelper.INSTANCE.getLocalPackageNameSet().contains(packageName);
|
||||
ArrayList<String> allPackageName = getAllPackageName(context);
|
||||
boolean isInstalled = allPackageName.contains(packageName);
|
||||
|
||||
if (isInstalled) {
|
||||
// 能进这里说明上面的 try {} 结果有问题,记录一下
|
||||
@ -702,6 +703,25 @@ public class PackageUtils {
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* 获取所有已安装的软件的包名(包括系统应用)
|
||||
*/
|
||||
public static ArrayList<String> getAllPackageName(Context context) {
|
||||
ArrayList<String> list = new ArrayList<>();
|
||||
List<String> packageNameList = PackageHelper.INSTANCE.getInstalledPackageNameList(context, 0);
|
||||
for (String packageName : packageNameList) {
|
||||
if (!context.getPackageName().equals(packageName)) {
|
||||
list.add(packageName);
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public static ArrayList<String> getAllPackageNameIncludeGh(Context context) {
|
||||
List<String> packageNameList = PackageHelper.INSTANCE.getInstalledPackageNameList(context, 0);
|
||||
return new ArrayList<>(packageNameList);
|
||||
}
|
||||
|
||||
public static JSONArray getAppList(Context context) {
|
||||
JSONArray jsonArray = new JSONArray();
|
||||
try {
|
||||
|
||||
@ -46,7 +46,7 @@ object RecommendPopupHelper {
|
||||
//判断是否符合包名限制
|
||||
val nameRule = entity.recommendPackage.nameRule
|
||||
val packages = entity.recommendPackage.details
|
||||
val installedPackages = PackageHelper.getInstalledPackageNameList(HaloApp.getInstance(), 0)
|
||||
val installedPackages = PackageUtils.getAllPackageNameIncludeGh(HaloApp.getInstance())
|
||||
var isMatchSuccess = true
|
||||
val checkInstalled: (splitPackages: List<String>) -> Boolean = {
|
||||
var isInstalled = false
|
||||
|
||||
@ -124,12 +124,11 @@ object UsageStatsHelper {
|
||||
&& curEvent.className == nextEvent.className
|
||||
) {
|
||||
val diff = nextEvent.timeStamp - curEvent.timeStamp
|
||||
val packageName = curEvent.packageName ?: continue
|
||||
|
||||
if (pakAndTime[packageName] == null) {
|
||||
pakAndTime[packageName] = diff
|
||||
if (pakAndTime[curEvent.packageName] == null) {
|
||||
pakAndTime[curEvent.packageName] = diff
|
||||
} else {
|
||||
pakAndTime[packageName] = pakAndTime[packageName]!! + diff
|
||||
pakAndTime[curEvent.packageName] = pakAndTime[curEvent.packageName]!! + diff
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,7 +3,6 @@ package com.gh.download.dialog
|
||||
import android.app.Application
|
||||
import androidx.lifecycle.*
|
||||
import com.gh.common.constant.Config
|
||||
import com.gh.common.util.PackageHelper
|
||||
import com.gh.common.util.PackageUtils
|
||||
import com.gh.download.DownloadManager
|
||||
import com.gh.gamecenter.feature.entity.ApkEntity
|
||||
@ -35,7 +34,7 @@ class DownloadViewModel(application: Application, val gameEntity: GameEntity) :
|
||||
private var mAllApkList: MutableList<ApkEntity> = ArrayList()
|
||||
private var mInstalledApkList: MutableList<ApkEntity> = ArrayList()
|
||||
private var mOtherApkList: MutableList<ApkEntity> = ArrayList()
|
||||
private var allPackageName: List<String>? = null
|
||||
private var allPackageName: ArrayList<String>? = null
|
||||
var otherSectionPosition = -1
|
||||
|
||||
init {
|
||||
@ -48,7 +47,7 @@ class DownloadViewModel(application: Application, val gameEntity: GameEntity) :
|
||||
}
|
||||
|
||||
fun getAllPackageName() {
|
||||
allPackageName = PackageHelper.getInstalledPackageNameList(HaloApp.getInstance(), 0)
|
||||
allPackageName = PackageUtils.getAllPackageName(HaloApp.getInstance())
|
||||
}
|
||||
|
||||
fun initListData() {
|
||||
|
||||
@ -6,7 +6,7 @@ import android.util.Base64
|
||||
import com.gh.common.constant.Config
|
||||
import com.gh.common.util.DirectUtils
|
||||
import com.gh.common.util.LogUtils
|
||||
import com.gh.common.util.PackageHelper
|
||||
import com.gh.common.util.PackageUtils
|
||||
import com.gh.gamecenter.ShellActivity
|
||||
import com.gh.gamecenter.common.constant.Constants
|
||||
import com.gh.gamecenter.common.entity.ExposureEntity
|
||||
@ -28,6 +28,7 @@ import org.json.JSONObject
|
||||
import java.io.File
|
||||
import java.net.URLEncoder
|
||||
import java.util.*
|
||||
import kotlin.collections.ArrayList
|
||||
|
||||
object BrowserInstallHelper {
|
||||
|
||||
@ -39,7 +40,7 @@ object BrowserInstallHelper {
|
||||
private val mContext by lazy { HaloApp.getInstance().application }
|
||||
private var mUseReservePort = false
|
||||
|
||||
private var mValidInstalledPackageList: List<String> = listOf()
|
||||
private var mValidInstalledPackageList: ArrayList<String> = arrayListOf()
|
||||
private var mValidConditionMatchedCache: Boolean? = null
|
||||
|
||||
private fun getServer(port: Int): DownloadServer {
|
||||
@ -53,14 +54,14 @@ object BrowserInstallHelper {
|
||||
return server
|
||||
}
|
||||
|
||||
private fun getAllInstalledPackageList(): List<String> {
|
||||
private fun getAllInstalledPackageList(): ArrayList<String> {
|
||||
when {
|
||||
mValidInstalledPackageList.isNotEmpty() -> {
|
||||
return mValidInstalledPackageList
|
||||
}
|
||||
|
||||
else -> {
|
||||
val allInstalledPackageList = PackageHelper.getInstalledPackageNameList(mContext, 0)
|
||||
val allInstalledPackageList = PackageUtils.getAllPackageName(mContext)
|
||||
|
||||
if (allInstalledPackageList.isNotEmpty()) {
|
||||
mValidInstalledPackageList = allInstalledPackageList
|
||||
|
||||
@ -5,12 +5,17 @@ import android.content.ContextWrapper
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import com.alibaba.android.arouter.facade.annotation.Autowired
|
||||
import com.alibaba.android.arouter.facade.annotation.Route
|
||||
import com.alibaba.android.arouter.launcher.ARouter
|
||||
import com.gh.base.DownloadToolbarActivity
|
||||
import com.gh.common.exposure.ExposureManager.log
|
||||
import com.gh.common.exposure.ExposureManager
|
||||
import com.gh.common.exposure.ExposureTraceUtils.appendTrace
|
||||
import com.gh.gamecenter.common.base.GlobalActivityManager
|
||||
import com.gh.gamecenter.common.constant.Constants
|
||||
import com.gh.gamecenter.common.base.activity.ToolBarActivity.NORMAL_FRAGMENT_BUNDLE
|
||||
import com.gh.gamecenter.common.base.activity.ToolBarActivity.NORMAL_FRAGMENT_NAME
|
||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
||||
import com.gh.gamecenter.common.constant.RouteConsts
|
||||
import com.gh.gamecenter.common.utils.toArrayList
|
||||
import com.gh.gamecenter.core.utils.DisplayUtils
|
||||
import com.gh.gamecenter.entity.GamePlatform
|
||||
@ -20,15 +25,54 @@ import com.gh.gamecenter.feature.exposure.ExposureEvent
|
||||
import com.gh.gamecenter.feature.exposure.ExposureEvent.Companion.createEvent
|
||||
import com.gh.gamecenter.feature.exposure.ExposureType
|
||||
import com.gh.gamecenter.gamedetail.GameDetailFragment
|
||||
import com.halo.assistant.HaloApp
|
||||
|
||||
/**
|
||||
* Created by khy on 2017/3/24.
|
||||
* 游戏详情页
|
||||
*/
|
||||
@Route(
|
||||
path = RouteConsts.activity.gameDetailActivity,
|
||||
name = "游戏详情页"
|
||||
)
|
||||
class GameDetailActivity : DownloadToolbarActivity() {
|
||||
|
||||
@JvmField
|
||||
@Autowired(name = EntranceConsts.KEY_GAME_ID, desc = "游戏 id", required = true)
|
||||
var gameId: String? = null
|
||||
|
||||
@JvmField
|
||||
@Autowired(name = EntranceConsts.KEY_GAME_ENTITY, desc = "游戏摘要实体,如果你不懂这个是什么,那么不要用它,直接传入游戏 id 即可")
|
||||
var gameEntity: GameEntity? = null
|
||||
|
||||
@JvmField
|
||||
@Autowired(name = EntranceConsts.KEY_ENTRANCE, desc = "入口埋点字段(开发内部使用)")
|
||||
var entrance: String? = ""
|
||||
|
||||
@JvmField
|
||||
@Autowired(name = EntranceConsts.KEY_DEFAULT_TAB, desc = "默认选中 tab 的类型(目前可选的有五个类型 `详情`, `专区`,`云存档`,`评价`,`论坛`),首次进入匹配并切换至对应 tab")
|
||||
var defaultTab: String = ""
|
||||
|
||||
@JvmField
|
||||
@Autowired(name = EntranceConsts.KEY_COMMENT_AS_DEFAULT_TAB, desc = "跳转到评论 tab,首次进入直接跳转到评论 tab")
|
||||
var commentAsDefaultTab: Boolean = false
|
||||
|
||||
@JvmField
|
||||
@Autowired(name = EntranceConsts.KEY_SCROLL_TO_LIBAO, desc = "滚动到礼包区域,首次进入滚动到礼包区域")
|
||||
var scrollToLibao: Boolean = false
|
||||
|
||||
@JvmField
|
||||
@Autowired(name = EntranceConsts.KEY_SCROLL_TO_SERVER, desc = "滚动到开服表区域,首次进入滚动到开服表区域")
|
||||
var scrollToServer: Boolean = false
|
||||
|
||||
@JvmField
|
||||
@Autowired(name = EntranceConsts.KEY_OPEN_VIDEO_STREAMING, desc = "打开视频流,首次进入打开视频流")
|
||||
var openVideoStreaming: Boolean = false
|
||||
|
||||
@JvmField
|
||||
@Autowired(name = EntranceConsts.KEY_OPEN_PLATFORM_WINDOW, desc = "打开多版本窗口,首次进入打开多版本窗口")
|
||||
var openPlatformWindow: Boolean = false
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
ARouter.getInstance().inject(this)
|
||||
|
||||
generateDataFromRoute()
|
||||
|
||||
super.onCreate(savedInstanceState)
|
||||
DisplayUtils.transparentStatusBar(this)
|
||||
}
|
||||
@ -37,37 +81,21 @@ class GameDetailActivity : DownloadToolbarActivity() {
|
||||
return getTargetIntent(this, GameDetailActivity::class.java, GameDetailFragment::class.java)
|
||||
}
|
||||
|
||||
override fun getLayoutId(): Int {
|
||||
return R.layout.activity_game_detail
|
||||
}
|
||||
override fun getLayoutId() = R.layout.activity_game_detail
|
||||
|
||||
override fun showToolbarAtLeft(): Boolean {
|
||||
return true
|
||||
}
|
||||
override fun showToolbarAtLeft() = true
|
||||
override fun showDownloadMenu() = true
|
||||
|
||||
override fun showDownloadMenu(): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
HaloApp.remove(Constants.GAME_DETAIL_COME_IN)
|
||||
}
|
||||
|
||||
override fun getActivityNameInChinese(): String {
|
||||
return "游戏详情"
|
||||
}
|
||||
override fun getActivityNameInChinese() = "游戏详情"
|
||||
|
||||
override fun getBusinessId(): Pair<String, String> {
|
||||
val fragment = targetFragment as? GameDetailFragment?
|
||||
return if (fragment?.arguments != null) {
|
||||
Pair(fragment.requireArguments().getString(EntranceConsts.KEY_GAMEID) ?: "", "")
|
||||
return if (!gameId.isNullOrEmpty()) {
|
||||
Pair(gameId ?: "", "")
|
||||
} else {
|
||||
super.getBusinessId()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override fun attachBaseContext(newBase: Context) {
|
||||
super.attachBaseContext(object : ContextWrapper(newBase) {
|
||||
override fun getSystemService(name: String): Any? {
|
||||
@ -96,6 +124,13 @@ class GameDetailActivity : DownloadToolbarActivity() {
|
||||
)
|
||||
}
|
||||
|
||||
private fun generateDataFromRoute() {
|
||||
val bundle = intent.extras
|
||||
|
||||
intent?.putExtra(NORMAL_FRAGMENT_NAME, GameDetailFragment::class.java.canonicalName)
|
||||
intent?.putExtra(NORMAL_FRAGMENT_BUNDLE, bundle)
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
@JvmStatic
|
||||
@ -131,9 +166,10 @@ class GameDetailActivity : DownloadToolbarActivity() {
|
||||
|
||||
if (traceEvent != null) {
|
||||
val clickEvent = createEvent(gameEntity, traceEvent.source, appendTrace(traceEvent), ExposureType.CLICK)
|
||||
log(clickEvent)
|
||||
ExposureManager.log(clickEvent)
|
||||
bundle.putParcelable(EntranceConsts.KEY_TRACE_EVENT, clickEvent)
|
||||
}
|
||||
|
||||
if (gameEntity != null && traceEvent != null && gameEntity.id != traceEvent.payload.gameId) {
|
||||
// 当游戏 ID 跟曝光 traceEvent 的游戏ID 不一样的时候更新 traceEvent 的游戏ID
|
||||
val (payload) = createEvent(
|
||||
@ -144,31 +180,33 @@ class GameDetailActivity : DownloadToolbarActivity() {
|
||||
)
|
||||
traceEvent.payload = payload
|
||||
}
|
||||
|
||||
if (defaultTab.isNotEmpty()) {
|
||||
bundle.putString(EntranceConsts.KEY_TARGET, defaultTab)
|
||||
}
|
||||
|
||||
if (isSkipGameComment) {
|
||||
bundle.putBoolean(EntranceConsts.KEY_SKIP_GAME_COMMENT, true)
|
||||
bundle.putBoolean(EntranceConsts.KEY_COMMENT_AS_DEFAULT_TAB, true)
|
||||
}
|
||||
|
||||
if (scrollToLibao) {
|
||||
bundle.putString(EntranceConsts.KEY_TARGET, GameDetailFragment.TAB_DESC)
|
||||
bundle.putString(EntranceConsts.KEY_TARGET, EntranceConsts.TAB_TYPE_DESC)
|
||||
bundle.putBoolean(EntranceConsts.KEY_SCROLL_TO_LIBAO, true)
|
||||
}
|
||||
|
||||
if (scrollToServer) {
|
||||
bundle.putString(EntranceConsts.KEY_TARGET, GameDetailFragment.TAB_DESC)
|
||||
bundle.putString(EntranceConsts.KEY_TARGET, EntranceConsts.TAB_TYPE_DESC)
|
||||
bundle.putBoolean(EntranceConsts.KEY_SCROLL_TO_SERVER, true)
|
||||
}
|
||||
bundle.putString(EntranceConsts.KEY_GAMEID, gameEntity?.id)
|
||||
|
||||
bundle.putString(EntranceConsts.KEY_GAME_ID, gameEntity?.id)
|
||||
bundle.putString(EntranceConsts.KEY_ENTRANCE, entrance)
|
||||
bundle.putParcelable(GameEntity.TAG, gameEntity)
|
||||
context.startActivity(
|
||||
getTargetIntent(
|
||||
context,
|
||||
GameDetailActivity::class.java,
|
||||
GameDetailFragment::class.java,
|
||||
bundle
|
||||
)
|
||||
)
|
||||
bundle.putParcelable(EntranceConsts.KEY_GAME_ENTITY, gameEntity)
|
||||
|
||||
ARouter.getInstance()
|
||||
.build(RouteConsts.activity.gameDetailActivity)
|
||||
.with(bundle)
|
||||
.navigation(context)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
@ -178,7 +216,7 @@ class GameDetailActivity : DownloadToolbarActivity() {
|
||||
entrance: String?,
|
||||
traceEvent: ExposureEvent?
|
||||
) {
|
||||
startGameDetailActivity(context, gameId, entrance, -1, traceEvent = traceEvent)
|
||||
startGameDetailActivity(context, gameId, entrance, isSkipGameComment = false, traceEvent = traceEvent)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
@ -186,7 +224,6 @@ class GameDetailActivity : DownloadToolbarActivity() {
|
||||
context: Context,
|
||||
gameId: String,
|
||||
entrance: String?,
|
||||
defaultTab: Int = -1,
|
||||
isSkipGameComment: Boolean = false,
|
||||
scrollToLibao: Boolean = false,
|
||||
openVideoStreaming: Boolean = false,
|
||||
@ -197,7 +234,6 @@ class GameDetailActivity : DownloadToolbarActivity() {
|
||||
context,
|
||||
gameId,
|
||||
entrance,
|
||||
defaultTab,
|
||||
isSkipGameComment,
|
||||
scrollToLibao,
|
||||
openVideoStreaming,
|
||||
@ -211,7 +247,6 @@ class GameDetailActivity : DownloadToolbarActivity() {
|
||||
|
||||
/**
|
||||
* @param gameId 游戏Id
|
||||
* @param defaultTab 默认定位到哪个tab
|
||||
* @param isSkipGameComment 是否跳转到评论tab
|
||||
* @param scrollToLibao 滚动到礼包区域
|
||||
* @param openVideoStreaming 是否打开视频流
|
||||
@ -225,7 +260,6 @@ class GameDetailActivity : DownloadToolbarActivity() {
|
||||
context: Context,
|
||||
gameId: String,
|
||||
entrance: String?,
|
||||
defaultTab: Int = -1,
|
||||
isSkipGameComment: Boolean = false,
|
||||
scrollToLibao: Boolean = false,
|
||||
openVideoStreaming: Boolean = false,
|
||||
@ -248,7 +282,7 @@ class GameDetailActivity : DownloadToolbarActivity() {
|
||||
appendTrace(traceEvent),
|
||||
ExposureType.CLICK
|
||||
)
|
||||
log(clickEvent)
|
||||
ExposureManager.log(clickEvent)
|
||||
bundle.putParcelable(EntranceConsts.KEY_TRACE_EVENT, clickEvent)
|
||||
}
|
||||
if (traceEvent != null && gameId != traceEvent.payload.gameId) {
|
||||
@ -261,15 +295,12 @@ class GameDetailActivity : DownloadToolbarActivity() {
|
||||
)
|
||||
traceEvent.payload = payload
|
||||
}
|
||||
if (defaultTab != -1) {
|
||||
bundle.putInt(EntranceConsts.KEY_TARGET, defaultTab)
|
||||
}
|
||||
if (isSkipGameComment) {
|
||||
bundle.putBoolean(EntranceConsts.KEY_SKIP_GAME_COMMENT, true)
|
||||
bundle.putBoolean(EntranceConsts.KEY_COMMENT_AS_DEFAULT_TAB, true)
|
||||
}
|
||||
if (openVideoStreaming) {
|
||||
bundle.putBoolean(EntranceConsts.KEY_OPEN_VIDEO_STREAMING, true)
|
||||
bundle.putString(EntranceConsts.KEY_TARGET, GameDetailFragment.TAB_DESC)
|
||||
bundle.putString(EntranceConsts.KEY_TARGET, EntranceConsts.TAB_TYPE_DESC)
|
||||
}
|
||||
if (openPlatformWindow) {
|
||||
bundle.putBoolean(EntranceConsts.KEY_OPEN_PLATFORM_WINDOW, true)
|
||||
@ -283,10 +314,10 @@ class GameDetailActivity : DownloadToolbarActivity() {
|
||||
}
|
||||
}
|
||||
if (scrollToLibao) {
|
||||
bundle.putString(EntranceConsts.KEY_TARGET, GameDetailFragment.TAB_DESC)
|
||||
bundle.putString(EntranceConsts.KEY_TARGET, EntranceConsts.TAB_TYPE_DESC)
|
||||
bundle.putBoolean(EntranceConsts.KEY_SCROLL_TO_LIBAO, true)
|
||||
}
|
||||
bundle.putString(EntranceConsts.KEY_GAMEID, gameId)
|
||||
bundle.putString(EntranceConsts.KEY_GAME_ID, gameId)
|
||||
bundle.putString(EntranceConsts.KEY_ENTRANCE, entrance)
|
||||
bundle.putParcelable(EntranceConsts.KEY_CUSTOM_PAGE_TRACK_DATA, customPageTrackData)
|
||||
bundle.putString(EntranceConsts.KEY_LAST_PAGE_ID, GlobalActivityManager.getLastPageEntity().pageId)
|
||||
@ -295,14 +326,11 @@ class GameDetailActivity : DownloadToolbarActivity() {
|
||||
EntranceConsts.KEY_LAST_PAGE_BUSINESS_ID,
|
||||
GlobalActivityManager.getLastPageEntity().pageBusinessId
|
||||
)
|
||||
context.startActivity(
|
||||
getTargetIntent(
|
||||
context,
|
||||
GameDetailActivity::class.java,
|
||||
GameDetailFragment::class.java,
|
||||
bundle
|
||||
)
|
||||
)
|
||||
|
||||
ARouter.getInstance()
|
||||
.build(RouteConsts.activity.gameDetailActivity)
|
||||
.with(bundle)
|
||||
.navigation(context)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -238,7 +238,7 @@ open class SearchActivity : BaseActivity() {
|
||||
GlobalActivityManager.getCurrentPageEntity().pageId,
|
||||
GlobalActivityManager.getCurrentPageEntity().pageName,
|
||||
key ?: "",
|
||||
TRACK_SEARCH_TYPE_RANK,
|
||||
TRACK_SEARCH_TYPE_DEFAULT,
|
||||
mSourceEntrance
|
||||
)
|
||||
}
|
||||
@ -433,14 +433,12 @@ open class SearchActivity : BaseActivity() {
|
||||
const val TRACK_SEARCH_TYPE_INPUT = "输入搜索"
|
||||
const val TRACK_SEARCH_TYPE_DEFAULT = "默认搜索"
|
||||
const val TRACK_SEARCH_TYPE_HISTORY = "历史搜索"
|
||||
const val TRACK_SEARCH_TYPE_RANK = "榜单搜索"
|
||||
|
||||
@JvmStatic
|
||||
fun toTrackSearchType(type: String) = when (type) {
|
||||
SearchType.AUTO.value -> TRACK_SEARCH_TYPE_AUTO
|
||||
SearchType.MANUAL.value -> TRACK_SEARCH_TYPE_INPUT
|
||||
SearchType.HISTORY.value -> TRACK_SEARCH_TYPE_HISTORY
|
||||
SearchType.RANK.value -> TRACK_SEARCH_TYPE_RANK
|
||||
else -> TRACK_SEARCH_TYPE_DEFAULT
|
||||
}
|
||||
|
||||
|
||||
@ -445,24 +445,6 @@ public class SkipActivity extends BaseActivity {
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if ("market".equals(uri.getScheme())) {
|
||||
String host = uri.getHost();
|
||||
String id = "";
|
||||
try {
|
||||
id = uri.getQueryParameter("id");
|
||||
} catch (UnsupportedOperationException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (host != null) {
|
||||
if ("details".equals(host)) {
|
||||
bundle = new Bundle();
|
||||
bundle.putString(KEY_TO, EntranceConsts.KEY_MARKET_DETAILS);
|
||||
bundle.putString(KEY_DATA, id);
|
||||
EntranceUtils.jumpActivity(this, bundle);
|
||||
} else {
|
||||
EntranceUtils.jumpActivity(this, new Bundle()); // 跳转至首页
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
105
app/src/main/java/com/gh/gamecenter/SkipCompatActivity.kt
Normal file
105
app/src/main/java/com/gh/gamecenter/SkipCompatActivity.kt
Normal file
@ -0,0 +1,105 @@
|
||||
package com.gh.gamecenter
|
||||
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import com.alibaba.android.arouter.facade.Postcard
|
||||
import com.alibaba.android.arouter.facade.callback.NavigationCallback
|
||||
import com.alibaba.android.arouter.launcher.ARouter
|
||||
import com.gh.common.util.EntranceUtils
|
||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
||||
import com.gh.gamecenter.common.utils.DialogHelper
|
||||
import com.halo.assistant.HaloApp
|
||||
import com.lightgame.utils.Utils
|
||||
|
||||
class SkipCompatActivity : SkipActivity() {
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
val uri = intent.data
|
||||
if (handleSkip(this, uri)) {
|
||||
intent.setData(null)
|
||||
}
|
||||
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
finish()
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TAG = "SkipCompat"
|
||||
|
||||
const val HOST = "app"
|
||||
|
||||
const val SCHEME = "ghzhushou"
|
||||
const val MARKET = "market"
|
||||
|
||||
fun handleSkip(context: Context, uri: Uri?): Boolean {
|
||||
if (uri == null) return false
|
||||
|
||||
// Handle skip
|
||||
if (uri.scheme == SCHEME) {
|
||||
Utils.log(TAG, "handleSkip: $uri")
|
||||
|
||||
val host = uri.host
|
||||
if (host == HOST) {
|
||||
ARouter.getInstance()
|
||||
.build(uri)
|
||||
.navigation(context, object : NavigationCallback {
|
||||
override fun onFound(postcard: Postcard?) {
|
||||
Utils.log(TAG, "navigate to postcard ${postcard?.uri} onFound" )
|
||||
}
|
||||
|
||||
override fun onLost(postcard: Postcard?) {
|
||||
Utils.log(TAG, "navigate to postcard ${postcard?.uri} onLost" )
|
||||
|
||||
if (HaloApp.getInstance().isAlreadyUpAndRunning) {
|
||||
// 在光环应用内时,显示不支持弹窗
|
||||
// 显示不支持弹窗
|
||||
DialogHelper.showUpgradeDialog(context)
|
||||
} else {
|
||||
// 在光环应用外跳转时,重定向至首页
|
||||
EntranceUtils.jumpActivity(context, Bundle())
|
||||
}
|
||||
}
|
||||
|
||||
override fun onArrival(postcard: Postcard?) {
|
||||
Utils.log(TAG, "navigate to postcard ${postcard?.uri} onArrival" )
|
||||
}
|
||||
|
||||
override fun onInterrupt(postcard: Postcard?) {
|
||||
Utils.log(TAG, "navigate to postcard ${postcard?.uri} onInterrupt" )
|
||||
}
|
||||
})
|
||||
|
||||
return true
|
||||
}
|
||||
} else if (uri.scheme == MARKET) {
|
||||
val host = uri.host
|
||||
var id = ""
|
||||
try {
|
||||
id = uri.getQueryParameter("id") ?: ""
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
|
||||
if (host != null) {
|
||||
if ("details" == host) {
|
||||
val bundle = Bundle()
|
||||
bundle.putString(
|
||||
EntranceConsts.KEY_TO,
|
||||
EntranceConsts.KEY_MARKET_DETAILS
|
||||
)
|
||||
bundle.putString(EntranceConsts.KEY_DATA, id)
|
||||
EntranceUtils.jumpActivity(context, bundle)
|
||||
} else {
|
||||
EntranceUtils.jumpActivity(context, Bundle()) // 跳转至首页
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -32,7 +32,7 @@ class AmwaySearchDefaultFragment : SearchDefaultFragment() {
|
||||
mViewModel.playedGames.observeNonNull(viewLifecycleOwner) {
|
||||
defaultViewModel?.isExistHotSearch = it.isNotEmpty()
|
||||
updateView()
|
||||
mBinding.hotList.run {
|
||||
mBinding.searchDiscoveryList.run {
|
||||
layoutManager = LinearLayoutManager(context)
|
||||
adapter = AmwaySearchAdapter(context, mViewModel, "安利墙搜索-最近玩过").apply { setData(it) }
|
||||
}
|
||||
@ -43,7 +43,7 @@ class AmwaySearchDefaultFragment : SearchDefaultFragment() {
|
||||
|
||||
override fun initView() {
|
||||
mBinding = mAmwayBinding.searchContent
|
||||
mBinding.hotHeadContainer.headTitle.text = "最近玩过"
|
||||
mBinding.searchDiscoveryHeadContainer.headTitle.text = "最近玩过"
|
||||
mBinding.historyFlexContainer.setLimitHeight(mFlexMaxHeight)
|
||||
|
||||
updateHistorySearchView(null)
|
||||
|
||||
@ -309,8 +309,7 @@ class CategoryV2ListFragment : ListFragment<GameEntity, CategoryV2ListViewModel>
|
||||
// 安装/卸载 事件
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
fun onEventMainThread(busFour: EBPackage) {
|
||||
// 忽略首次初始化触发的事件
|
||||
if (!busFour.fromInit && busFour.isInstalledOrUninstalled()) {
|
||||
if (busFour.isInstalledOrUninstalled()) {
|
||||
mAdapter?.notifyDataSetChanged()
|
||||
}
|
||||
}
|
||||
|
||||
@ -161,7 +161,6 @@ class DownloadFragment : BaseFragment_TabLayout() {
|
||||
val showOnFailed = downloadManagerAd?.displayRule?.onFailedAction == "show"
|
||||
if ((showThirdPartyAd && thirdPartyAd != null) || (!showThirdPartyAd && thirdPartyAd != null && ownerAd == null)) {
|
||||
initThirdPartyAd(downloadManagerAd, thirdPartyAd) { isSuccess ->
|
||||
if (!isAdded) return@initThirdPartyAd
|
||||
mBinding.maskView.goneIf(!isSuccess)
|
||||
if (!isSuccess && ownerAd != null && showOnFailed) {
|
||||
mSlideInterval = ownerAd.adSource?.sliderInterval ?: -1
|
||||
@ -216,7 +215,7 @@ class DownloadFragment : BaseFragment_TabLayout() {
|
||||
}
|
||||
|
||||
private fun initOwnerAd(adConfig: AdConfig) {
|
||||
if (!isAdded || adConfig.id.isEmpty()) return
|
||||
if (adConfig.id.isEmpty()) return
|
||||
mAdGameViewModel = viewModelProvider(AdGameViewModel.Factory(adConfig))
|
||||
initAdGameBanner(adConfig)
|
||||
mBinding.closeAdIv.setOnClickListener {
|
||||
@ -250,7 +249,6 @@ class DownloadFragment : BaseFragment_TabLayout() {
|
||||
adConfig.displayRule.onFailedAction == "show" && adConfig.thirdPartyAd != null) {
|
||||
// 自有广告游戏为空时,显示第三方广告
|
||||
initThirdPartyAd(adConfig, adConfig.thirdPartyAd) { isSuccess ->
|
||||
if (!isAdded) return@initThirdPartyAd
|
||||
mBinding.maskView.goneIf(!isSuccess)
|
||||
if (isSuccess) {
|
||||
SPUtils.setLong(Constants.SP_LAST_DOWNLOAD_MANAGER_AD_SHOW_TIME, System.currentTimeMillis())
|
||||
|
||||
@ -220,7 +220,7 @@ class NewInstalledGameFragment : ToolbarFragment() {
|
||||
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
fun onEventMainThread(packageEb: EBPackage) {
|
||||
if (!packageEb.fromInit && packageEb.isInstalledOrUninstalled()) {
|
||||
if (packageEb.isInstalledOrUninstalled()) {
|
||||
mInstallGameViewModel.initData(
|
||||
PackagesManager.filterSameApk(
|
||||
PackagesManager.filterDownloadBlackPackage(mPackageViewModel?.getGameInstalledLiveData()?.value as MutableList<GameInstall>?)
|
||||
|
||||
@ -1,12 +1,6 @@
|
||||
package com.gh.gamecenter.eventbus
|
||||
|
||||
/**
|
||||
* @param fromInit 实体生成是否来自于初始化
|
||||
*/
|
||||
class EBPackage(var type: String,
|
||||
var packageName: String,
|
||||
var versionName: String?,
|
||||
val fromInit: Boolean = false) {
|
||||
class EBPackage(var type: String, var packageName: String, var versionName: String?) {
|
||||
var gameId: String? = null
|
||||
var isVGame: Boolean = false // 是否是畅玩游戏
|
||||
|
||||
|
||||
@ -709,7 +709,7 @@ class ForumDetailFragment : BaseLazyTabFragment(), IScrollable {
|
||||
} else {
|
||||
val fuliFragment = childFragmentManager.findFragmentByTag("${tag}$INDEX_TRENDS") ?: FuLiFragment()
|
||||
fuliFragment.arguments = bundleOf(
|
||||
GameEntity.TAG to game.toGameEntity(),
|
||||
EntranceConsts.KEY_GAME_ENTITY to game.toGameEntity(),
|
||||
EntranceConsts.KEY_ENTRANCE to mEntrance,
|
||||
EntranceConsts.KEY_PATH to TAB_TRENDS
|
||||
)
|
||||
|
||||
@ -280,7 +280,6 @@ class FollowHomeFragment : LazyFragment(), IScrollable {
|
||||
requireContext(),
|
||||
it.id,
|
||||
"",
|
||||
-1,
|
||||
traceEvent = it.exposureEvent
|
||||
)
|
||||
})
|
||||
|
||||
@ -39,14 +39,14 @@ class ForumOrUserSearchDefaultFragment : SearchDefaultFragment() {
|
||||
|
||||
override fun initView() {
|
||||
mBinding = FragmentSearchDefaultBinding.bind(mCachedView)
|
||||
mBinding.hotTagHeadContainer.root.visibility = View.GONE
|
||||
mBinding.hotTagFlexContainer.visibility = View.GONE
|
||||
mBinding.searchDiscoveryTagHeadContainer.root.visibility = View.GONE
|
||||
mBinding.searchDiscoveryTagFlexContainer.visibility = View.GONE
|
||||
if (mEntrance == "论坛首页" || mEntrance == "搜索栏") {
|
||||
mBinding.hotHeadContainer.headTitle.text = "热门论坛"
|
||||
mBinding.searchDiscoveryHeadContainer.headTitle.text = "热门论坛"
|
||||
mViewModel.getForumSearchHotContent()
|
||||
} else {
|
||||
mBinding.hotHeadContainer.root.visibility = View.GONE
|
||||
mBinding.hotList.visibility = View.GONE
|
||||
mBinding.searchDiscoveryHeadContainer.root.visibility = View.GONE
|
||||
mBinding.searchDiscoveryList.visibility = View.GONE
|
||||
}
|
||||
val params = mBinding.historyHeadContainer.root.layoutParams as ConstraintLayout.LayoutParams
|
||||
params.topMargin = 0.5f.dip2px()
|
||||
|
||||
@ -67,8 +67,6 @@ class ColumnCollectionDetailFragment : LazyListFragment<LinkEntity, ColumnCollec
|
||||
}
|
||||
|
||||
private fun showSubjectTab(linkEntityList: MutableList<LinkEntity>) {
|
||||
if (!isVisible) return
|
||||
|
||||
val subjectDataList = arrayListOf<SubjectData>()
|
||||
|
||||
for (link in linkEntityList) {
|
||||
|
||||
@ -968,7 +968,7 @@ class GameCollectionDetailFragment :
|
||||
// 安装/卸载 事件
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
fun onEventMainThread(busFour: EBPackage) {
|
||||
if (!busFour.fromInit && busFour.isInstalledOrUninstalled()) {
|
||||
if (busFour.isInstalledOrUninstalled()) {
|
||||
if (EBPackage.TYPE_INSTALLED == busFour.type
|
||||
&& UserManager.getInstance().isLoggedIn
|
||||
&& (mEntity?.count?.playedGame ?: 0) < (mEntity?.count?.game ?: 0)
|
||||
|
||||
@ -438,7 +438,7 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
val args = arguments ?: Bundle()
|
||||
mAutoDownload = args.getBoolean(EntranceConsts.KEY_AUTO_DOWNLOAD)
|
||||
mTraceEvent = args.getParcelable(EntranceConsts.KEY_TRACE_EVENT)
|
||||
mSkipGameComment = args.getBoolean(EntranceConsts.KEY_SKIP_GAME_COMMENT)
|
||||
mSkipGameComment = args.getBoolean(EntranceConsts.KEY_COMMENT_AS_DEFAULT_TAB)
|
||||
mIsOpenPlatformWindow = args.getBoolean(EntranceConsts.KEY_OPEN_PLATFORM_WINDOW)
|
||||
|
||||
mSkeleton = Skeleton.bind(mBinding.listSkeleton)
|
||||
@ -451,11 +451,11 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
.load(R.layout.fragment_gamedetail_skeleton)
|
||||
.show()
|
||||
|
||||
val gameId = args.getString(EntranceConsts.KEY_GAMEID) ?: ""
|
||||
val gameId = args.getString(EntranceConsts.KEY_GAME_ID) ?: ""
|
||||
val factory = GameDetailViewModel.Factory(
|
||||
HaloApp.getInstance().application,
|
||||
gameId,
|
||||
args.getParcelable(GameEntity.TAG)
|
||||
args.getParcelable(EntranceConsts.KEY_GAME_ENTITY)
|
||||
)
|
||||
mViewModel = viewModelProviderFromParent(factory, gameId)
|
||||
mPackageViewModel = viewModelProvider(PackageViewModel.Factory())
|
||||
@ -464,8 +464,8 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
mBodyBinding.gamedetailVp.doOnPageSelected { position ->
|
||||
if (!isAdded) return@doOnPageSelected
|
||||
|
||||
val bbsPosition = getTabPositionFromTabType(TAB_BBS)
|
||||
val trendsPosition = getTabPositionFromTabType(TAB_TRENDS)
|
||||
val bbsPosition = getTabPositionFromTabType(EntranceConsts.TAB_TYPE_BBS)
|
||||
val trendsPosition = getTabPositionFromTabType(EntranceConsts.TAB_TYPE_TRENDS)
|
||||
|
||||
if (mNewGameDetailEntity?.bbsTab != null && position == bbsPosition) {
|
||||
DirectUtils.directToLinkPage(
|
||||
@ -482,7 +482,7 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
}, 200)
|
||||
} else if (mNewGameDetailEntity?.zone != null && mNewGameDetailEntity?.zone?.style != "default" && position == trendsPosition && mNewGameDetailEntity?.bbsTab != null) {
|
||||
// 跳转论坛-专区
|
||||
val entrance = if (mDestinationTab == getTabPositionFromTabType(TAB_TRENDS)) {
|
||||
val entrance = if (mDestinationTab == getTabPositionFromTabType(EntranceConsts.TAB_TYPE_TRENDS)) {
|
||||
if (mEntrance.contains("搜索")) "搜索页面" else "其他"
|
||||
} else "游戏详情页"
|
||||
mNewGameDetailEntity?.bbsTab?.link?.let {
|
||||
@ -839,7 +839,7 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
DetailDownloadUtils.updateViewHolder(viewHolder)
|
||||
|
||||
mDestinationTab =
|
||||
getTabPositionFromTabType(arguments?.getString(EntranceConsts.KEY_TARGET, TAB_DESC) ?: TAB_DESC)
|
||||
getTabPositionFromTabType(arguments?.getString(EntranceConsts.KEY_TARGET, EntranceConsts.TAB_TYPE_DESC) ?: EntranceConsts.TAB_TYPE_DESC)
|
||||
|
||||
// destinationTab 的优先级最高,关注和关联关注在它的后面
|
||||
if (mDestinationTab != -1) {
|
||||
@ -1015,7 +1015,7 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
}
|
||||
|
||||
val bundle = Bundle()
|
||||
bundle.putParcelable(GameEntity.TAG, mGameEntity)
|
||||
bundle.putParcelable(EntranceConsts.KEY_GAME_ENTITY, mGameEntity)
|
||||
bundle.putString(EntranceConsts.KEY_ENTRANCE, mEntrance)
|
||||
bundle.putBoolean(EntranceConsts.KEY_SCROLL_TO_LIBAO, scrollToLibao)
|
||||
bundle.putBoolean(EntranceConsts.KEY_SCROLL_TO_SERVER, scrollToServer)
|
||||
@ -1031,21 +1031,21 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
mTabTitleList.clear()
|
||||
|
||||
val tag = "android:switcher:${mBodyBinding.gamedetailVp.id}:"
|
||||
val descFragment = childFragmentManager.findFragmentByTag("${tag}$TAB_DESC") ?: DescFragment()
|
||||
val descFragment = childFragmentManager.findFragmentByTag("${tag}${EntranceConsts.TAB_TYPE_DESC}") ?: DescFragment()
|
||||
descFragment.arguments = bundle
|
||||
mFragmentsList.add(descFragment)
|
||||
mTabTitleList.add(getString(R.string.game_detail_desc))
|
||||
mTabTypeList.add(TAB_DESC)
|
||||
mTabTypeList.add(EntranceConsts.TAB_TYPE_DESC)
|
||||
|
||||
if (data.showArchive) {
|
||||
val cloudArchiveFragment =
|
||||
childFragmentManager.findFragmentByTag("${tag}${TAB_ARCHIVE}") ?: CloudArchiveFragment()
|
||||
childFragmentManager.findFragmentByTag("${tag}${EntranceConsts.TAB_TYPE_ARCHIVE}") ?: CloudArchiveFragment()
|
||||
bundle.putParcelable(EntranceConsts.KEY_GAME, mGameEntity ?: GameEntity())
|
||||
bundle.putString(EntranceConsts.KEY_ARCHIVE_CONFIG_URL, data.archiveTab.configUrl)
|
||||
cloudArchiveFragment.arguments = bundle
|
||||
mFragmentsList.add(cloudArchiveFragment)
|
||||
mTabTitleList.add(getString(R.string.game_detail_cloud_archive))
|
||||
mTabTypeList.add(TAB_ARCHIVE)
|
||||
mTabTypeList.add(EntranceConsts.TAB_TYPE_ARCHIVE)
|
||||
|
||||
NewFlatLogUtils.logCloudArchiveGameDetailTabRelated(
|
||||
"cloud_save_tab_show",
|
||||
@ -1055,13 +1055,13 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
}
|
||||
|
||||
if (data.showComment) {
|
||||
val ratingFragment = childFragmentManager.findFragmentByTag("${tag}${TAB_RATING}") ?: RatingFragment()
|
||||
bundle.putBoolean(EntranceConsts.KEY_SKIP_GAME_COMMENT, mSkipGameComment)
|
||||
val ratingFragment = childFragmentManager.findFragmentByTag("${tag}${EntranceConsts.TAB_TYPE_RATING}") ?: RatingFragment()
|
||||
bundle.putBoolean(EntranceConsts.KEY_COMMENT_AS_DEFAULT_TAB, mSkipGameComment)
|
||||
bundle.putBoolean(EntranceConsts.KEY_DIRECT_COMMENT, data.directComment)
|
||||
ratingFragment.arguments = bundle
|
||||
mFragmentsList.add(ratingFragment)
|
||||
mTabTitleList.add(getString(R.string.game_detail_comment))
|
||||
mTabTypeList.add(TAB_RATING)
|
||||
mTabTypeList.add(EntranceConsts.TAB_TYPE_RATING)
|
||||
}
|
||||
|
||||
data.zone?.let {
|
||||
@ -1072,7 +1072,7 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
mFragmentsList.add(Fragment())
|
||||
} else if (it.style == "link") {
|
||||
//显示web页面
|
||||
val webFragment = childFragmentManager.findFragmentByTag("${tag}${TAB_TRENDS}") ?: WebFragment()
|
||||
val webFragment = childFragmentManager.findFragmentByTag("${tag}${EntranceConsts.TAB_TYPE_TRENDS}") ?: WebFragment()
|
||||
val webBundle = Bundle()
|
||||
webBundle.putString(EntranceConsts.KEY_ENTRANCE, "游戏专区")
|
||||
webBundle.putString(EntranceConsts.KEY_URL, it.link)
|
||||
@ -1080,7 +1080,7 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
webFragment.arguments = webBundle
|
||||
mFragmentsList.add(webFragment)
|
||||
} else {
|
||||
val fuliFragment = childFragmentManager.findFragmentByTag("${tag}${TAB_TRENDS}") ?: FuLiFragment()
|
||||
val fuliFragment = childFragmentManager.findFragmentByTag("${tag}${EntranceConsts.TAB_TYPE_TRENDS}") ?: FuLiFragment()
|
||||
fuliFragment.arguments = bundle
|
||||
mFragmentsList.add(fuliFragment)
|
||||
}
|
||||
@ -1089,7 +1089,7 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
} else {
|
||||
mTabTitleList.add(getString(R.string.game_detail_dongtai))
|
||||
}
|
||||
mTabTypeList.add(TAB_TRENDS)
|
||||
mTabTypeList.add(EntranceConsts.TAB_TYPE_TRENDS)
|
||||
}
|
||||
|
||||
var isShowBbs = true
|
||||
@ -1103,7 +1103,7 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
if (isShowBbs && mGameEntity?.shouldUseMirrorInfo() == false) {
|
||||
mFragmentsList.add(Fragment())
|
||||
mTabTitleList.add(getString(R.string.game_detail_bbs))
|
||||
mTabTypeList.add(TAB_BBS)
|
||||
mTabTypeList.add(EntranceConsts.TAB_TYPE_BBS)
|
||||
}
|
||||
}
|
||||
|
||||
@ -1116,7 +1116,7 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
gamedetailVp.doOnPageSelected {
|
||||
logTabClick(it)
|
||||
}
|
||||
gamedetailVp.currentItem = getTabPositionFromTabType(TAB_DESC)
|
||||
gamedetailVp.currentItem = getTabPositionFromTabType(EntranceConsts.TAB_TYPE_DESC)
|
||||
|
||||
mBodyBinding.tabLayout.setupWithViewPager(gamedetailVp)
|
||||
mBodyBinding.tabIndicator.setupWithTabLayout(mBodyBinding.tabLayout)
|
||||
@ -1125,7 +1125,7 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
for (i in 0 until mBodyBinding.tabLayout.tabCount) {
|
||||
val tab = mBodyBinding.tabLayout.getTabAt(i) ?: continue
|
||||
val tabTitle = if (tab.text != null) tab.text.toString() else ""
|
||||
if (data.showArchive && i == getTabPositionFromTabType(TAB_ARCHIVE)) {
|
||||
if (data.showArchive && i == getTabPositionFromTabType(EntranceConsts.TAB_TYPE_ARCHIVE)) {
|
||||
tab.customView = getArchiveTabView(tabTitle)
|
||||
tab.view.run {
|
||||
clipChildren = false
|
||||
@ -1258,7 +1258,7 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
|
||||
if (mNewGameDetailEntity!!.showComment) {
|
||||
if (mSkipGameComment) {
|
||||
tabPerformClick(getTabPositionFromTabType(TAB_RATING))
|
||||
tabPerformClick(getTabPositionFromTabType(EntranceConsts.TAB_TYPE_RATING))
|
||||
mBodyBinding.gamedetailAppbar.setExpanded(false)
|
||||
mSkipGameComment = false
|
||||
}
|
||||
@ -1759,13 +1759,13 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
fun onEventMainThread(reuse: EBReuse) {
|
||||
if (SKIP_DESC == reuse.type) {
|
||||
tabPerformClick(getTabPositionFromTabType(TAB_DESC))
|
||||
tabPerformClick(getTabPositionFromTabType(EntranceConsts.TAB_TYPE_DESC))
|
||||
} else if (OPEN_APPBAR == reuse.type && !mIsTouchScreen) {
|
||||
mBodyBinding.gamedetailAppbar.setExpanded(true, true)
|
||||
} else if (SKIP_FULI == reuse.type) {
|
||||
tabPerformClick(getTabPositionFromTabType(TAB_TRENDS))
|
||||
tabPerformClick(getTabPositionFromTabType(EntranceConsts.TAB_TYPE_TRENDS))
|
||||
} else if (SKIP_RATING == reuse.type) {
|
||||
tabPerformClick(getTabPositionFromTabType(TAB_RATING))
|
||||
tabPerformClick(getTabPositionFromTabType(EntranceConsts.TAB_TYPE_RATING))
|
||||
} else if (CLOSE_APPBAR == reuse.type && !mIsTouchScreen) {
|
||||
mBodyBinding.gamedetailAppbar.setExpanded(false, true)
|
||||
} else if ("download" == reuse.type) {
|
||||
@ -2012,8 +2012,8 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
}
|
||||
|
||||
private fun tabPerformClick(position: Int) {
|
||||
val trendsTabPosition = getTabPositionFromTabType(TAB_TRENDS)
|
||||
val bbsTabPosition = getTabPositionFromTabType(TAB_BBS)
|
||||
val trendsTabPosition = getTabPositionFromTabType(EntranceConsts.TAB_TYPE_TRENDS)
|
||||
val bbsTabPosition = getTabPositionFromTabType(EntranceConsts.TAB_TYPE_BBS)
|
||||
|
||||
when (position) {
|
||||
trendsTabPosition -> {
|
||||
@ -2023,7 +2023,7 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
) {
|
||||
performJumpContentCard("func_zone", position)
|
||||
} else {
|
||||
mBodyBinding.gamedetailVp.currentItem = getTabPositionFromTabType(TAB_TRENDS)
|
||||
mBodyBinding.gamedetailVp.currentItem = getTabPositionFromTabType(EntranceConsts.TAB_TYPE_TRENDS)
|
||||
}
|
||||
}
|
||||
|
||||
@ -2031,7 +2031,7 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
if (!mTabTitleList.contains(getString(R.string.game_detail_bbs))) {
|
||||
performJumpContentCard("func_bbs", position)
|
||||
} else {
|
||||
mBodyBinding.gamedetailVp.currentItem = getTabPositionFromTabType(TAB_BBS)
|
||||
mBodyBinding.gamedetailVp.currentItem = getTabPositionFromTabType(EntranceConsts.TAB_TYPE_BBS)
|
||||
}
|
||||
}
|
||||
|
||||
@ -2072,11 +2072,11 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
val entrance = if (mEntrance.contains("论坛详情")) "论坛" else "游戏"
|
||||
mGameEntity?.run {
|
||||
when (mTabTypeList[position]) {
|
||||
TAB_DESC -> {
|
||||
EntranceConsts.TAB_TYPE_DESC -> {
|
||||
NewLogUtils.logGameDetailTabClick(name ?: "", id, "详情")
|
||||
}
|
||||
|
||||
TAB_TRENDS -> {
|
||||
EntranceConsts.TAB_TYPE_TRENDS -> {
|
||||
NewLogUtils.logGameDetailTabClick(
|
||||
"view_game_detail_special_area_tab",
|
||||
entrance,
|
||||
@ -2087,7 +2087,7 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
NewLogUtils.logGameDetailTabClick(name ?: "", id, "专区")
|
||||
}
|
||||
|
||||
TAB_ARCHIVE -> {
|
||||
EntranceConsts.TAB_TYPE_ARCHIVE -> {
|
||||
NewFlatLogUtils.logCloudArchiveGameDetailTabRelated(
|
||||
"cloud_save_tab_click",
|
||||
mGameEntity?.id ?: "",
|
||||
@ -2106,12 +2106,12 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
)
|
||||
}
|
||||
|
||||
TAB_RATING -> {
|
||||
EntranceConsts.TAB_TYPE_RATING -> {
|
||||
NewLogUtils.logGameDetailTabClick("view_game_detail_comment_tab", entrance, id, gameType, bbsId)
|
||||
NewLogUtils.logGameDetailTabClick(name ?: "", id, "评论")
|
||||
}
|
||||
|
||||
TAB_BBS -> {
|
||||
EntranceConsts.TAB_TYPE_BBS -> {
|
||||
NewLogUtils.logGameDetailTabClick(name ?: "", id, "论坛")
|
||||
}
|
||||
}
|
||||
@ -2367,7 +2367,7 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
|
||||
private fun updateArchiveTabUI() {
|
||||
mBodyBinding.tabLayout.run {
|
||||
val archivePosition = getTabPositionFromTabType(TAB_ARCHIVE)
|
||||
val archivePosition = getTabPositionFromTabType(EntranceConsts.TAB_TYPE_ARCHIVE)
|
||||
getTabAt(archivePosition)?.customView?.findViewById<ImageView>(R.id.newIv)?.visibility = View.VISIBLE
|
||||
}
|
||||
}
|
||||
@ -2384,7 +2384,7 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
override fun onBackPressed(): Boolean {
|
||||
mOrientationUtils?.backToProtVideo()
|
||||
|
||||
val trendsTabPosition = getTabPositionFromTabType(TAB_TRENDS)
|
||||
val trendsTabPosition = getTabPositionFromTabType(EntranceConsts.TAB_TYPE_TRENDS)
|
||||
|
||||
if (mBodyBinding.gamedetailVp.currentItem == trendsTabPosition
|
||||
&& mFragmentsList[trendsTabPosition] is WebFragment
|
||||
@ -2647,12 +2647,6 @@ class GameDetailFragment : BaseLazyFragment(), IScrollable {
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TAB_DESC = "详情"
|
||||
const val TAB_TRENDS = "专区"
|
||||
const val TAB_ARCHIVE = "云存档"
|
||||
const val TAB_RATING = "评价"
|
||||
const val TAB_BBS = "论坛"
|
||||
|
||||
const val SKIP_DESC = "skipDesc"
|
||||
const val SKIP_FULI = "skipFuli"
|
||||
const val SKIP_RATING = "skipRatting"
|
||||
|
||||
@ -116,7 +116,7 @@ class DescFragment: LazyFragment(), IScrollable {
|
||||
}
|
||||
|
||||
override fun onFragmentFirstVisible() {
|
||||
mGameEntity = arguments?.getParcelable(GameEntity.TAG)
|
||||
mGameEntity = arguments?.getParcelable(EntranceConsts.KEY_GAME_ENTITY)
|
||||
openVideoStreaming = arguments?.getBoolean(EntranceConsts.KEY_OPEN_VIDEO_STREAMING, false) ?: false
|
||||
mScrollToLibao = arguments?.getBoolean(EntranceConsts.KEY_SCROLL_TO_LIBAO, false) ?: false
|
||||
mScrollToServer = arguments?.getBoolean(EntranceConsts.KEY_SCROLL_TO_SERVER, false) ?: false
|
||||
|
||||
@ -394,7 +394,7 @@ class SpecialDownloadDialogFragment : BaseDraggableDialogFragment() {
|
||||
SensorsBridge.trackDownloadComponentsContentClick(
|
||||
gameId = gameEntity.id,
|
||||
gameName = gameEntity.name ?: "unknown",
|
||||
gameSchemaType = gameEntity.gameBitChinese,
|
||||
gameSchemeType = gameEntity.gameBitChinese,
|
||||
downloadStatus = gameEntity.downloadStatusChinese,
|
||||
gameType = gameEntity.categoryChinese,
|
||||
downloadType = if (asVGame) "畅玩下载" else "本地下载",
|
||||
@ -405,7 +405,7 @@ class SpecialDownloadDialogFragment : BaseDraggableDialogFragment() {
|
||||
SensorsBridge.trackDownloadComponentsShow(
|
||||
gameId = gameEntity.id,
|
||||
gameName = gameEntity.name ?: "unknown",
|
||||
gameSchemaType = gameEntity.gameBitChinese,
|
||||
gameSchemeType = gameEntity.gameBitChinese,
|
||||
downloadStatus = gameEntity.downloadStatusChinese,
|
||||
gameType = gameEntity.categoryChinese,
|
||||
downloadType = if (asVGame) "畅玩下载" else "本地下载",
|
||||
|
||||
@ -59,7 +59,7 @@ class FuLiFragment : LazyFragment(), IScrollable {
|
||||
}
|
||||
|
||||
override fun onFragmentFirstVisible() {
|
||||
val gameEntity = arguments?.getParcelable(GameEntity.TAG) as? GameEntity
|
||||
val gameEntity = arguments?.getParcelable(EntranceConsts.KEY_GAME_ENTITY) as? GameEntity
|
||||
val gameDetailFactory =
|
||||
GameDetailViewModel.Factory(HaloApp.getInstance().application, gameEntity?.id, gameEntity)
|
||||
shouldScroolToLibao = arguments?.getBoolean(EntranceConsts.KEY_SCROLL_TO_LIBAO) ?: false
|
||||
|
||||
@ -52,7 +52,6 @@ class GameDetailAnswerAdapter(
|
||||
val path = "游戏详情-动态"
|
||||
holder.bindAnswerItem(entity, mEntrance, path)
|
||||
holder.binding.title.setOnClickListener {
|
||||
HaloApp.put(Constants.GAME_DETAIL_COME_IN, true)
|
||||
MtaHelper.onEvent("进入问答", "游戏详情", mViewModel.gameCommunity?.name + "+" + mViewModel.game?.name)
|
||||
if ("community_article" == entity.type) {
|
||||
MtaHelper.onEvent("游戏详情_新", "点击社区文章", mViewModel.game?.name + "+" + entity.questions.title)
|
||||
@ -81,7 +80,6 @@ class GameDetailAnswerAdapter(
|
||||
|
||||
}
|
||||
holder.itemView.setOnClickListener {
|
||||
HaloApp.put(Constants.GAME_DETAIL_COME_IN, true)
|
||||
MtaHelper.onEvent("进入问答", "游戏详情", mViewModel.gameCommunity?.name + "+" + mViewModel.game?.name)
|
||||
if ("community_article" == entity.type) {
|
||||
MtaHelper.onEvent("游戏详情_新", "点击社区文章", mViewModel.game?.name + "+" + entity.questions.title)
|
||||
|
||||
@ -18,7 +18,7 @@ class RatingFoldActivity : ToolBarActivity() {
|
||||
@JvmStatic
|
||||
fun getIntent(context: Context, game: GameEntity, entrance: String, path: String): Intent {
|
||||
val bundle = Bundle()
|
||||
bundle.putParcelable(GameEntity.TAG, game)
|
||||
bundle.putParcelable(EntranceConsts.KEY_GAME_ENTITY, game)
|
||||
bundle.putString(EntranceConsts.KEY_ENTRANCE, mergeEntranceAndPath(entrance, path))
|
||||
bundle.putSerializable(EntranceConsts.KEY_LOCATION, RatingViewModel.RatingType.FOLD_RATING)
|
||||
return getTargetIntent(context, RatingFoldActivity::class.java, RatingFragment::class.java, bundle)
|
||||
|
||||
@ -91,7 +91,7 @@ class RatingFragment : LazyListFragment<RatingComment, RatingViewModel>(), IScro
|
||||
override fun provideListViewModel(): RatingViewModel {
|
||||
val factory = RatingViewModel.Factory(
|
||||
HaloApp.getInstance().application,
|
||||
arguments?.getParcelable(GameEntity.TAG)!!, mRatingType!!
|
||||
arguments?.getParcelable(EntranceConsts.KEY_GAME_ENTITY)!!, mRatingType!!
|
||||
)
|
||||
return ViewModelProviders.of(this, factory).get(RatingViewModel::class.java)
|
||||
}
|
||||
@ -109,7 +109,7 @@ class RatingFragment : LazyListFragment<RatingComment, RatingViewModel>(), IScro
|
||||
override fun onFragmentPause() {
|
||||
super.onFragmentPause()
|
||||
|
||||
val game = arguments?.getParcelable<GameEntity>(GameEntity.TAG)
|
||||
val game = arguments?.getParcelable<GameEntity>(EntranceConsts.KEY_GAME_ENTITY)
|
||||
val stayTime = (System.currentTimeMillis() - startPageTime) / 1000
|
||||
NewLogUtils.logGameDetailTabOrCommentDetailPause(
|
||||
"jump_game_detail_comment_tab",
|
||||
@ -128,7 +128,7 @@ class RatingFragment : LazyListFragment<RatingComment, RatingViewModel>(), IScro
|
||||
super.onFragmentFirstVisible()
|
||||
|
||||
val horizontalPadding = com.gh.gamecenter.common.R.dimen.game_detail_item_horizontal_padding.toPx()
|
||||
mSkipGameComment = arguments?.getBoolean(EntranceConsts.KEY_SKIP_GAME_COMMENT)
|
||||
mSkipGameComment = arguments?.getBoolean(EntranceConsts.KEY_COMMENT_AS_DEFAULT_TAB)
|
||||
mListRv?.setPadding(horizontalPadding, 0, horizontalPadding, 0)
|
||||
mListRefresh?.setBackgroundColor(ContextCompat.getColor(requireContext(), com.gh.gamecenter.common.R.color.transparent))
|
||||
mListRefresh?.isEnabled = mRatingType != RatingViewModel.RatingType.RATING
|
||||
|
||||
@ -131,7 +131,7 @@ class RatingEditActivity : ToolBarActivity(), KeyboardHeightObserver {
|
||||
return
|
||||
}
|
||||
setToolbarMenu(R.menu.menu_game_comment)
|
||||
mGame = intent.getParcelableExtra(GameEntity.TAG) ?: GameEntity(id = "")
|
||||
mGame = intent.getParcelableExtra(EntranceConsts.KEY_GAME_ENTITY) ?: GameEntity(id = "")
|
||||
mFromAmway = intent.getBooleanExtra(EntranceConsts.KEY_AMWAY, false)
|
||||
mIsSkipSuccessPage = intent.getBooleanExtra(EntranceConsts.KEY_SKIP_SUCCESS_PAGE, false)
|
||||
mComment = intent.getParcelableExtra(RatingComment::class.java.simpleName)
|
||||
@ -659,7 +659,7 @@ class RatingEditActivity : ToolBarActivity(), KeyboardHeightObserver {
|
||||
isSkipSuccessPage: Boolean = true
|
||||
): Intent {
|
||||
val intent = Intent(context, RatingEditActivity::class.java)
|
||||
intent.putExtra(GameEntity.TAG, game)
|
||||
intent.putExtra(EntranceConsts.KEY_GAME_ENTITY, game)
|
||||
intent.putExtra(EntranceConsts.KEY_RATING_STAR_COUNT, starCount)
|
||||
intent.putExtra(EntranceConsts.KEY_AMWAY, fromAmway)
|
||||
intent.putExtra(EntranceConsts.KEY_SKIP_SUCCESS_PAGE, isSkipSuccessPage)
|
||||
@ -670,7 +670,7 @@ class RatingEditActivity : ToolBarActivity(), KeyboardHeightObserver {
|
||||
|
||||
fun getPatchIntent(context: Context, game: GameEntity, comment: RatingComment): Intent {
|
||||
val intent = Intent(context, RatingEditActivity::class.java)
|
||||
intent.putExtra(GameEntity.TAG, game)
|
||||
intent.putExtra(EntranceConsts.KEY_GAME_ENTITY, game)
|
||||
intent.putExtra(RatingComment::class.java.simpleName, comment)
|
||||
return intent
|
||||
}
|
||||
|
||||
@ -298,8 +298,7 @@ class CustomPageFragment : LazyFragment(), ISmartRefreshContent, IScrollable {
|
||||
requireContext(),
|
||||
game.id,
|
||||
entrance,
|
||||
-1,
|
||||
traceEvent = game.exposureEvent
|
||||
traceEvent = game.exposureEvent,
|
||||
)
|
||||
}
|
||||
|
||||
@ -402,8 +401,7 @@ class CustomPageFragment : LazyFragment(), ISmartRefreshContent, IScrollable {
|
||||
requireContext(),
|
||||
gameId = gameId,
|
||||
entrance = "自定义页面",
|
||||
defaultTab = -1,
|
||||
traceEvent = exposureEvent
|
||||
traceEvent = exposureEvent,
|
||||
)
|
||||
})
|
||||
|
||||
|
||||
@ -123,12 +123,8 @@ abstract class BaseCustomViewHolder(
|
||||
_title.name = subject.name
|
||||
tvTitle.text = subject.name ?: ""
|
||||
}
|
||||
val home = subject.home ?: ""
|
||||
val homeText = subject.homeText ?: ""
|
||||
if (_title.rightHome != home || _title.rightText != homeText) {
|
||||
_title.rightHome = home
|
||||
_title.rightText = homeText
|
||||
|
||||
if (_title.rightText != subject.home) {
|
||||
_title.rightText = subject.home
|
||||
fun getHomeText(defaultResId: Int): String =
|
||||
if (subject.homeText.isNullOrBlank()) {
|
||||
defaultResId.toResString()
|
||||
@ -367,7 +363,6 @@ abstract class BaseCustomViewHolder(
|
||||
|
||||
data class TitleData(
|
||||
var name: String? = null,
|
||||
var rightHome: String? = null,
|
||||
var rightText: String? = null,
|
||||
var isRefresh: Boolean = false,
|
||||
var icon: String? = null,
|
||||
|
||||
@ -13,7 +13,7 @@ object HeadUpDisplayLogHelper {
|
||||
source = source,
|
||||
downloadType = if (downloadEntity.asVGame()) "畅玩下载" else "本地下载",
|
||||
downloadStatus = downloadEntity.getMetaExtra(Constants.DOWNLOAD_STATUS_IN_CHINESE),
|
||||
gameSchemaType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
|
||||
gameSchemeType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
|
||||
gameType = downloadEntity.getMetaExtra(Constants.GAME_CATEGORY_IN_CHINESE),
|
||||
gameId = downloadEntity.gameId,
|
||||
gameName = downloadEntity.name
|
||||
@ -25,7 +25,7 @@ object HeadUpDisplayLogHelper {
|
||||
source = source,
|
||||
downloadType = if (downloadEntity.asVGame()) "畅玩下载" else "本地下载",
|
||||
downloadStatus = downloadEntity.getMetaExtra(Constants.DOWNLOAD_STATUS_IN_CHINESE),
|
||||
gameSchemaType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
|
||||
gameSchemeType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
|
||||
gameType = downloadEntity.getMetaExtra(Constants.GAME_CATEGORY_IN_CHINESE),
|
||||
gameId = downloadEntity.gameId,
|
||||
gameName = downloadEntity.name
|
||||
@ -36,7 +36,7 @@ object HeadUpDisplayLogHelper {
|
||||
SensorsBridge.trackAutomaticInstallationPromptBarShow(
|
||||
downloadType = if (downloadEntity.asVGame()) "畅玩下载" else "本地下载",
|
||||
downloadStatus = downloadEntity.getMetaExtra(Constants.DOWNLOAD_STATUS_IN_CHINESE),
|
||||
gameSchemaType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
|
||||
gameSchemeType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
|
||||
gameType = downloadEntity.getMetaExtra(Constants.GAME_CATEGORY_IN_CHINESE),
|
||||
gameId = downloadEntity.gameId,
|
||||
gameName = downloadEntity.name
|
||||
@ -47,7 +47,7 @@ object HeadUpDisplayLogHelper {
|
||||
SensorsBridge.trackAutomaticInstallationPromptBarClick(
|
||||
downloadType = if (downloadEntity.asVGame()) "畅玩下载" else "本地下载",
|
||||
downloadStatus = downloadEntity.getMetaExtra(Constants.DOWNLOAD_STATUS_IN_CHINESE),
|
||||
gameSchemaType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
|
||||
gameSchemeType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
|
||||
gameType = downloadEntity.getMetaExtra(Constants.GAME_CATEGORY_IN_CHINESE),
|
||||
gameId = downloadEntity.gameId,
|
||||
gameName = downloadEntity.name
|
||||
|
||||
@ -14,6 +14,7 @@ import com.gh.gamecenter.GameDetailActivity
|
||||
import com.gh.gamecenter.R
|
||||
import com.gh.gamecenter.common.baselist.ListAdapter
|
||||
import com.gh.gamecenter.common.baselist.LoadType
|
||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
||||
import com.gh.gamecenter.common.constant.ItemViewType
|
||||
import com.gh.gamecenter.common.exposure.ExposureSource
|
||||
import com.gh.gamecenter.common.utils.*
|
||||
@ -280,7 +281,7 @@ class MyFollowedGameViewHolder(var binding: ItemFollowedGameBinding) : RecyclerV
|
||||
binding.root.context,
|
||||
gameEntity,
|
||||
entrance,
|
||||
defaultTab = GameDetailFragment.TAB_TRENDS
|
||||
defaultTab = EntranceConsts.TAB_TYPE_TRENDS
|
||||
)
|
||||
}
|
||||
} else {
|
||||
@ -306,7 +307,7 @@ class MyFollowedGameViewHolder(var binding: ItemFollowedGameBinding) : RecyclerV
|
||||
binding.root.context,
|
||||
gameEntity,
|
||||
entrance,
|
||||
defaultTab = GameDetailFragment.TAB_BBS
|
||||
defaultTab = EntranceConsts.TAB_TYPE_BBS
|
||||
)
|
||||
}
|
||||
} else {
|
||||
|
||||
@ -26,16 +26,13 @@ class PackageFilterManager {
|
||||
*/
|
||||
@SuppressLint("CheckResult")
|
||||
fun updateFilterPackages(
|
||||
packageList: List<String>,
|
||||
packageList: MutableList<String>,
|
||||
appendOnly: Boolean = true,
|
||||
callbackClosure: ((list: ArrayList<String>) -> Unit)? = null
|
||||
) {
|
||||
|
||||
val finalPackageList = ArrayList(packageList)
|
||||
|
||||
if (appendOnly) {
|
||||
// 添加因为异常而没能正常更新的包名列表
|
||||
finalPackageList.addAll(PackageRepository.mPendingPackageNameSet)
|
||||
packageList.addAll(PackageRepository.mPendingPackageNameSet)
|
||||
}
|
||||
|
||||
RetrofitManager.getInstance()
|
||||
|
||||
@ -7,7 +7,6 @@ import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
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.exposure.meta.MetaUtil
|
||||
@ -92,7 +91,8 @@ object PackageRepository {
|
||||
/**
|
||||
* 预留方法,如果想手动初始化可以调用
|
||||
*/
|
||||
fun initData(onPackageNameReceivedCallback: (() -> Unit)? = null) {
|
||||
@JvmStatic
|
||||
fun initData() {
|
||||
if (mIsInitialisingData) return
|
||||
|
||||
mIsInitialisingData = true
|
||||
@ -104,25 +104,17 @@ object PackageRepository {
|
||||
|
||||
Single.zip<Result<Any?>, Result<Any?>, Result<Any?>>(
|
||||
Single.create { emitter ->
|
||||
val list = PackageHelper.getInstalledPackageNameList(mApplication, 0)
|
||||
val list = PackageUtils.getAllPackageName(mApplication)
|
||||
uploadAppList()
|
||||
|
||||
// 回调包名获取结果
|
||||
onPackageNameReceivedCallback?.invoke()
|
||||
|
||||
initFilterPackage(list) { filteredList ->
|
||||
emitter.onSuccess(Result.success(null))
|
||||
|
||||
mInstalledPkgSet.addAll(filteredList)
|
||||
notifyInstallPkgData()
|
||||
loadInstalledGameDigestAndNotifyData(
|
||||
packageKey = packageFilterManager.packageKey,
|
||||
filteredList = filteredList,
|
||||
isVGame = false,
|
||||
updateInstallStatus = true,
|
||||
fromInit = true
|
||||
)
|
||||
loadInstalledGameDigestAndNotifyData(packageFilterManager.packageKey, filteredList)
|
||||
}
|
||||
|
||||
|
||||
},
|
||||
Single.create { emitter ->
|
||||
// 畅玩游戏更新
|
||||
@ -164,7 +156,7 @@ object PackageRepository {
|
||||
* 初始化光环后台收录的安装包
|
||||
*/
|
||||
private fun initFilterPackage(
|
||||
list: List<String>,
|
||||
list: MutableList<String>,
|
||||
callbackClosure: ((list: ArrayList<String>) -> Unit)? = null
|
||||
) {
|
||||
packageFilterManager.updateFilterPackages(list, false, callbackClosure)
|
||||
@ -257,15 +249,13 @@ object PackageRepository {
|
||||
* @param onWorkerThreadOnly 是否在工作线程执行
|
||||
* @param isVGame 包名列表是否为畅玩游戏
|
||||
* @param updateInstallStatus 更新安装状态 (通过 EventBus 来进行)
|
||||
* @param fromInit 是否来自数据首次初始化
|
||||
*/
|
||||
@SuppressLint("CheckResult")
|
||||
private fun loadInstalledGameDigestAndNotifyData(
|
||||
packageKey: String,
|
||||
filteredList: ArrayList<String>,
|
||||
isVGame: Boolean = false,
|
||||
updateInstallStatus: Boolean = false,
|
||||
fromInit: Boolean = false
|
||||
updateInstallStatus: Boolean = false
|
||||
) {
|
||||
var isNotifyUpdate = false
|
||||
val maxPageCount = (filteredList.size / PAGE_SIZE) + 1
|
||||
@ -294,7 +284,7 @@ object PackageRepository {
|
||||
|
||||
for (game in validGames) {
|
||||
val shouldNotifyChanges =
|
||||
validateGameAndPostChanges(gh_id, game, pkgName, isVGame, updateInstallStatus, fromInit)
|
||||
validateGameAndPostChanges(gh_id, game, pkgName, isVGame, updateInstallStatus)
|
||||
if (!isNotifyUpdate && shouldNotifyChanges) {
|
||||
isNotifyUpdate = true
|
||||
}
|
||||
@ -320,8 +310,7 @@ object PackageRepository {
|
||||
game: GameEntity,
|
||||
pkgName: String,
|
||||
isVGame: Boolean,
|
||||
updateInstallStatus: Boolean,
|
||||
fromInit: Boolean = false
|
||||
updateInstallStatus: Boolean
|
||||
): Boolean {
|
||||
if (ghId == null || ghId == game.id) {
|
||||
gameInstalled.add(GameInstall.transformGameInstall(game, pkgName, isVGame))
|
||||
@ -332,7 +321,7 @@ object PackageRepository {
|
||||
|
||||
if (updateInstallStatus) {
|
||||
EventBus.getDefault()
|
||||
.post(EBPackage(EBPackage.TYPE_INSTALLED, pkgName, game.getApk().firstOrNull()?.version, fromInit))
|
||||
.post(EBPackage(EBPackage.TYPE_INSTALLED, pkgName, game.getApk().firstOrNull()?.version))
|
||||
}
|
||||
|
||||
if (isCanUpdate || isCanPluggable) {
|
||||
|
||||
@ -183,6 +183,11 @@ class HaloPersonalFragment : BaseLazyFragment() {
|
||||
}
|
||||
}
|
||||
mStubBinding.personalMsg -> {
|
||||
// 优先进入有数字提醒的消息tab,其次是有红点提醒的游戏动态,最后是没有提醒的消息tab
|
||||
val defaultTabIndex = if ((mUnreadViewModel.messageUnreadCountLiveData.value?.message
|
||||
?: 0) < 1 && mUnreadViewModel.zixunConcernLiveData.value == true
|
||||
) 0 else 1
|
||||
|
||||
if (CheckLoginUtils.isLogin()) {
|
||||
NewFlatLogUtils.logHaloSelfClick("右上角", "消息中心")
|
||||
SensorsBridge.trackHaloSelfClick(
|
||||
@ -197,16 +202,11 @@ class HaloPersonalFragment : BaseLazyFragment() {
|
||||
"我的"
|
||||
)
|
||||
SensorsBridge.trackMessageCenterClick()
|
||||
|
||||
// 优先进入有数字提醒的消息tab,其次是有红点提醒的游戏动态,最后是没有提醒的消息tab
|
||||
val defaultTabIndex = if ((mUnreadViewModel.messageUnreadCountLiveData.value?.message
|
||||
?: 0) < 1 && mUnreadViewModel.zixunConcernLiveData.value == true
|
||||
) 0 else 1
|
||||
DirectUtils.directToMessageCenter(defaultTabIndex)
|
||||
} else {
|
||||
NewFlatLogUtils.logHaloSelfLogin()
|
||||
CheckLoginUtils.checkLogin(context, "我的光环-消息") {}
|
||||
}
|
||||
|
||||
DirectUtils.directToMessageCenter(defaultTabIndex, "我的光环-消息")
|
||||
}
|
||||
mStubBinding.personalUserIcon,
|
||||
mStubBinding.personalUserName -> {
|
||||
|
||||
@ -1,43 +1,56 @@
|
||||
package com.gh.gamecenter.personalhome
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import com.alibaba.android.arouter.facade.annotation.Autowired
|
||||
import com.alibaba.android.arouter.facade.annotation.Route
|
||||
import com.alibaba.android.arouter.launcher.ARouter
|
||||
import com.gh.gamecenter.common.base.activity.ToolBarActivity
|
||||
import com.gh.gamecenter.R
|
||||
import com.gh.gamecenter.common.base.activity.BaseActivity
|
||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
||||
import com.gh.gamecenter.common.constant.RouteConsts
|
||||
import com.gh.gamecenter.core.utils.DisplayUtils
|
||||
|
||||
/**
|
||||
* 个人主页
|
||||
*/
|
||||
@Route(
|
||||
path = RouteConsts.activity.userHomeActivity,
|
||||
name = "个人主页"
|
||||
)
|
||||
class UserHomeActivity : ToolBarActivity() {
|
||||
|
||||
override fun provideNormalIntent(): Intent {
|
||||
return getTargetIntent(this, UserHomeActivity::class.java, UserHomeFragment::class.java)
|
||||
}
|
||||
@JvmField
|
||||
@Autowired(name = EntranceConsts.KEY_USER_ID, desc = "用户 id (长 id 或短 id 均可)", required = true)
|
||||
var userId: String? = null
|
||||
|
||||
@JvmField
|
||||
@Autowired(name = EntranceConsts.KEY_TAB_INDEX, desc = "默认选中 tab 的序号,可选值 0 游戏,1 发布")
|
||||
var selectedTabIndex: Int = 0
|
||||
|
||||
@JvmField
|
||||
@Autowired(name = EntranceConsts.KEY_COMMUNITY_TYPE, desc = "默认选中的社区内容 tab 类型,可选值 all: 全部, video: 视频, community_article: 帖子, answer: 回答, question: 问题")
|
||||
var selectedCommunityType: String = ""
|
||||
|
||||
@JvmField
|
||||
@Autowired(name = EntranceConsts.KEY_GAME_TYPE, desc = "默认选中的游戏 tab 类型,可选值 game_collection: 游戏单, played_game: 玩过, comment: 评价")
|
||||
var selectedGameType: String = ""
|
||||
|
||||
@JvmField
|
||||
@Autowired(name = EntranceConsts.KEY_PATH, desc = "页面路径 (历史代码用到的,传不传都行)")
|
||||
var path: String = ""
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
// 注入 arouter 参数
|
||||
ARouter.getInstance().inject(this)
|
||||
|
||||
// 桥接 arouter 和原有入参
|
||||
generateDataFromRoute()
|
||||
|
||||
super.onCreate(savedInstanceState)
|
||||
hideToolbar(true)
|
||||
DisplayUtils.setStatusBarColor(this, com.gh.gamecenter.common.R.color.transparent, false)
|
||||
}
|
||||
|
||||
companion object {
|
||||
@JvmStatic
|
||||
fun getIntent(context: Context, userId: String, entrance: String?, path: String?): Intent {
|
||||
val bundle = Bundle()
|
||||
bundle.putString(EntranceConsts.KEY_USER_ID, userId)
|
||||
bundle.putString(EntranceConsts.KEY_ENTRANCE, BaseActivity.mergeEntranceAndPath(entrance, path))
|
||||
bundle.putString(EntranceConsts.KEY_PATH, path)
|
||||
return getTargetIntent(context, UserHomeActivity::class.java, UserHomeFragment::class.java, bundle)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getBusinessId(): Pair<String, String> {
|
||||
return Pair(targetFragment.arguments?.getString(EntranceConsts.KEY_USER_ID) ?: "", "")
|
||||
return Pair(userId ?: "", "")
|
||||
}
|
||||
|
||||
override fun isAutoResetViewBackgroundEnabled(): Boolean = true
|
||||
@ -48,4 +61,11 @@ class UserHomeActivity : ToolBarActivity() {
|
||||
listOf(R.id.allType, R.id.videoType, R.id.articleType, R.id.questionType, R.id.answerType, R.id.tab_title)
|
||||
)
|
||||
}
|
||||
|
||||
private fun generateDataFromRoute() {
|
||||
val bundle = intent.extras
|
||||
|
||||
intent?.putExtra(NORMAL_FRAGMENT_NAME, UserHomeFragment::class.java.canonicalName)
|
||||
intent?.putExtra(NORMAL_FRAGMENT_BUNDLE, bundle)
|
||||
}
|
||||
}
|
||||
@ -93,7 +93,6 @@ class UserHomeFragment : ToolbarFragment() {
|
||||
}
|
||||
|
||||
mHomeBinding?.container?.setZoomView(mHomeBinding?.userBackgroundContainer)
|
||||
// mHomeBinding?.userBadge?.visibleIf(mUserHomeViewModel.userId == UserManager.getInstance().userId)
|
||||
|
||||
mUserHomeViewModel.userInfo.observeNonNull(this) {
|
||||
// 区分是数据初始化还是数据更新
|
||||
@ -117,7 +116,6 @@ class UserHomeFragment : ToolbarFragment() {
|
||||
|
||||
updateUserInfo(it)
|
||||
updateTab(it)
|
||||
trackMtaEvent(it.name)
|
||||
} else {
|
||||
updateUserInfo(it)
|
||||
}
|
||||
@ -298,9 +296,9 @@ class UserHomeFragment : ToolbarFragment() {
|
||||
}
|
||||
|
||||
private fun updateTab(personalData: PersonalEntity) {
|
||||
val keyPosition = arguments?.getInt(EntranceConsts.KEY_POSITION, -1) ?: -1
|
||||
val type = UserHistoryViewModel.TYPE.fromValue(arguments?.getString(EntranceConsts.KEY_TYPE))
|
||||
val gameType = arguments?.getString(EntranceConsts.KEY_GAME) ?: "game_collection"
|
||||
val keyPosition = arguments?.getInt(EntranceConsts.KEY_TAB_INDEX, -1) ?: -1
|
||||
val type = UserHistoryViewModel.TYPE.fromValue(arguments?.getString(EntranceConsts.KEY_COMMUNITY_TYPE))
|
||||
val gameType = arguments?.getString(EntranceConsts.KEY_GAME_TYPE) ?: "game_collection"
|
||||
val count = personalData.count
|
||||
val position = if (keyPosition > -1) {
|
||||
keyPosition
|
||||
@ -335,7 +333,6 @@ class UserHomeFragment : ToolbarFragment() {
|
||||
FragmentAdapter(childFragmentManager, mFragmentList, titleList)
|
||||
mHomeBinding?.viewpager?.currentItem = position
|
||||
mHomeBinding?.viewpager?.doOnPageSelected {
|
||||
MtaHelper.onEvent("个人主页详情", "个人主页详情", titleList[it])
|
||||
if (it == 1) (mFragmentList[1] as UserHistoryFragment).onScrollStateChanged()
|
||||
}
|
||||
mHomeBinding?.tabLayout?.setupWithViewPager(mHomeBinding?.viewpager)
|
||||
@ -362,19 +359,6 @@ class UserHomeFragment : ToolbarFragment() {
|
||||
return view
|
||||
}
|
||||
|
||||
private fun trackMtaEvent(name: String? = "") {
|
||||
MtaHelper.onEvent(
|
||||
"个人主页",
|
||||
mPath,
|
||||
StringUtils.combineTwoString(name, mUserHomeViewModel.userId)
|
||||
)
|
||||
MtaHelper.onEvent(
|
||||
"个人主页",
|
||||
"不区分位置",
|
||||
StringUtils.combineTwoString(name, mUserHomeViewModel.userId)
|
||||
)
|
||||
}
|
||||
|
||||
private fun updateUnreadInfo(messageEntity: MessageUnreadEntity) {
|
||||
if (mUserHomeViewModel.userId == UserManager.getInstance().userId) {
|
||||
BindingAdapters.setMessageUnread(mHomeBinding?.userFansCountHint, messageEntity.fans)
|
||||
@ -557,7 +541,6 @@ class UserHomeFragment : ToolbarFragment() {
|
||||
log("view_pendant", "头像挂件页")
|
||||
}
|
||||
if (mUserHomeViewModel.userId == UserManager.getInstance().userId) {
|
||||
MtaHelper.onEvent("个人主页详情", "个人主页详情", "头像")
|
||||
startActivity(AvatarBorderActivity.getIntent(requireContext()))
|
||||
} else {
|
||||
startActivity(
|
||||
@ -575,7 +558,6 @@ class UserHomeFragment : ToolbarFragment() {
|
||||
|
||||
userFollowerContainer.setOnClickListener {
|
||||
IntegralLogHelper.log("click_follow", LOCATION)
|
||||
MtaHelper.onEvent("个人主页详情", "个人主页详情", "关注数")
|
||||
startActivity(
|
||||
FollowersActivity.getIntent(
|
||||
requireContext(),
|
||||
@ -587,7 +569,6 @@ class UserHomeFragment : ToolbarFragment() {
|
||||
}
|
||||
userFansContainer.setOnClickListener {
|
||||
IntegralLogHelper.log("click_follower", LOCATION)
|
||||
MtaHelper.onEvent("个人主页详情", "个人主页详情", "粉丝数")
|
||||
requireContext().startActivity(
|
||||
FansActivity.getIntent(
|
||||
requireContext(),
|
||||
@ -599,7 +580,6 @@ class UserHomeFragment : ToolbarFragment() {
|
||||
}
|
||||
userVoteContainer.setOnClickListener {
|
||||
IntegralLogHelper.log("click_like", LOCATION)
|
||||
MtaHelper.onEvent("个人主页详情", "个人主页详情", "赞同数")
|
||||
Utils.toast(
|
||||
requireContext(),
|
||||
"共获得 " + NumberUtils.transSimpleCount(personalData?.count?.vote!!) + " 赞同"
|
||||
@ -607,7 +587,6 @@ class UserHomeFragment : ToolbarFragment() {
|
||||
}
|
||||
userEditBtn.setOnClickListener {
|
||||
IntegralLogHelper.log("click_edit", LOCATION)
|
||||
MtaHelper.onEvent("个人主页详情", "个人主页详情", "编辑按钮")
|
||||
requireContext().startActivity(UserInfoActivity.getIntent(requireContext()))
|
||||
}
|
||||
userConcernContainer.setOnClickListener {
|
||||
@ -617,7 +596,6 @@ class UserHomeFragment : ToolbarFragment() {
|
||||
buttonName = "关注"
|
||||
)
|
||||
ifLogin("个人主页-关注-[关注]") {
|
||||
MtaHelper.onEvent("个人主页详情", "个人主页详情", "关注按钮")
|
||||
mUserHomeViewModel.follow()
|
||||
}
|
||||
}
|
||||
@ -629,7 +607,6 @@ class UserHomeFragment : ToolbarFragment() {
|
||||
buttonName = "已关注"
|
||||
)
|
||||
ifLogin("个人主页-关注-[关注]") {
|
||||
MtaHelper.onEvent("个人主页详情", "个人主页详情", "关注按钮")
|
||||
DialogHelper.showDialog(
|
||||
requireContext(),
|
||||
"取消关注",
|
||||
|
||||
@ -30,7 +30,6 @@ import com.gh.gamecenter.common.base.fragment.BaseFragment
|
||||
import com.gh.gamecenter.common.base.fragment.ToolbarFragment
|
||||
import com.gh.gamecenter.common.callback.ConfirmListener
|
||||
import com.gh.gamecenter.common.constant.Constants
|
||||
import com.gh.gamecenter.common.constant.Constants.GAME_DETAIL_COME_IN
|
||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
||||
import com.gh.gamecenter.common.entity.NormalShareEntity
|
||||
import com.gh.gamecenter.common.entity.SuggestType
|
||||
@ -594,7 +593,6 @@ open class AnswerDetailFragment : ToolbarFragment() {
|
||||
when (menuItem.itemId) {
|
||||
R.id.menu_more -> mViewModel.answerDetail?.let { showMoreItemDialog(it) }
|
||||
R.id.menu_question_and_answer -> {
|
||||
HaloApp.remove(GAME_DETAIL_COME_IN)
|
||||
val community = mViewModel.answerDetail?.community
|
||||
MtaHelper.onEvent(
|
||||
"进入问答",
|
||||
@ -1132,8 +1130,6 @@ open class AnswerDetailFragment : ToolbarFragment() {
|
||||
(requireActivity() as ToolBarActivity).clearMenu()
|
||||
|
||||
initMenu(R.menu.menu_answer)
|
||||
val itemMenu = getItemMenu(R.id.menu_question_and_answer)
|
||||
itemMenu.isVisible = HaloApp.get(GAME_DETAIL_COME_IN, false) != null
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -72,7 +72,7 @@ public class PackageChangeBroadcastReceiver extends BroadcastReceiver {
|
||||
PackageHelper.refreshLocalPackageList();
|
||||
|
||||
String versionName = PackageUtils.getVersionNameByPackageName(packageName);
|
||||
EBPackage installEb = new EBPackage(EBPackage.TYPE_INSTALLED, packageName, versionName, false);
|
||||
EBPackage installEb = new EBPackage(EBPackage.TYPE_INSTALLED, packageName, versionName);
|
||||
if (PackageUtils.isAppOnForeground(context)) {
|
||||
PackageObserver.onPackageChanged(installEb, null);
|
||||
EventBus.getDefault().post(installEb);
|
||||
@ -102,7 +102,7 @@ public class PackageChangeBroadcastReceiver extends BroadcastReceiver {
|
||||
InstallUtils.getInstance().removeUninstall(packageName);
|
||||
PackageHelper.refreshLocalPackageList();
|
||||
|
||||
EBPackage uninstallEb = new EBPackage(EBPackage.TYPE_UNINSTALLED, packageName, "", false);
|
||||
EBPackage uninstallEb = new EBPackage(EBPackage.TYPE_UNINSTALLED, packageName, "");
|
||||
PackageObserver.onPackageChanged(uninstallEb, null);
|
||||
EventBus.getDefault().post(uninstallEb);
|
||||
if (webviewPackageName.equals(packageName)) {
|
||||
@ -118,7 +118,7 @@ public class PackageChangeBroadcastReceiver extends BroadcastReceiver {
|
||||
Utils.log(TAG, "替换了:" + packageName + "包名的程序");
|
||||
String versionName = PackageUtils.getVersionNameByPackageName(packageName);
|
||||
|
||||
EBPackage updateEb = new EBPackage(EBPackage.TYPE_REPLACED, packageName, versionName, false);
|
||||
EBPackage updateEb = new EBPackage(EBPackage.TYPE_REPLACED, packageName, versionName);
|
||||
EventBus.getDefault().post(updateEb);
|
||||
PackageObserver.onPackageChanged(updateEb, null);
|
||||
if (webviewPackageName.equals(packageName)) {
|
||||
|
||||
@ -1,9 +1,6 @@
|
||||
package com.gh.gamecenter.search
|
||||
|
||||
import android.graphics.Color
|
||||
import android.graphics.LinearGradient
|
||||
import android.graphics.Shader
|
||||
import android.graphics.Typeface
|
||||
import android.graphics.drawable.GradientDrawable
|
||||
import android.os.Bundle
|
||||
import android.text.TextUtils
|
||||
@ -18,7 +15,6 @@ import androidx.viewpager.widget.PagerAdapter
|
||||
import com.gh.common.constant.Config
|
||||
import com.gh.common.exposure.ExposureManager
|
||||
import com.gh.common.filter.RegionSettingHelper
|
||||
import com.gh.common.util.DirectUtils
|
||||
import com.gh.common.util.NewFlatLogUtils
|
||||
import com.gh.gamecenter.R
|
||||
import com.gh.gamecenter.SearchActivity
|
||||
@ -35,7 +31,7 @@ import com.gh.gamecenter.databinding.TabItemSearchDefaultRankBinding
|
||||
import com.gh.gamecenter.db.ISearchHistoryDao
|
||||
import com.gh.gamecenter.db.SearchHistoryDao
|
||||
import com.gh.gamecenter.eventbus.EBSearch
|
||||
import com.gh.gamecenter.feature.entity.HotTagEntity
|
||||
import com.gh.gamecenter.feature.entity.DiscoveryTagEntity
|
||||
import com.gh.gamecenter.feature.entity.SettingsEntity
|
||||
import com.gh.gamecenter.feature.exposure.ExposureEvent
|
||||
import com.google.android.flexbox.FlexboxLayout
|
||||
@ -47,7 +43,7 @@ import org.json.JSONObject
|
||||
|
||||
open class SearchDefaultFragment : BaseFragment<Any>() {
|
||||
|
||||
private var mHotTagList: List<HotTagEntity>? = null
|
||||
private var mSearchDiscoveryTagList: List<DiscoveryTagEntity>? = null
|
||||
protected var mRankList: List<SettingsEntity.Search.RankList>? = null
|
||||
|
||||
protected lateinit var mBinding: FragmentSearchDefaultBinding
|
||||
@ -66,28 +62,28 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
||||
|
||||
private val mDao by lazy { provideDao() }
|
||||
|
||||
private val mHotTagClickListener: (Int) -> Unit = {
|
||||
val tag = mHotTagList!![it]
|
||||
NewFlatLogUtils.logSearchHotTagClick(
|
||||
tag.name ?: "",
|
||||
tag.type ?: "",
|
||||
tag.link ?: "",
|
||||
tag.text ?: ""
|
||||
)
|
||||
DataLogUtils.uploadHotTagLog(context, tag.name)
|
||||
PageSwitchDataHelper.pushCurrentPageData(
|
||||
hashMapOf(
|
||||
Pair(PageSwitchDataHelper.PAGE_BUSINESS_TYPE, "游戏搜索-热门标签"),
|
||||
Pair(PageSwitchDataHelper.PAGE_BUSINESS_ID, tag.id ?: ""),
|
||||
Pair(PageSwitchDataHelper.PAGE_BUSINESS_NAME, tag.name ?: " ")
|
||||
private val mSearchDiscoveryTagClickListener: (Int) -> Unit = {
|
||||
val tag = mSearchDiscoveryTagList!![it]
|
||||
val keyword = tag.keyword
|
||||
if (keyword.isNotEmpty()) {
|
||||
PageSwitchDataHelper.pushCurrentPageData(
|
||||
hashMapOf(
|
||||
Pair(PageSwitchDataHelper.PAGE_BUSINESS_TYPE, "游戏搜索-搜索发现"),
|
||||
Pair(PageSwitchDataHelper.PAGE_BUSINESS_ID, tag.id ?: ""),
|
||||
Pair(PageSwitchDataHelper.PAGE_BUSINESS_NAME, tag.text ?: " ")
|
||||
)
|
||||
)
|
||||
)
|
||||
SensorsBridge.trackEvent("SearchLabelClick", "label_name", tag.name ?: "", "label_id", tag.id ?: "")
|
||||
val exposureEvent = ExposureEvent.createEvent(
|
||||
null,
|
||||
source = listOf(ExposureSource("首页搜索", ""), ExposureSource("热门标签", tag.name ?: ""))
|
||||
)
|
||||
DirectUtils.directToLinkPage(requireContext(), tag, "(搜索-${tag.name})", "", exposureEvent) // 不需要path
|
||||
SensorsBridge.trackEvent("SearchLabelClick", "label_name", tag.text ?: "", "label_id", tag.id ?: "")
|
||||
SensorsBridge.trackSearchDiscoveryClick(
|
||||
labelName = tag.text ?: "",
|
||||
labelId = tag.id ?: "",
|
||||
searchContent = keyword,
|
||||
position = it
|
||||
)
|
||||
mViewModel?.add(keyword)
|
||||
EventBus.getDefault().post(EBSearch("history", keyword))
|
||||
Util_System_Keyboard.hideSoftKeyboardByIBinder(context, mBinding.historyFlex.windowToken)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getLayoutId(): Int {
|
||||
@ -140,16 +136,20 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
||||
}
|
||||
mViewModel?.isExistRankList = mRankList?.isNotEmpty() == true
|
||||
|
||||
mHotTagList = Config.getSettings()?.search?.hotTag
|
||||
mViewModel?.isExistHotTag = mHotTagList?.isNotEmpty() == true
|
||||
mSearchDiscoveryTagList = Config.getSettings()?.search?.discoveryTag
|
||||
mViewModel?.isExistSearchDiscoveryTag = mSearchDiscoveryTagList?.isNotEmpty() == true
|
||||
|
||||
updateHistorySearchView(null)
|
||||
mViewModel?.historySearchLiveData?.observe(viewLifecycleOwner) {
|
||||
updateHistorySearchView(it)
|
||||
}
|
||||
|
||||
mBinding.hotTagFlexContainer.setLimitHeight(mFlexMaxHeight)
|
||||
createFlexContent(mBinding.hotTagFlex, getTagListString(), true, clickListener = mHotTagClickListener)
|
||||
mBinding.searchDiscoveryTagFlexContainer.setLimitHeight(mFlexMaxHeight)
|
||||
createFlexContent(
|
||||
mBinding.searchDiscoveryTagFlex,
|
||||
getTagListString(),
|
||||
clickListener = mSearchDiscoveryTagClickListener
|
||||
)
|
||||
initHeadView()
|
||||
initRankViewPager()
|
||||
}
|
||||
@ -178,12 +178,12 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
||||
})
|
||||
}
|
||||
}
|
||||
mBinding.hotHeadContainer.headTitle.text = getString(R.string.search_hot)
|
||||
mBinding.hotHeadContainer.headTitle.textSize = 16F
|
||||
mBinding.hotHeadContainer.headActionTv.visibility = View.GONE
|
||||
mBinding.hotTagHeadContainer.headTitle.text = getString(R.string.search_hot_tag)
|
||||
mBinding.hotTagHeadContainer.headTitle.textSize = 16F
|
||||
mBinding.hotTagHeadContainer.headActionTv.visibility = View.GONE
|
||||
mBinding.searchDiscoveryHeadContainer.headTitle.text = getString(R.string.search_hot)
|
||||
mBinding.searchDiscoveryHeadContainer.headTitle.textSize = 16F
|
||||
mBinding.searchDiscoveryHeadContainer.headActionTv.visibility = View.GONE
|
||||
mBinding.searchDiscoveryTagHeadContainer.headTitle.text = getString(R.string.search_discovery_tag)
|
||||
mBinding.searchDiscoveryTagHeadContainer.headTitle.textSize = 16F
|
||||
mBinding.searchDiscoveryTagHeadContainer.headActionTv.visibility = View.GONE
|
||||
}
|
||||
|
||||
protected open fun initRankViewPager() {
|
||||
@ -318,8 +318,8 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
||||
mBinding.historyHeadContainer.root.visibility =
|
||||
if (mViewModel?.isExistHistory == true) View.VISIBLE else View.GONE
|
||||
mBinding.historyFlex.visibility = if (mViewModel?.isExistHistory == true) View.VISIBLE else View.GONE
|
||||
mBinding.hotTagHeadContainer.root.layoutParams =
|
||||
(mBinding.hotTagHeadContainer.root.layoutParams as ConstraintLayout.LayoutParams).apply {
|
||||
mBinding.searchDiscoveryTagHeadContainer.root.layoutParams =
|
||||
(mBinding.searchDiscoveryTagHeadContainer.root.layoutParams as ConstraintLayout.LayoutParams).apply {
|
||||
setMargins(
|
||||
0,
|
||||
if (mViewModel?.isExistHistory == true) 16F.dip2px() else 0,
|
||||
@ -327,21 +327,22 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
||||
0
|
||||
)
|
||||
}
|
||||
mBinding.hotHeadContainer.root.layoutParams =
|
||||
(mBinding.hotHeadContainer.root.layoutParams as ConstraintLayout.LayoutParams).apply {
|
||||
mBinding.searchDiscoveryHeadContainer.root.layoutParams =
|
||||
(mBinding.searchDiscoveryHeadContainer.root.layoutParams as ConstraintLayout.LayoutParams).apply {
|
||||
setMargins(
|
||||
0,
|
||||
if (mViewModel?.isExistHistory == false && mViewModel?.isExistHotTag == false) 16F.dip2px() else 0,
|
||||
if (mViewModel?.isExistHistory == false && mViewModel?.isExistSearchDiscoveryTag == false) 16F.dip2px() else 0,
|
||||
0,
|
||||
0
|
||||
)
|
||||
}
|
||||
mBinding.hotTagHeadContainer.root.visibility =
|
||||
if (mViewModel?.isExistHotTag == true) View.VISIBLE else View.GONE
|
||||
mBinding.hotTagFlex.visibility = if (mViewModel?.isExistHotTag == true) View.VISIBLE else View.GONE
|
||||
mBinding.hotHeadContainer.root.visibility =
|
||||
mBinding.searchDiscoveryTagHeadContainer.root.visibility =
|
||||
if (mViewModel?.isExistSearchDiscoveryTag == true) View.VISIBLE else View.GONE
|
||||
mBinding.searchDiscoveryTagFlex.visibility =
|
||||
if (mViewModel?.isExistSearchDiscoveryTag == true) View.VISIBLE else View.GONE
|
||||
mBinding.searchDiscoveryHeadContainer.root.visibility =
|
||||
if (mViewModel?.isExistHotSearch == true) View.VISIBLE else View.GONE
|
||||
mBinding.hotList.visibility = if (mViewModel?.isExistHotSearch == true) View.VISIBLE else View.GONE
|
||||
mBinding.searchDiscoveryList.visibility = if (mViewModel?.isExistHotSearch == true) View.VISIBLE else View.GONE
|
||||
mBinding.rankTabLayout.visibility = if (mViewModel?.isExistRankList == true) View.VISIBLE else View.GONE
|
||||
mBinding.rankTabIndicator.visibility = if (mViewModel?.isExistRankList == true) View.VISIBLE else View.GONE
|
||||
mBinding.rankViewPager.visibility = if (mViewModel?.isExistRankList == true) View.VISIBLE else View.GONE
|
||||
@ -363,9 +364,9 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
||||
|
||||
private fun getTagListString(): List<String> {
|
||||
val list = ArrayList<String>()
|
||||
if (mHotTagList != null) {
|
||||
for (entity in mHotTagList!!) {
|
||||
entity.name?.let { list.add(it) }
|
||||
if (mSearchDiscoveryTagList != null) {
|
||||
for (entity in mSearchDiscoveryTagList!!) {
|
||||
entity.text?.let { list.add(it) }
|
||||
}
|
||||
}
|
||||
return list
|
||||
@ -374,7 +375,6 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
||||
fun createFlexContent(
|
||||
flexView: FlexboxLayout,
|
||||
contentList: List<String>?,
|
||||
isHotTag: Boolean = false,
|
||||
clickListener: (Int) -> Unit
|
||||
) {
|
||||
|
||||
@ -388,16 +388,12 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
||||
val params = FlexboxLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 24F.dip2px())
|
||||
flexCell.layoutParams = params
|
||||
|
||||
if (isHotTag && !mHotTagList.isNullOrEmpty() && mHotTagList!![index].isGuessSearch) {
|
||||
createSmartHotTagStyle(flexCell, contentList[index])
|
||||
} else {
|
||||
flexCell.setSingleLine()
|
||||
flexCell.ellipsize = TextUtils.TruncateAt.END
|
||||
flexCell.gravity = Gravity.CENTER
|
||||
flexCell.textSize = 12F
|
||||
flexCell.text = StringUtils.shrinkStringWithDot(contentList[index], 6)
|
||||
flexCell.setTextColor(com.gh.gamecenter.common.R.color.text_secondary.toColor(requireContext()))
|
||||
}
|
||||
flexCell.setSingleLine()
|
||||
flexCell.ellipsize = TextUtils.TruncateAt.END
|
||||
flexCell.gravity = Gravity.CENTER
|
||||
flexCell.textSize = 12F
|
||||
flexCell.text = StringUtils.shrinkStringWithDot(contentList[index], 6)
|
||||
flexCell.setTextColor(com.gh.gamecenter.common.R.color.text_secondary.toColor(requireContext()))
|
||||
flexCell.setPadding(8F.dip2px(), 0, 8F.dip2px(), 0)
|
||||
flexCell.background = if (mIsDarkModeOn) GradientDrawable().apply {
|
||||
setStroke(0.5F.dip2px(), Color.parseColor("#21FFFFFF"))
|
||||
@ -409,30 +405,6 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun createSmartHotTagStyle(flexCell: TextView, name: String) {
|
||||
flexCell.setDrawableStart(R.drawable.ic_smart_search)
|
||||
flexCell.compoundDrawablePadding = 4F.dip2px()
|
||||
flexCell.gravity = Gravity.CENTER_VERTICAL
|
||||
flexCell.typeface = Typeface.DEFAULT_BOLD
|
||||
flexCell.textSize = 12F
|
||||
flexCell.text = StringUtils.shrinkStringWithDot(name, 6)
|
||||
flexCell.setTextColor(Color.WHITE)
|
||||
val colors =
|
||||
intArrayOf(com.gh.gamecenter.common.R.color.text_FFB749.toColor(requireContext()), com.gh.gamecenter.common.R.color.text_FF6D3C.toColor(requireContext()))
|
||||
val position = floatArrayOf(0F, 1F)
|
||||
val linearGradient = LinearGradient(
|
||||
0F,
|
||||
0F,
|
||||
flexCell.paint.textSize * flexCell.text.length,
|
||||
0F,
|
||||
colors,
|
||||
position,
|
||||
Shader.TileMode.CLAMP
|
||||
)
|
||||
flexCell.paint.shader = linearGradient
|
||||
flexCell.invalidate()
|
||||
}
|
||||
|
||||
private fun postExposureEvent(index: Int) {
|
||||
mRankList?.safelyGetInRelease(index)?.content?.forEach {
|
||||
if (it.link.type == "game") {
|
||||
@ -447,11 +419,15 @@ open class SearchDefaultFragment : BaseFragment<Any>() {
|
||||
super.onDarkModeChanged()
|
||||
initHeadView()
|
||||
mBinding.rootContainer.setBackgroundColor(com.gh.gamecenter.common.R.color.ui_surface.toColor(requireContext()))
|
||||
mBinding.hotList.adapter?.run {
|
||||
mBinding.searchDiscoveryList.adapter?.run {
|
||||
notifyItemRangeChanged(0, itemCount)
|
||||
}
|
||||
mViewModel?.historySearchLiveData?.value?.let { updateHistorySearchView(it) }
|
||||
createFlexContent(mBinding.hotTagFlex, getTagListString(), true, clickListener = mHotTagClickListener)
|
||||
createFlexContent(
|
||||
mBinding.searchDiscoveryTagFlex,
|
||||
getTagListString(),
|
||||
clickListener = mSearchDiscoveryTagClickListener
|
||||
)
|
||||
}
|
||||
|
||||
protected open fun provideDao(): ISearchHistoryDao =
|
||||
|
||||
@ -11,7 +11,7 @@ class SearchDefaultViewModel(private val dao: ISearchHistoryDao) : ViewModel() {
|
||||
it
|
||||
}
|
||||
var isExistHotSearch: Boolean = false
|
||||
var isExistHotTag: Boolean = false
|
||||
var isExistSearchDiscoveryTag: Boolean = false
|
||||
var isExistHistory: Boolean = false
|
||||
var isExistRankList: Boolean = false
|
||||
|
||||
|
||||
@ -22,6 +22,7 @@ import com.gh.gamecenter.adapter.viewholder.GameViewHolder
|
||||
import com.gh.gamecenter.adapter.viewholder.SearchHistoryViewHolder
|
||||
import com.gh.gamecenter.common.baselist.ListAdapter
|
||||
import com.gh.gamecenter.common.constant.Constants
|
||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
||||
import com.gh.gamecenter.common.constant.ItemViewType
|
||||
import com.gh.gamecenter.common.exposure.ExposureSource
|
||||
import com.gh.gamecenter.common.json.json
|
||||
@ -250,7 +251,7 @@ class SearchGameIndexAdapter(
|
||||
StringUtils.buildString(
|
||||
entrance, "+(搜索-列表[", key, "=", "$type=",
|
||||
(holder.adapterPosition + 1).toString(), "])"
|
||||
), GameDetailFragment.TAB_TRENDS, traceEvent = exposureEvent
|
||||
), EntranceConsts.TAB_TYPE_TRENDS, traceEvent = exposureEvent
|
||||
)
|
||||
|
||||
gameEntity.run {
|
||||
@ -326,7 +327,7 @@ class SearchGameIndexAdapter(
|
||||
StringUtils.buildString(
|
||||
entrance, "+(搜索-列表[", key, "=", "$type=",
|
||||
(holder.adapterPosition + 1).toString(), "])"
|
||||
), GameDetailFragment.TAB_BBS, traceEvent = exposureEvent
|
||||
), EntranceConsts.TAB_TYPE_BBS, traceEvent = exposureEvent
|
||||
)
|
||||
|
||||
gameEntity.run {
|
||||
|
||||
@ -214,7 +214,7 @@ class SearchGameIndexFragment : ListFragment<GameEntity, SearchGameResultViewMod
|
||||
// 安装/卸载 事件
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
fun onEventMainThread(busFour: EBPackage) {
|
||||
if (!busFour.fromInit && busFour.isInstalledOrUninstalled()) {
|
||||
if (busFour.isInstalledOrUninstalled()) {
|
||||
mAdapter?.notifyDataSetChanged()
|
||||
}
|
||||
}
|
||||
|
||||
@ -25,6 +25,7 @@ import com.gh.gamecenter.adapter.viewholder.SearchGameFooterViewHolder
|
||||
import com.gh.gamecenter.common.base.GlobalActivityManager
|
||||
import com.gh.gamecenter.common.baselist.ListAdapter
|
||||
import com.gh.gamecenter.common.constant.Constants
|
||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
||||
import com.gh.gamecenter.common.constant.ItemViewType
|
||||
import com.gh.gamecenter.common.entity.SimpleGameEntity
|
||||
import com.gh.gamecenter.common.entity.SuggestType
|
||||
@ -58,7 +59,7 @@ class SearchGameResultAdapter(
|
||||
private val dao: ISearchHistoryDao,
|
||||
val listViewModel: SearchGameResultViewModel,
|
||||
val entrance: String,
|
||||
var type: String,
|
||||
val type: String,
|
||||
val sourceEntrance: String
|
||||
) : ListAdapter<SearchItemData>(context), IExposable {
|
||||
|
||||
@ -580,7 +581,7 @@ class SearchGameResultAdapter(
|
||||
StringUtils.buildString(
|
||||
entrance, "+(搜索-列表[", key, "=", "$type=",
|
||||
(position + 1).toString(), "])"
|
||||
), GameDetailFragment.TAB_TRENDS, traceEvent = exposureEvent
|
||||
), EntranceConsts.TAB_TYPE_TRENDS, traceEvent = exposureEvent
|
||||
)
|
||||
|
||||
gameEntity.run {
|
||||
@ -656,7 +657,7 @@ class SearchGameResultAdapter(
|
||||
StringUtils.buildString(
|
||||
entrance, "+(搜索-列表[", key, "=", "$type=",
|
||||
(position + 1).toString(), "])"
|
||||
), GameDetailFragment.TAB_BBS, traceEvent = exposureEvent
|
||||
), EntranceConsts.TAB_TYPE_BBS, traceEvent = exposureEvent
|
||||
)
|
||||
|
||||
gameEntity.run {
|
||||
|
||||
@ -376,7 +376,6 @@ open class SearchGameResultFragment : ListFragment<GameEntity, SearchGameResultV
|
||||
this.mKey = key
|
||||
this.mType = type
|
||||
mAdapter?.key = key
|
||||
mAdapter?.type = type
|
||||
mAdapter?.clearAdIdSet()
|
||||
mListViewModel?.updateSearchKeyWithType(key, type)
|
||||
mListViewModel?.clearSearchSubjects()
|
||||
@ -424,7 +423,7 @@ open class SearchGameResultFragment : ListFragment<GameEntity, SearchGameResultV
|
||||
// 安装/卸载 事件
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
fun onEventMainThread(busFour: EBPackage) {
|
||||
if (!busFour.fromInit && busFour.isInstalledOrUninstalled()) {
|
||||
if (busFour.isInstalledOrUninstalled()) {
|
||||
mAdapter?.notifyDataSetChanged()
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,9 +3,9 @@ package com.gh.gamecenter.search.viewmodel
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import com.gh.gamecenter.SearchActivity
|
||||
import com.gh.gamecenter.common.base.GlobalActivityManager
|
||||
import com.gh.gamecenter.common.utils.SensorsBridge
|
||||
import io.reactivex.disposables.CompositeDisposable
|
||||
|
||||
class SearchTabViewModel : ViewModel() {
|
||||
|
||||
@ -21,8 +21,7 @@ class SearchTabViewModel : ViewModel() {
|
||||
GlobalActivityManager.getCurrentPageEntity().pageName,
|
||||
location,
|
||||
searchKeyAndType.value?.first ?: "",
|
||||
searchKeyAndType.value?.let {
|
||||
SearchActivity.toTrackSearchType(it.second) } ?: "",
|
||||
searchKeyAndType.value?.second ?: "",
|
||||
text ?: "",
|
||||
position
|
||||
)
|
||||
|
||||
@ -207,7 +207,7 @@ open class SubjectListFragment : LazyListFragment<GameEntity, SubjectListViewMod
|
||||
// 安装/卸载 事件
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
fun onEventMainThread(busFour: EBPackage) {
|
||||
if (!busFour.fromInit && busFour.isInstalledOrUninstalled()) {
|
||||
if (busFour.isInstalledOrUninstalled()) {
|
||||
mAdapter?.notifyDataSetChanged()
|
||||
}
|
||||
}
|
||||
|
||||
@ -197,7 +197,7 @@ class TagsListFragment : ListFragment<GameEntity, TagsListViewModel>() {
|
||||
// 安装/卸载 事件
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
fun onEventMainThread(busFour: EBPackage) {
|
||||
if (!busFour.fromInit && busFour.isInstalledOrUninstalled()) {
|
||||
if (busFour.isInstalledOrUninstalled()) {
|
||||
mAdapter?.notifyDataSetChanged()
|
||||
}
|
||||
}
|
||||
|
||||
@ -187,7 +187,7 @@ class VoteAdapter(
|
||||
EntranceConsts.HOST_GAME -> {
|
||||
startGameDetailActivity(
|
||||
mContext,
|
||||
link.link!!, entrance, -1,
|
||||
link.link!!, entrance,
|
||||
isSkipGameComment = false,
|
||||
scrollToLibao = false,
|
||||
openVideoStreaming = false,
|
||||
|
||||
@ -20,9 +20,6 @@ import com.gh.gamecenter.entity.DiverterEntity
|
||||
import com.gh.gamecenter.entity.MultiTabNav
|
||||
import com.gh.gamecenter.home.custom.model.CustomPageData
|
||||
import com.gh.gamecenter.retrofit.RetrofitManager
|
||||
import com.halo.assistant.HaloApp
|
||||
import io.reactivex.Observable
|
||||
import io.reactivex.disposables.Disposable
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.SupervisorJob
|
||||
@ -62,13 +59,10 @@ class MainWrapperRepository {
|
||||
private val mTabSelectEventFlow = MutableSharedFlow<MainSelectedEvent>()
|
||||
val tabSelectEventFlow = mTabSelectEventFlow as SharedFlow<MainSelectedEvent>
|
||||
|
||||
private var mDisposable: Disposable? = null
|
||||
private var mCheckGidCount = 0
|
||||
|
||||
fun init() {
|
||||
// 若 timeout 后数据未加载完成,则即便还没有回调也使用默认数据生成底部 tab
|
||||
emitDefaultTabDataAfterTimeout()
|
||||
checkGidAndGetBypassList()
|
||||
getBypassList()
|
||||
}
|
||||
|
||||
/**
|
||||
@ -155,33 +149,8 @@ class MainWrapperRepository {
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkGidAndGetBypassList() {
|
||||
if (HaloApp.getInstance().gid.isNullOrEmpty()) {
|
||||
stopCheckGid()
|
||||
mDisposable = Observable.interval(100, TimeUnit.MILLISECONDS)
|
||||
.subscribeOn(Schedulers.computation())
|
||||
.subscribe({
|
||||
mCheckGidCount++
|
||||
if (!HaloApp.getInstance().gid.isNullOrEmpty() || mCheckGidCount >= CHECK_GID_MAX_COUNT) {
|
||||
stopCheckGid()
|
||||
getBypassList()
|
||||
}
|
||||
}, {
|
||||
stopCheckGid()
|
||||
})
|
||||
} else {
|
||||
getBypassList()
|
||||
}
|
||||
}
|
||||
|
||||
private fun stopCheckGid() {
|
||||
mDisposable?.dispose()
|
||||
mDisposable = null
|
||||
mCheckGidCount = 0
|
||||
}
|
||||
|
||||
@SuppressLint("CheckResult")
|
||||
private fun getBypassList() {
|
||||
fun getBypassList() {
|
||||
val isInstallFirstAccess = TimeUtils.isToday(SPUtils.getLong(Constants.SP_BRAND_NEW_FIRST_LAUNCH_TIME) / 1000).toString()
|
||||
mNewApi.getDiverterList(isInstallFirstAccess, BYPASS_TYPE_BOTTOM_TAB)
|
||||
.subscribeOn(Schedulers.computation())
|
||||
@ -325,7 +294,6 @@ class MainWrapperRepository {
|
||||
|
||||
companion object : SingletonHolder<MainWrapperRepository>({ MainWrapperRepository() }) {
|
||||
private const val BYPASS_TIME_OUT = 1000L
|
||||
private const val CHECK_GID_MAX_COUNT = 5
|
||||
const val BYPASS_TYPE_BOTTOM_TAB = "bottom_tab"
|
||||
}
|
||||
}
|
||||
|
||||
@ -361,21 +361,16 @@ class SearchToolbarTabWrapperFragment : BaseTabWrapperFragment(), ISearchToolbar
|
||||
|
||||
R.id.actionbar_notification -> {
|
||||
DataCollectionUtils.uploadClick(activity, "消息图标", "主页")
|
||||
CheckLoginUtils.checkLogin(requireContext(), "(工具栏)") {
|
||||
NewLogUtils.logMessageInformBellClick(
|
||||
messageUnread?.visibility == View.VISIBLE,
|
||||
"首页"
|
||||
)
|
||||
SensorsBridge.trackMessageCenterClick()
|
||||
// 优先进入有数字提醒的消息tab,其次是有红点提醒的游戏动态,最后是没有提醒的消息tab
|
||||
var defaultTabIndex = 1
|
||||
val messageUnreadCount = unreadViewModel.messageUnreadCountLiveData.value
|
||||
val isConcernUnread = unreadViewModel.zixunConcernLiveData.value
|
||||
if ((messageUnreadCount == null || messageUnreadCount.message < 1) && isConcernUnread == true) {
|
||||
defaultTabIndex = 0
|
||||
}
|
||||
DirectUtils.directToMessageCenter(defaultTabIndex)
|
||||
NewLogUtils.logMessageInformBellClick(messageUnread?.visibility == View.VISIBLE, "首页")
|
||||
SensorsBridge.trackMessageCenterClick()
|
||||
// 优先进入有数字提醒的消息tab,其次是有红点提醒的游戏动态,最后是没有提醒的消息tab
|
||||
var defaultTabIndex = 1
|
||||
val messageUnreadCount = unreadViewModel.messageUnreadCountLiveData.value
|
||||
val isConcernUnread = unreadViewModel.zixunConcernLiveData.value
|
||||
if ((messageUnreadCount == null || messageUnreadCount.message < 1) && isConcernUnread == true) {
|
||||
defaultTabIndex = 0
|
||||
}
|
||||
DirectUtils.directToMessageCenter(defaultTabIndex, "(工具栏)")
|
||||
}
|
||||
|
||||
R.id.actionbar_teenager_model -> {
|
||||
|
||||
@ -3,6 +3,7 @@ package com.gh.ndownload.suspendwindow
|
||||
import android.app.Activity
|
||||
import android.app.Application
|
||||
import android.app.Application.ActivityLifecycleCallbacks
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import androidx.core.view.ViewCompat
|
||||
import com.gh.gamecenter.common.constant.Constants
|
||||
@ -127,7 +128,7 @@ class NDownloadDrawOverlayPermissionWindowController(val application: Applicatio
|
||||
SensorsBridge.trackDownloadSuspendedWindowGuideShow(
|
||||
gameId = downloadEntity.gameId,
|
||||
gameName = downloadEntity.name,
|
||||
gameSchemaType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
|
||||
gameSchemeType = if (downloadEntity.getMetaExtra(Constants.KEY_BIT) == "32") "32位" else "64位",
|
||||
gameType = downloadEntity.categoryChinese,
|
||||
downloadStatus = downloadEntity.getMetaExtra(Constants.DOWNLOAD_STATUS_IN_CHINESE),
|
||||
downloadType = if (downloadEntity.asVGame()) "畅玩下载" else "本地下载"
|
||||
|
||||
@ -48,17 +48,10 @@ abstract class NDownloadSuspendWindow<T : View>(
|
||||
|
||||
fun attach() {
|
||||
if (!isAttached) {
|
||||
try {
|
||||
_isAttached = true
|
||||
windowManager.addView(root, layoutParams)
|
||||
context.registerComponentCallbacks(this)
|
||||
onAttach()
|
||||
} catch (e: Throwable) {
|
||||
// 处理“Unable to add window android.view.ViewRootImpl$W@7bc9502 -- permission denied for window type 2038”的异常
|
||||
// 目前Sentry上仅Z10型号的手机报这个错误(Android 8.1.0),这里明明已经授予了SYSTEM_ALERT_WINDOW权限,但是就是会抛异常= =,只能暴力捕获处理了。。。
|
||||
// 相关异常的链接:https://sentry.shanqu.cc/organizations/lightgame/issues/407275/?project=22
|
||||
_isAttached = false
|
||||
}
|
||||
_isAttached = true
|
||||
windowManager.addView(root, layoutParams)
|
||||
context.registerComponentCallbacks(this)
|
||||
onAttach()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.1 KiB |
@ -36,7 +36,7 @@
|
||||
</com.gh.gamecenter.common.view.LimitHeightLinearLayout>
|
||||
|
||||
<include
|
||||
android:id="@+id/hotTagHeadContainer"
|
||||
android:id="@+id/searchDiscoveryTagHeadContainer"
|
||||
layout="@layout/layout_subject_head"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="48dp"
|
||||
@ -45,14 +45,14 @@
|
||||
app:layout_constraintTop_toBottomOf="@id/history_flex_container" />
|
||||
|
||||
<com.gh.gamecenter.common.view.LimitHeightLinearLayout
|
||||
android:id="@+id/hot_tag_flex_container"
|
||||
android:id="@+id/search_discovery_tag_flex_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@color/ui_surface"
|
||||
app:layout_constraintTop_toBottomOf="@id/hotTagHeadContainer">
|
||||
app:layout_constraintTop_toBottomOf="@id/searchDiscoveryTagHeadContainer">
|
||||
|
||||
<com.google.android.flexbox.FlexboxLayout
|
||||
android:id="@+id/hot_tag_flex"
|
||||
android:id="@+id/search_discovery_tag_flex"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingLeft="16dp"
|
||||
@ -62,21 +62,21 @@
|
||||
</com.gh.gamecenter.common.view.LimitHeightLinearLayout>
|
||||
|
||||
<include
|
||||
android:id="@+id/hotHeadContainer"
|
||||
android:id="@+id/searchDiscoveryHeadContainer"
|
||||
layout="@layout/layout_subject_head"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="48dp"
|
||||
android:layout_marginTop="16dp"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/hot_tag_flex_container" />
|
||||
app:layout_constraintTop_toBottomOf="@id/search_discovery_tag_flex_container" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/hot_list"
|
||||
android:id="@+id/search_discovery_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:overScrollMode="never"
|
||||
app:layout_constrainedHeight="true"
|
||||
app:layout_constraintTop_toBottomOf="@+id/hotHeadContainer" />
|
||||
app:layout_constraintTop_toBottomOf="@+id/searchDiscoveryHeadContainer" />
|
||||
|
||||
<com.google.android.material.tabs.TabLayout
|
||||
android:id="@+id/rankTabLayout"
|
||||
@ -91,7 +91,7 @@
|
||||
app:tabMode="scrollable"
|
||||
app:tabIndicator="@null"
|
||||
app:tabRippleColor="@color/transparent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/hot_list"
|
||||
app:layout_constraintTop_toBottomOf="@+id/search_discovery_list"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
app:layout_constraintRight_toRightOf="parent" />
|
||||
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
<string name="download_startall">全部開始</string>
|
||||
<string name="search_searching">搜索中...</string>
|
||||
<string name="search_hot">熱門搜索</string>
|
||||
<string name="search_hot_tag">熱門標簽</string>
|
||||
<string name="search_discovery_tag">搜索發現</string>
|
||||
<string name="search_history">歷史搜索</string>
|
||||
<string name="news_concenrn_game_mine">我關註的遊戲</string>
|
||||
<string name="news_search_input">請輸入搜索關鍵字</string>
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
<string name="download_startall">全部开始</string>
|
||||
<string name="search_searching">搜索中...</string>
|
||||
<string name="search_hot">热门搜索</string>
|
||||
<string name="search_hot_tag">热门标签</string>
|
||||
<string name="search_discovery_tag">搜索发现</string>
|
||||
<string name="search_history">历史搜索</string>
|
||||
<string name="news_concenrn_game_mine">我关注的游戏</string>
|
||||
<string name="news_search_input">请输入搜索关键字</string>
|
||||
|
||||
17
build.gradle
17
build.gradle
@ -1,10 +1,6 @@
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
apply from: 'dependencies.gradle'
|
||||
apply from: 'vspace-bridge/config.gradle'
|
||||
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.7.20'
|
||||
ext.kotlin_version = '1.9.24'
|
||||
ext.shadow_version = '1.0.5'
|
||||
repositories {
|
||||
google()
|
||||
@ -17,8 +13,8 @@ buildscript {
|
||||
password("u9gZYH4MQEwLLQZK")
|
||||
}
|
||||
}
|
||||
maven { url "https://maven.google.com" }
|
||||
maven { url 'https://jitpack.io' }
|
||||
maven { url "https://maven.google.com" }
|
||||
}
|
||||
|
||||
dependencies {
|
||||
@ -29,6 +25,12 @@ buildscript {
|
||||
}
|
||||
}
|
||||
|
||||
plugins {
|
||||
id 'com.google.devtools.ksp' version '1.9.24-1.0.20' apply false
|
||||
}
|
||||
apply from: 'dependencies.gradle'
|
||||
apply from: 'vspace-bridge/config.gradle'
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
maven {
|
||||
@ -41,6 +43,7 @@ allprojects {
|
||||
google()
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
maven { url 'https://jitpack.io' }
|
||||
maven { url 'https://maven.aliyun.com/repository/public' }
|
||||
maven { url 'https://maven.aliyun.com/repository/central'}
|
||||
maven { url 'https://maven.aliyun.com/nexus/content/repositories/releases/' }
|
||||
@ -54,9 +57,9 @@ allprojects {
|
||||
// 配置HMS Core SDK的Maven仓地址。
|
||||
maven { url 'https://developer.huawei.com/repo/' }
|
||||
maven { url 'https://developer.hihonor.com/repo' }
|
||||
maven { url 'https://jitpack.io' }
|
||||
}
|
||||
}
|
||||
|
||||
task clean(type: Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
buildscript {
|
||||
ext {
|
||||
kotlinVersion = "1.7.20"
|
||||
kotlinVersion = "1.9.24"
|
||||
}
|
||||
repositories {
|
||||
maven {url 'https://maven.aliyun.com/repository/public'}
|
||||
|
||||
@ -49,7 +49,6 @@ class GhTransform(var project: Project) : Transform() {
|
||||
mTransformHelper.addTransformer(RoomTransformer())
|
||||
mTransformHelper.addTransformer(ActivityTransformer())
|
||||
mTransformHelper.addTransformer(AppCompatEditTextTransformer())
|
||||
mTransformHelper.addTransformer(MiniGameWebViewTransformer())
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -1,47 +0,0 @@
|
||||
package com.gh.gamecenter.plugin.transform
|
||||
|
||||
import javassist.ClassPool
|
||||
import javassist.CtClass
|
||||
import javassist.NotFoundException
|
||||
import javassist.bytecode.ClassFile
|
||||
import java.io.BufferedInputStream
|
||||
import java.io.DataInputStream
|
||||
import java.io.InputStream
|
||||
|
||||
class MiniGameWebViewTransformer : Transformer {
|
||||
|
||||
private val classPool = ClassPool.getDefault()
|
||||
|
||||
override fun getModifyClassName(): String {
|
||||
return "QUAUtil"
|
||||
}
|
||||
|
||||
override fun modifyClass(filePath: String, inputStream: InputStream): CtClass? {
|
||||
if (filePath.contains(getModifyClassName())) {
|
||||
|
||||
println("发现 QUAUtil")
|
||||
|
||||
val classFile = ClassFile(DataInputStream(BufferedInputStream(inputStream)))
|
||||
val ctClass = classPool.get(classFile.name)
|
||||
|
||||
if (ctClass.isFrozen) {
|
||||
ctClass.defrost()
|
||||
}
|
||||
|
||||
// 使用 try catch 包裹找到的第一个 getSystemUA 方法 (若能找到的话)
|
||||
try {
|
||||
val ctMethod = ctClass.getDeclaredMethod("getSystemUA")
|
||||
val body = "{ if (systemUA != null) { return systemUA; } systemUA = java.net.URLEncoder.encode(System.getProperty(\"http.agent\"), \"UTF-8\"); return systemUA; }"
|
||||
ctMethod.setBody(body)
|
||||
|
||||
println("修改 getSystemUA 方法")
|
||||
} catch (e: NotFoundException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
|
||||
return ctClass
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,6 +1,6 @@
|
||||
ext {
|
||||
//Android
|
||||
buildToolsVersion = "30.0.3"
|
||||
buildToolsVersion = "34.0.0"
|
||||
compileSdkVersion = 34
|
||||
minSdkVersion = 21
|
||||
|
||||
@ -26,7 +26,7 @@ ext {
|
||||
lifeCycle = "2.5.1"
|
||||
lifeCycleExtensions = "2.2.0"
|
||||
asynclayoutinflater = "1.0.0"
|
||||
room = "2.4.3"
|
||||
room = "2.6.1"
|
||||
workManager = "2.6.0"
|
||||
viewpager2 = "1.0.0"
|
||||
ktx = "1.2.0"
|
||||
@ -119,6 +119,7 @@ ext {
|
||||
|
||||
autoServiceVersion = "1.0-rc7"
|
||||
arouterVersion = "1.5.1"
|
||||
arouterKspCompilerVersion = "1.9.20-1.0.7"
|
||||
|
||||
composeVersion = "1.2.1"
|
||||
activityComposeVersion = "1.6.0"
|
||||
|
||||
@ -2,6 +2,7 @@ plugins {
|
||||
id 'com.android.library'
|
||||
id 'org.jetbrains.kotlin.android'
|
||||
id 'kotlin-kapt'
|
||||
id 'com.google.devtools.ksp'
|
||||
}
|
||||
|
||||
android {
|
||||
@ -28,10 +29,8 @@ android {
|
||||
jvmTarget = '1.8'
|
||||
}
|
||||
|
||||
kapt {
|
||||
arguments {
|
||||
arg("AROUTER_MODULE_NAME", project.name)
|
||||
}
|
||||
ksp {
|
||||
arg("AROUTER_MODULE_NAME", project.name)
|
||||
}
|
||||
}
|
||||
|
||||
@ -42,5 +41,6 @@ dependencies {
|
||||
|
||||
implementation "com.aliyun.ams:alicloud-android-push:$acloudPush"
|
||||
|
||||
kapt "com.alibaba:arouter-compiler:$arouterVersion"
|
||||
kapt "com.google.auto.service:auto-service:${autoServiceVersion}"
|
||||
ksp("com.github.JailedBird:ArouterKspCompiler:${arouterKspCompilerVersion}")
|
||||
}
|
||||
@ -2,6 +2,7 @@ apply plugin: 'com.android.library'
|
||||
apply plugin: 'org.jetbrains.kotlin.android'
|
||||
apply plugin: 'kotlin-kapt'
|
||||
apply plugin: 'kotlin-parcelize'
|
||||
apply plugin: 'com.google.devtools.ksp'
|
||||
|
||||
android {
|
||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
||||
@ -13,14 +14,10 @@ android {
|
||||
versionName rootProject.ext.versionName
|
||||
|
||||
buildConfigField "String", "API_HOST", "\"${API_HOST}\""
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
||||
kapt {
|
||||
arguments {
|
||||
arg("AROUTER_MODULE_NAME", project.name)
|
||||
}
|
||||
ksp {
|
||||
arg("AROUTER_MODULE_NAME", project.getName())
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
@ -49,7 +46,8 @@ android {
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
|
||||
kapt "com.alibaba:arouter-compiler:$arouterVersion"
|
||||
ksp("com.github.JailedBird:ArouterKspCompiler:${arouterKspCompilerVersion}")
|
||||
kapt "com.google.auto.service:auto-service:${autoServiceVersion}"
|
||||
|
||||
implementation(project(path: ":module_common")) {
|
||||
exclude group: 'androidx.swiperefreshlayout'
|
||||
|
||||
@ -6,6 +6,7 @@ if (isRelease.toBoolean()) {
|
||||
apply plugin: 'org.jetbrains.kotlin.android'
|
||||
apply plugin: 'kotlin-kapt'
|
||||
apply plugin: 'kotlin-parcelize'
|
||||
apply plugin: 'com.google.devtools.ksp'
|
||||
|
||||
android {
|
||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
||||
@ -47,10 +48,8 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
kapt {
|
||||
arguments {
|
||||
arg("AROUTER_MODULE_NAME", project.name)
|
||||
}
|
||||
ksp {
|
||||
arg("AROUTER_MODULE_NAME", project.getName())
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
@ -83,7 +82,8 @@ android {
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
|
||||
kapt "com.alibaba:arouter-compiler:$arouterVersion"
|
||||
ksp("com.github.JailedBird:ArouterKspCompiler:${arouterKspCompilerVersion}")
|
||||
kapt "com.google.auto.service:auto-service:${autoServiceVersion}"
|
||||
if (!isRelease.toBoolean()) {
|
||||
implementation "androidx.multidex:multidex:${multiDex}"
|
||||
}
|
||||
|
||||
@ -2,6 +2,7 @@ plugins {
|
||||
id 'com.android.library'
|
||||
id 'org.jetbrains.kotlin.android'
|
||||
id 'kotlin-kapt'
|
||||
id 'com.google.devtools.ksp'
|
||||
}
|
||||
|
||||
android {
|
||||
@ -18,10 +19,8 @@ android {
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
||||
kapt {
|
||||
arguments {
|
||||
arg("AROUTER_MODULE_NAME", project.name)
|
||||
}
|
||||
ksp {
|
||||
arg("AROUTER_MODULE_NAME", project.getName())
|
||||
}
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
@ -47,7 +46,8 @@ android {
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
|
||||
kapt "com.alibaba:arouter-compiler:$arouterVersion"
|
||||
ksp("com.github.JailedBird:ArouterKspCompiler:${arouterKspCompilerVersion}")
|
||||
kapt "com.google.auto.service:auto-service:${autoServiceVersion}"
|
||||
|
||||
implementation(project(path: ":module_common")) {
|
||||
exclude group: 'androidx.swiperefreshlayout'
|
||||
|
||||
@ -6,6 +6,7 @@ if (isRelease.toBoolean()) {
|
||||
apply plugin: 'org.jetbrains.kotlin.android'
|
||||
apply plugin: 'kotlin-kapt'
|
||||
apply plugin: 'kotlin-parcelize'
|
||||
apply plugin: 'com.google.devtools.ksp'
|
||||
|
||||
android {
|
||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
||||
@ -49,10 +50,8 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
kapt {
|
||||
arguments {
|
||||
arg("AROUTER_MODULE_NAME", project.name)
|
||||
}
|
||||
ksp {
|
||||
arg("AROUTER_MODULE_NAME", project.getName())
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
@ -80,11 +79,8 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
|
||||
|
||||
kapt "com.alibaba:arouter-compiler:$arouterVersion"
|
||||
kapt "com.google.auto.service:auto-service:${autoServiceVersion}"
|
||||
ksp("com.github.JailedBird:ArouterKspCompiler:${arouterKspCompilerVersion}")
|
||||
if (!isRelease.toBoolean()) {
|
||||
implementation "androidx.multidex:multidex:${multiDex}"
|
||||
}
|
||||
|
||||
@ -18,7 +18,6 @@ object NewLogUtils {
|
||||
private const val KEY_CONTENT_ID = "content_id"
|
||||
private const val KEY_CONTENT_TITLE = "content_title"
|
||||
private const val KEY_HELP_ID = "help_id"
|
||||
private const val KEY_QA_COLLECTION = "qa_collection"
|
||||
private const val KEY_SEARCH_KEY = "search_key"
|
||||
|
||||
private fun log(jsonObject: JSONObject, logStore: String = "event", uploadImmediately: Boolean = false) {
|
||||
@ -54,11 +53,10 @@ object NewLogUtils {
|
||||
}
|
||||
|
||||
//点击QA更多
|
||||
fun logClickQaMoreBtn(helpId: String, qaCollection: String) {
|
||||
fun logClickQaMoreBtn(helpId: String) {
|
||||
val json = json {
|
||||
KEY_EVENT to "qa_click_title_more"
|
||||
KEY_HELP_ID to helpId
|
||||
KEY_QA_COLLECTION to qaCollection
|
||||
KEY_META to LogUtils.getMetaObject()
|
||||
KEY_LAUNCH_ID to Tracker.launchId
|
||||
KEY_SESSION_ID to Tracker.sessionId
|
||||
|
||||
@ -209,7 +209,9 @@ class HelpAndFeedbackFragment : BaseLazyFragment() {
|
||||
mViewModel.selectedCategory.name == HelpAndFeedbackViewModel.MY_RELATED_QA_NAME
|
||||
)
|
||||
)
|
||||
NewLogUtils.logClickQaMoreBtn(mViewModel.selectedCategory.id, mViewModel.selectedCategory.name)
|
||||
if (mViewModel.selectedCategory.id.isNotEmpty()) {
|
||||
NewLogUtils.logClickQaMoreBtn(mViewModel.selectedCategory.id)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -22,7 +22,7 @@ class HelpContentAdapter(
|
||||
context: Context,
|
||||
private val mFragment: HelpContentFragment,
|
||||
private val mViewModel: NormalListViewModel<HelpEntity>,
|
||||
private val mIsFromHelpAndFeedback: Boolean,
|
||||
private val mQaId: String?,
|
||||
private val mQaCollectionId: String?,
|
||||
private val mNavigationTitle: String,
|
||||
private val searchType: String,
|
||||
@ -103,7 +103,7 @@ class HelpContentAdapter(
|
||||
)
|
||||
} else {
|
||||
NewLogUtils.logEnterQaContent(
|
||||
if (mIsFromHelpAndFeedback) "帮助与反馈" else "其他位置",
|
||||
"其他位置",
|
||||
entity.id,
|
||||
HtmlUtils.filterHtmlLabel(entity.title),
|
||||
entity.helpId,
|
||||
|
||||
@ -60,7 +60,7 @@ class HelpContentFragment : ListFragment<HelpEntity, NormalListViewModel<HelpEnt
|
||||
requireContext(),
|
||||
this,
|
||||
mListViewModel,
|
||||
!mCategoryId.isNullOrEmpty() || mIsMyRelatedQA,
|
||||
mQaId,
|
||||
mQaCollectionId,
|
||||
mNavigationTitle,
|
||||
mSearchType,
|
||||
|
||||
@ -61,7 +61,7 @@ class HelpQaCategoryAdapter(val context: Context, private val mQaCollectionId: S
|
||||
} else {
|
||||
MtaHelper.onEvent("意见反馈", "使用帮助点击", "点击更多+${helpCategoryEntity.name}")
|
||||
}
|
||||
NewLogUtils.logClickQaMoreBtn(helpCategoryEntity.id, helpCategoryEntity.name)
|
||||
NewLogUtils.logClickQaMoreBtn(helpCategoryEntity.id)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,6 +3,7 @@ apply plugin: 'com.android.library'
|
||||
apply plugin: 'org.jetbrains.kotlin.android'
|
||||
apply plugin: 'kotlin-kapt'
|
||||
apply plugin: 'kotlin-parcelize'
|
||||
apply plugin: 'com.google.devtools.ksp'
|
||||
|
||||
android {
|
||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
||||
@ -14,10 +15,8 @@ android {
|
||||
versionName rootProject.ext.versionName
|
||||
}
|
||||
|
||||
kapt {
|
||||
arguments {
|
||||
arg("AROUTER_MODULE_NAME", project.name)
|
||||
}
|
||||
ksp {
|
||||
arg("AROUTER_MODULE_NAME", project.getName())
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
@ -39,7 +38,8 @@ android {
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
|
||||
kapt "com.alibaba:arouter-compiler:$arouterVersion"
|
||||
ksp("com.github.JailedBird:ArouterKspCompiler:${arouterKspCompilerVersion}")
|
||||
kapt "com.google.auto.service:auto-service:${autoServiceVersion}"
|
||||
|
||||
implementation(project(path: ":module_common")) {
|
||||
exclude group: 'androidx.swiperefreshlayout'
|
||||
|
||||
@ -6,6 +6,7 @@ if (isRelease.toBoolean()) {
|
||||
apply plugin: 'org.jetbrains.kotlin.android'
|
||||
apply plugin: 'kotlin-kapt'
|
||||
apply plugin: 'kotlin-parcelize'
|
||||
apply plugin: 'com.google.devtools.ksp'
|
||||
|
||||
android {
|
||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
||||
@ -42,10 +43,8 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
kapt {
|
||||
arguments {
|
||||
arg("AROUTER_MODULE_NAME", project.name)
|
||||
}
|
||||
ksp {
|
||||
arg("AROUTER_MODULE_NAME", project.getName())
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
@ -78,7 +77,9 @@ android {
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
|
||||
kapt "com.alibaba:arouter-compiler:$arouterVersion"
|
||||
ksp("com.github.JailedBird:ArouterKspCompiler:${arouterKspCompilerVersion}")
|
||||
kapt "com.google.auto.service:auto-service:${autoServiceVersion}"
|
||||
|
||||
if (!isRelease.toBoolean()) {
|
||||
implementation "androidx.multidex:multidex:${multiDex}"
|
||||
}
|
||||
|
||||
@ -2,6 +2,7 @@ apply plugin: 'com.android.library'
|
||||
apply plugin: 'org.jetbrains.kotlin.android'
|
||||
apply plugin: 'kotlin-kapt'
|
||||
apply plugin: 'kotlin-parcelize'
|
||||
apply plugin: 'com.google.devtools.ksp'
|
||||
|
||||
android {
|
||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
||||
@ -26,10 +27,8 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
kapt {
|
||||
arguments {
|
||||
arg("AROUTER_MODULE_NAME", project.name)
|
||||
}
|
||||
ksp {
|
||||
arg("AROUTER_MODULE_NAME", project.getName())
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
@ -52,7 +51,8 @@ android {
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
|
||||
kapt "com.alibaba:arouter-compiler:$arouterVersion"
|
||||
ksp("com.github.JailedBird:ArouterKspCompiler:${arouterKspCompilerVersion}")
|
||||
kapt "com.google.auto.service:auto-service:${autoServiceVersion}"
|
||||
|
||||
implementation(project(path: ":module_common")) {
|
||||
exclude group: 'androidx.swiperefreshlayout'
|
||||
|
||||
@ -18,6 +18,7 @@ import cn.com.chinatelecom.account.api.CtAuth
|
||||
import cn.jiguang.verifysdk.api.*
|
||||
import com.alibaba.android.arouter.launcher.ARouter
|
||||
import com.gh.gamecenter.common.base.GlobalActivityManager.getCurrentPageEntity
|
||||
import com.gh.gamecenter.common.base.GlobalActivityManager.getLastPageEntity
|
||||
import com.gh.gamecenter.common.constant.RouteConsts
|
||||
import com.gh.gamecenter.common.databinding.SetWaitDialogBinding
|
||||
import com.gh.gamecenter.common.utils.*
|
||||
@ -49,6 +50,7 @@ object LoginHelper {
|
||||
//请注意,这里有可能会出现内存泄漏,需要及时清理
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
private var backgroundView: View? = null
|
||||
private var loggingDialog: Dialog? = null
|
||||
private var cbPrivacy: CheckBox? = null
|
||||
|
||||
private var loginProvider: ILoginProvider? = null
|
||||
@ -83,26 +85,20 @@ object LoginHelper {
|
||||
fun loginAuth(context: Context, entrance: String, callback: (() -> Unit)?) {
|
||||
runOnUiThread {
|
||||
val dialogContext = DialogHelper.checkDialogContext(context)
|
||||
if (dialogContext is Activity && (dialogContext.isFinishing || dialogContext.isDestroyed)) return@runOnUiThread
|
||||
preDialog = try {
|
||||
dialogContext?.let {
|
||||
Dialog(it, com.gh.gamecenter.common.R.style.DialogWindowTransparent).apply {
|
||||
val binding = SetWaitDialogBinding.inflate(LayoutInflater.from(dialogContext)).apply {
|
||||
setWaitMessage.text = "请求登录中"
|
||||
}
|
||||
requestWindowFeature(Window.FEATURE_NO_TITLE)
|
||||
setContentView(binding.root)
|
||||
setCanceledOnTouchOutside(false)
|
||||
show()
|
||||
if (dialogContext is Activity && dialogContext.isFinishing) return@runOnUiThread
|
||||
preDialog = dialogContext?.let {
|
||||
Dialog(it, com.gh.gamecenter.common.R.style.DialogWindowTransparent).apply {
|
||||
val binding = SetWaitDialogBinding.inflate(LayoutInflater.from(dialogContext)).apply {
|
||||
setWaitMessage.text = "请求登录中"
|
||||
}
|
||||
requestWindowFeature(Window.FEATURE_NO_TITLE)
|
||||
setContentView(binding.root)
|
||||
setCanceledOnTouchOutside(false)
|
||||
show()
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
// no implement
|
||||
null
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
isDarkMode = DarkModeUtils.isDarkModeOn(context)
|
||||
setUiConfig(context, callback)
|
||||
val settings = LoginSettings()
|
||||
@ -140,6 +136,7 @@ object LoginHelper {
|
||||
}
|
||||
|
||||
8 -> { // 点击了一键登录按钮
|
||||
showLoggingDialog()
|
||||
SensorsBridge.trackEvent("Login", "login_type", "一键登录")
|
||||
}
|
||||
}
|
||||
@ -159,6 +156,7 @@ object LoginHelper {
|
||||
}
|
||||
|
||||
LOGIN_AUTH_CODE_FAILURE -> {
|
||||
dismissDialog()
|
||||
getLoginProvider()?.startCodeLoginPageFromQuickLogin(openAuthPageSuccess, context, callback)
|
||||
}
|
||||
}
|
||||
@ -169,6 +167,9 @@ object LoginHelper {
|
||||
if (preDialog?.isShowing == true) {
|
||||
preDialog?.dismiss()
|
||||
}
|
||||
if (loggingDialog?.isShowing == true) {
|
||||
loggingDialog?.dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
private fun setUiConfig(context: Context, callback: (() -> Unit)?) {
|
||||
@ -258,6 +259,15 @@ object LoginHelper {
|
||||
}
|
||||
}
|
||||
|
||||
private fun showLoggingDialog() {
|
||||
AppManager.getInstance().recentActiveActivity?.run {
|
||||
val dialogContext = com.gh.gamecenter.common.utils.DialogHelper.checkDialogContext(this)
|
||||
if (dialogContext == null || (dialogContext is Activity && dialogContext.isFinishing)) return
|
||||
loggingDialog = getLoginProvider()?.createLoggingDialog(dialogContext)
|
||||
loggingDialog?.show()
|
||||
}
|
||||
}
|
||||
|
||||
private fun showPrivacyCheckDialog(
|
||||
authContext: Context,
|
||||
context: Context,
|
||||
@ -322,6 +332,7 @@ object LoginHelper {
|
||||
|
||||
fun release() {
|
||||
backgroundView = null
|
||||
loggingDialog = null
|
||||
preDialog = null
|
||||
isPolicyCheck = false
|
||||
loginToken = ""
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
apply plugin: "com.android.library"
|
||||
apply plugin: "org.jetbrains.kotlin.android"
|
||||
apply plugin: "kotlin-kapt"
|
||||
apply plugin: 'com.google.devtools.ksp'
|
||||
|
||||
android {
|
||||
|
||||
@ -26,15 +26,13 @@ android {
|
||||
jvmTarget = "1.8"
|
||||
}
|
||||
|
||||
kapt {
|
||||
arguments {
|
||||
arg("AROUTER_MODULE_NAME", project.name)
|
||||
}
|
||||
ksp {
|
||||
arg("AROUTER_MODULE_NAME", project.getName())
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
kapt "com.alibaba:arouter-compiler:$arouterVersion"
|
||||
ksp("com.github.JailedBird:ArouterKspCompiler:${arouterKspCompilerVersion}")
|
||||
|
||||
implementation "io.sentry:sentry-android:${sentry}"
|
||||
implementation "io.sentry:sentry-android-fragment:${sentry}"
|
||||
|
||||
@ -79,6 +79,12 @@ android.enableJetifier=true
|
||||
kapt.use.worker.api = true
|
||||
kapt.incremental.apt = true
|
||||
|
||||
#ksp 编译
|
||||
#ksp.incremental=true
|
||||
#ksp.incremental.log=true
|
||||
# track classpath
|
||||
#ksp.incremental.intermodule=true
|
||||
|
||||
# 数据绑定增量注解处理
|
||||
android.databinding.incremental=true
|
||||
|
||||
|
||||
@ -3,6 +3,7 @@ plugins {
|
||||
id 'org.jetbrains.kotlin.android'
|
||||
id 'kotlin-kapt'
|
||||
id 'kotlin-parcelize'
|
||||
id 'com.google.devtools.ksp'
|
||||
}
|
||||
|
||||
android {
|
||||
@ -38,10 +39,8 @@ android {
|
||||
viewBinding true
|
||||
}
|
||||
|
||||
kapt {
|
||||
arguments {
|
||||
arg("AROUTER_MODULE_NAME", project.name)
|
||||
}
|
||||
ksp {
|
||||
arg("AROUTER_MODULE_NAME", project.getName())
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
@ -61,13 +60,11 @@ android {
|
||||
|
||||
dependencies {
|
||||
api fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||
|
||||
api "androidx.constraintlayout:constraintlayout:${constraintLayout}"
|
||||
api "androidx.asynclayoutinflater:asynclayoutinflater:${asynclayoutinflater}"
|
||||
kapt "com.alibaba:arouter-compiler:$arouterVersion"
|
||||
ksp("com.github.JailedBird:ArouterKspCompiler:${arouterKspCompilerVersion}")
|
||||
kapt "com.google.auto.service:auto-service:${autoServiceVersion}"
|
||||
api "com.louiscad.splitties:splitties-views-dsl:${splitties}"
|
||||
api "com.louiscad.splitties:splitties-views-dsl-constraintlayout:${splitties}"
|
||||
api "com.github.nichbar:AndroidRomChecker:${romChecker}"
|
||||
@ -80,7 +77,7 @@ dependencies {
|
||||
api "com.tencent.mm.opensdk:wechat-sdk-android-without-mta:${mta}"
|
||||
api "androidx.room:room-runtime:${room}"
|
||||
api "androidx.room:room-rxjava2:${room}"
|
||||
kapt "androidx.room:room-compiler:${room}"
|
||||
ksp("androidx.room:room-compiler:${room}")
|
||||
api "androidx.collection:collection-ktx:${collection}"
|
||||
api "androidx.activity:activity:${activity}"
|
||||
api "androidx.activity:activity-ktx:${activity}"
|
||||
@ -102,8 +99,5 @@ dependencies {
|
||||
api "com.google.android:flexbox:${flexbox}"
|
||||
api "com.blankj:utilcodex:${blankjUtilCodex}"
|
||||
|
||||
debugApi "com.squareup.okio:okio:2.2.2"
|
||||
debugApi "junit:junit:4.12"
|
||||
|
||||
api(project(path: ":module_core"))
|
||||
}
|
||||
@ -25,8 +25,6 @@ public class Constants {
|
||||
|
||||
public static final String SHOULD_SHOW_VIDEO_MOBILE_WARNING = "should_show_video_mobile_warning";
|
||||
|
||||
public static final String GAME_DETAIL_COME_IN = "game_detail_come_in"; // 从游戏详情进入
|
||||
|
||||
public static final String EB_QUIT_LOGIN = "quit_login";
|
||||
|
||||
public static final String EB_GAME_DETAIL = "eb_game_detail";
|
||||
|
||||
@ -11,8 +11,8 @@ public class EntranceConsts {
|
||||
public static final String KEY_TO = "to";
|
||||
public static final String KEY_NEXT_TO = "next_to";
|
||||
public static final String KEY_NEWSID = "newsId";
|
||||
public static final String KEY_GAMEID = "gameId";
|
||||
public static final String KEY_GAME_ID = "game_id";
|
||||
public static final String KEY_GAMEID = KEY_GAME_ID;
|
||||
public static final String KEY_ID = "id";
|
||||
public static final String KEY_URL = "url";
|
||||
public static final String KEY_BUNDLE = "bundle";
|
||||
@ -117,6 +117,10 @@ public class EntranceConsts {
|
||||
public static final String KEY_PLATFORM = "platform";
|
||||
public static final String KEY_GAME_NAME = "game_name";
|
||||
|
||||
public static final String KEY_GAME_ENTITY = "game_entity";
|
||||
|
||||
public static final String KEY_DEFAULT_TAB = "default_tab";
|
||||
|
||||
public static final String KEY_PLATFORMS = "platforms";
|
||||
public static final String KEY_PLATFORMS_AUTO_DOWNLOAD = "platform_auto_download";
|
||||
public static final String KEY_GAME_INFO = "game_info";
|
||||
@ -176,12 +180,13 @@ public class EntranceConsts {
|
||||
public static final String KEY_CATEGORY_TITLE = "category_title";
|
||||
public static final String KEY_BLOCK_DATA = "blockData";
|
||||
public static final String KEY_ASK_TAG = "askTag";
|
||||
public static final String KEY_SCROLL_TO_LIBAO = "libao";
|
||||
public static final String KEY_SCROLL_TO_LIBAO = "scroll_to_libao";
|
||||
public static final String KEY_SCROLL_TO_SERVER = "scroll_to_server";
|
||||
public static final String KEY_ASK_COLUMN_TAG = "askColumnTag";
|
||||
public static final String KEY_COMMUNITY_ID = "community_id";
|
||||
public static final String KEY_COMMUNITY_NAME = "community_name";
|
||||
public static final String KEY_COMMUNITY_DATA = "communityData";
|
||||
public static final String KEY_COMMUNITY_TYPE = "community_type";
|
||||
public static final String KEY_TRACE_EVENT = "trace_event";
|
||||
public static final String KEY_SUBJECT_DATA = "subjectData";
|
||||
public static final String KEY_SUBJECT_TYPE = "subjectType";
|
||||
@ -199,8 +204,8 @@ public class EntranceConsts {
|
||||
public static final String KEY_SCROLL_TO_COMMENT_AREA = "scroll_to_comment_area";
|
||||
public static final String KEY_RATING_STAR_COUNT = "ratingStarCount";
|
||||
public static final String KEY_QUESTION_MODERATOR_PATCH = "questionModeratorPatch";
|
||||
public static final String KEY_SKIP_GAME_COMMENT = "skipGameComment";
|
||||
public static final String KEY_OPEN_PLATFORM_WINDOW = "openPlatformWindow";
|
||||
public static final String KEY_COMMENT_AS_DEFAULT_TAB = "comment_as_default_tab";
|
||||
public static final String KEY_OPEN_PLATFORM_WINDOW = "open_platform_window";
|
||||
public static final String KEY_OPEN_KEYBOARD = "openKeyboard";
|
||||
public static final String KEY_PATH_VIDEO = "pathVideo";
|
||||
public static final String KEY_VIDEO_ID = "videoId";
|
||||
@ -215,7 +220,7 @@ public class EntranceConsts {
|
||||
public static final String KEY_COLLECTION_NAME = "collectionName";
|
||||
public static final String KEY_NAVIGATION_TITLE = "navigationTitle";
|
||||
public static final String KEY_IMAGE_CROP_RATIO = "imageCropRatio";
|
||||
public static final String KEY_OPEN_VIDEO_STREAMING = "openVideoStreaming";
|
||||
public static final String KEY_OPEN_VIDEO_STREAMING = "open_video_streaming";
|
||||
public static final String KEY_REFERER = "referer";
|
||||
public static final String KEY_UUID = "uuid";
|
||||
public static final String KEY_IS_HOME_VIDEO = "isHomeVideo";
|
||||
@ -351,4 +356,10 @@ public class EntranceConsts {
|
||||
public static final String KEY_SHOW_ADD_GAMES_DIALOG = "show_add_games_dialog";
|
||||
|
||||
public static final String KEY_IS_AUTO_LOAD = "key_is_auto_load";
|
||||
|
||||
public static final String TAB_TYPE_DESC = "详情";
|
||||
public static final String TAB_TYPE_TRENDS = "专区";
|
||||
public static final String TAB_TYPE_ARCHIVE = "云存档";
|
||||
public static final String TAB_TYPE_RATING = "评价";
|
||||
public static final String TAB_TYPE_BBS = "论坛";
|
||||
}
|
||||
|
||||
@ -15,6 +15,10 @@ object RouteConsts {
|
||||
const val libaoDetailActivity = "/app/libaoDetailActivity"
|
||||
const val fullScreenVideoActivity = "/app/FullScreenVideoActivity"
|
||||
|
||||
const val gameDetailActivity = "/activity/game_detail"
|
||||
|
||||
const val userHomeActivity = "/activity/user_home"
|
||||
|
||||
const val aboutActivity = "/settings/AboutActivity"
|
||||
const val webActivity = "/setting/WebActivity"
|
||||
const val weiBoShareActivity = "/setting/weiBoShareActivity"
|
||||
@ -132,4 +136,13 @@ object RouteConsts {
|
||||
const val quickLogin = "/quickLogin/quickLogin"
|
||||
}
|
||||
|
||||
object Interceptor {
|
||||
const val LOGIN_INTERCEPTOR = "loginInterceptor"
|
||||
}
|
||||
|
||||
object QueryParams {
|
||||
const val REQUIRE_LOGIN = "require_login"
|
||||
const val SOURCE = "source"
|
||||
}
|
||||
|
||||
}
|
||||
@ -26,7 +26,7 @@ object SensorsBridge {
|
||||
private const val KEY_LAST_PAGE_BUSINESS_ID = "last_page_business_id"
|
||||
private const val KEY_DOWNLOAD_STATUS = "download_status"
|
||||
private const val KEY_DOWNLOAD_TYPE = "download_type"
|
||||
private const val KEY_GAME_SCHEMA_TYPE = "game_schema_type"
|
||||
private const val KEY_GAME_SCHEME_TYPE = "game_scheme_type"
|
||||
private const val KEY_GAME_TYPE = "game_type"
|
||||
const val KEY_POSITION = "position"
|
||||
const val KEY_TAB_CONTENT = "tab_content"
|
||||
@ -88,6 +88,8 @@ object SensorsBridge {
|
||||
private const val KEY_VERIFICATION_TYPE = "verification_type"
|
||||
private const val KEY_VIDEO_ID = "video_id"
|
||||
private const val KEY_PLAY_TYPE = "play_type"
|
||||
private const val KEY_LABEL_NAME = "label_name"
|
||||
private const val KEY_LABEL_ID = "label_id"
|
||||
const val KEY_BOTTOM_TAB = "bottom_tab"
|
||||
const val KEY_MULTI_TAB_NAME = "several_tab_page_name"
|
||||
const val KEY_MULTI_TAB_ID = "several_tab_page_id"
|
||||
@ -291,6 +293,8 @@ object SensorsBridge {
|
||||
|
||||
private const val EVENT_COLUMN_TEST_CLICK = "ColumnTestClick"
|
||||
|
||||
private const val EVENT_SEARCH_DISCOVERY_CLICK = "SearchDiscoveryClick"
|
||||
|
||||
private const val EVENT_BYPASS_BROWSING = "BypassBrowsing"
|
||||
private const val EVENT_FAIL_BYPASS = "FailBypass"
|
||||
|
||||
@ -4009,7 +4013,7 @@ object SensorsBridge {
|
||||
* 触发时机:当下载悬浮窗引导图展示时触发上报
|
||||
* @param gameId 游戏ID
|
||||
* @param gameName 游戏名称
|
||||
* @param gameSchemaType 游戏架构类型:64位/32位
|
||||
* @param gameSchemeType 游戏架构类型:64位/32位
|
||||
* @param downloadStatus 游戏下载状态
|
||||
* @param gameType 游戏的类型:单机、网游等
|
||||
* @param downloadType 实际下载方式:本地下载/畅玩下载
|
||||
@ -4018,7 +4022,7 @@ object SensorsBridge {
|
||||
fun trackDownloadSuspendedWindowGuideShow(
|
||||
gameId: String,
|
||||
gameName: String,
|
||||
gameSchemaType: String,
|
||||
gameSchemeType: String,
|
||||
downloadStatus: String,
|
||||
gameType: String,
|
||||
downloadType: String
|
||||
@ -4026,7 +4030,7 @@ object SensorsBridge {
|
||||
val json = json {
|
||||
KEY_GAME_ID to gameId
|
||||
KEY_GAME_NAME to gameName
|
||||
KEY_GAME_SCHEMA_TYPE to gameSchemaType
|
||||
KEY_GAME_SCHEME_TYPE to gameSchemeType
|
||||
KEY_DOWNLOAD_STATUS to downloadStatus
|
||||
KEY_GAME_TYPE to gameType
|
||||
KEY_DOWNLOAD_TYPE to downloadType
|
||||
@ -4066,7 +4070,7 @@ object SensorsBridge {
|
||||
* @param source 来源:游戏下载\重启APP
|
||||
* @param downloadType 所上报游戏的实际下载方式:本地下载/畅玩下载
|
||||
* @param downloadStatus 所上报游戏下载状态
|
||||
* @param gameSchemaType 所上报游戏架构类型:64位/32位
|
||||
* @param gameSchemeType 所上报游戏架构类型:64位/32位
|
||||
* @param gameType 游戏的类型:单机、网游等
|
||||
* @param gameId 游戏ID
|
||||
* @param gameName 游戏名称
|
||||
@ -4075,7 +4079,7 @@ object SensorsBridge {
|
||||
source: String,
|
||||
downloadType: String,
|
||||
downloadStatus: String,
|
||||
gameSchemaType: String,
|
||||
gameSchemeType: String,
|
||||
gameType: String,
|
||||
gameId: String,
|
||||
gameName: String
|
||||
@ -4084,7 +4088,7 @@ object SensorsBridge {
|
||||
KEY_SOURCE to source
|
||||
KEY_DOWNLOAD_TYPE to downloadType
|
||||
KEY_DOWNLOAD_STATUS to downloadStatus
|
||||
KEY_GAME_SCHEMA_TYPE to gameSchemaType
|
||||
KEY_GAME_SCHEME_TYPE to gameSchemeType
|
||||
KEY_GAME_TYPE to gameType
|
||||
KEY_GAME_ID to gameId
|
||||
KEY_GAME_NAME to gameName
|
||||
@ -4099,7 +4103,7 @@ object SensorsBridge {
|
||||
* @param source 来源:游戏下载\重启APP
|
||||
* @param downloadType 所上报游戏的实际下载方式:本地下载/畅玩下载
|
||||
* @param downloadStatus 所上报游戏下载状态
|
||||
* @param gameSchemaType 所上报游戏架构类型:64位/32位
|
||||
* @param gameSchemeType 所上报游戏架构类型:64位/32位
|
||||
* @param gameType 游戏的类型:单机、网游等
|
||||
* @param gameId 游戏ID
|
||||
* @param gameName 游戏名称
|
||||
@ -4108,7 +4112,7 @@ object SensorsBridge {
|
||||
source: String,
|
||||
downloadType: String,
|
||||
downloadStatus: String,
|
||||
gameSchemaType: String,
|
||||
gameSchemeType: String,
|
||||
gameType: String,
|
||||
gameId: String,
|
||||
gameName: String
|
||||
@ -4117,7 +4121,7 @@ object SensorsBridge {
|
||||
KEY_SOURCE to source
|
||||
KEY_DOWNLOAD_TYPE to downloadType
|
||||
KEY_DOWNLOAD_STATUS to downloadStatus
|
||||
KEY_GAME_SCHEMA_TYPE to gameSchemaType
|
||||
KEY_GAME_SCHEME_TYPE to gameSchemeType
|
||||
KEY_GAME_TYPE to gameType
|
||||
KEY_GAME_ID to gameId
|
||||
KEY_GAME_NAME to gameName
|
||||
@ -4131,7 +4135,7 @@ object SensorsBridge {
|
||||
* 触发时机:触发自动下载提示条展示时上报
|
||||
* @param downloadType 所上报游戏的实际下载方式:本地下载/畅玩下载
|
||||
* @param downloadStatus 所上报游戏下载状态
|
||||
* @param gameSchemaType 所上报游戏架构类型:64位/32位
|
||||
* @param gameSchemeType 所上报游戏架构类型:64位/32位
|
||||
* @param gameType 游戏的类型:单机、网游等
|
||||
* @param gameId 游戏ID
|
||||
* @param gameName 游戏名称
|
||||
@ -4139,7 +4143,7 @@ object SensorsBridge {
|
||||
fun trackAutomaticInstallationPromptBarShow(
|
||||
downloadType: String,
|
||||
downloadStatus: String,
|
||||
gameSchemaType: String,
|
||||
gameSchemeType: String,
|
||||
gameType: String,
|
||||
gameId: String,
|
||||
gameName: String
|
||||
@ -4147,7 +4151,7 @@ object SensorsBridge {
|
||||
val json = json {
|
||||
KEY_DOWNLOAD_TYPE to downloadType
|
||||
KEY_DOWNLOAD_STATUS to downloadStatus
|
||||
KEY_GAME_SCHEMA_TYPE to gameSchemaType
|
||||
KEY_GAME_SCHEME_TYPE to gameSchemeType
|
||||
KEY_GAME_TYPE to gameType
|
||||
KEY_GAME_ID to gameId
|
||||
KEY_GAME_NAME to gameName
|
||||
@ -4161,7 +4165,7 @@ object SensorsBridge {
|
||||
* 触发时机:触发自动下载提示条点击时上报
|
||||
* @param downloadType 所上报游戏的实际下载方式:本地下载/畅玩下载
|
||||
* @param downloadStatus 所上报游戏下载状态
|
||||
* @param gameSchemaType 所上报游戏架构类型:64位/32位
|
||||
* @param gameSchemeType 所上报游戏架构类型:64位/32位
|
||||
* @param gameType 游戏的类型:单机、网游等
|
||||
* @param gameId 游戏ID
|
||||
* @param gameName 游戏名称
|
||||
@ -4169,7 +4173,7 @@ object SensorsBridge {
|
||||
fun trackAutomaticInstallationPromptBarClick(
|
||||
downloadType: String,
|
||||
downloadStatus: String,
|
||||
gameSchemaType: String,
|
||||
gameSchemeType: String,
|
||||
gameType: String,
|
||||
gameId: String,
|
||||
gameName: String
|
||||
@ -4177,7 +4181,7 @@ object SensorsBridge {
|
||||
val json = json {
|
||||
KEY_DOWNLOAD_TYPE to downloadType
|
||||
KEY_DOWNLOAD_STATUS to downloadStatus
|
||||
KEY_GAME_SCHEMA_TYPE to gameSchemaType
|
||||
KEY_GAME_SCHEME_TYPE to gameSchemeType
|
||||
KEY_GAME_TYPE to gameType
|
||||
KEY_GAME_ID to gameId
|
||||
KEY_GAME_NAME to gameName
|
||||
@ -4191,7 +4195,7 @@ object SensorsBridge {
|
||||
* 触发时机:下载组件展示时上报
|
||||
* @param gameId 游戏ID
|
||||
* @param gameName 游戏名称
|
||||
* @param gameSchemaType 游戏架构类型:64位/32位
|
||||
* @param gameSchemeType 游戏架构类型:64位/32位
|
||||
* @param downloadStatus 所上报游戏下载状态
|
||||
* @param gameType 游戏的类型:单机、网游等
|
||||
* @param downloadType 所上报游戏的实际下载方式:本地下载/畅玩下载
|
||||
@ -4199,7 +4203,7 @@ object SensorsBridge {
|
||||
fun trackDownloadComponentsShow(
|
||||
gameId: String,
|
||||
gameName: String,
|
||||
gameSchemaType: String,
|
||||
gameSchemeType: String,
|
||||
downloadStatus: String,
|
||||
gameType: String,
|
||||
downloadType: String,
|
||||
@ -4207,7 +4211,7 @@ object SensorsBridge {
|
||||
val json = json {
|
||||
KEY_GAME_ID to gameId
|
||||
KEY_GAME_NAME to gameName
|
||||
KEY_GAME_SCHEMA_TYPE to gameSchemaType
|
||||
KEY_GAME_SCHEME_TYPE to gameSchemeType
|
||||
KEY_DOWNLOAD_STATUS to downloadStatus
|
||||
KEY_GAME_TYPE to gameType
|
||||
KEY_DOWNLOAD_TYPE to downloadType
|
||||
@ -4221,7 +4225,7 @@ object SensorsBridge {
|
||||
* 触发时机:下载组件点击时上报
|
||||
* @param gameId 游戏ID
|
||||
* @param gameName 游戏名称
|
||||
* @param gameSchemaType 游戏架构类型:64位/32位
|
||||
* @param gameSchemeType 游戏架构类型:64位/32位
|
||||
* @param downloadStatus 所上报游戏下载状态
|
||||
* @param gameType 游戏的类型:单机、网游等
|
||||
* @param downloadType 所上报游戏的实际下载方式:本地下载/畅玩下载
|
||||
@ -4231,7 +4235,7 @@ object SensorsBridge {
|
||||
fun trackDownloadComponentsContentClick(
|
||||
gameId: String,
|
||||
gameName: String,
|
||||
gameSchemaType: String,
|
||||
gameSchemeType: String,
|
||||
downloadStatus: String,
|
||||
gameType: String,
|
||||
downloadType: String,
|
||||
@ -4241,7 +4245,7 @@ object SensorsBridge {
|
||||
val json = json {
|
||||
KEY_GAME_ID to gameId
|
||||
KEY_GAME_NAME to gameName
|
||||
KEY_GAME_SCHEMA_TYPE to gameSchemaType
|
||||
KEY_GAME_SCHEME_TYPE to gameSchemeType
|
||||
KEY_DOWNLOAD_STATUS to downloadStatus
|
||||
KEY_GAME_TYPE to gameType
|
||||
KEY_DOWNLOAD_TYPE to downloadType
|
||||
@ -4335,6 +4339,31 @@ object SensorsBridge {
|
||||
trackEvent(EVENT_HALO_SELF_CLICK, json)
|
||||
}
|
||||
|
||||
/**
|
||||
* 事件ID:SearchDiscoveryClick
|
||||
* 事件名称:搜索发现点击事件
|
||||
* 触发时机:点击搜索发现时触发
|
||||
* @param labelName 标签名称
|
||||
* @param labelId 标签ID
|
||||
* @param searchContent 搜索内容
|
||||
* @param position 序号
|
||||
* @see EVENT_SEARCH_DISCOVERY_CLICK
|
||||
*/
|
||||
fun trackSearchDiscoveryClick(
|
||||
labelName: String,
|
||||
labelId: String,
|
||||
searchContent: String,
|
||||
position: Int
|
||||
) {
|
||||
val json = json {
|
||||
KEY_LABEL_NAME to labelName
|
||||
KEY_LABEL_ID to labelId
|
||||
KEY_SEARCH_CONTENT to searchContent
|
||||
KEY_POSITION to position
|
||||
}
|
||||
trackEvent(EVENT_SEARCH_DISCOVERY_CLICK, json)
|
||||
}
|
||||
|
||||
/**
|
||||
* 事件ID:BypassBrowsing
|
||||
* 事件名称:分流器访问事件
|
||||
|
||||
@ -2,6 +2,7 @@ plugins {
|
||||
id 'com.android.library'
|
||||
id 'org.jetbrains.kotlin.android'
|
||||
id 'kotlin-kapt'
|
||||
id 'com.google.devtools.ksp'
|
||||
}
|
||||
|
||||
android {
|
||||
@ -17,11 +18,8 @@ android {
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
||||
|
||||
kapt {
|
||||
arguments {
|
||||
arg("AROUTER_MODULE_NAME", project.name)
|
||||
}
|
||||
ksp {
|
||||
arg("AROUTER_MODULE_NAME", project.name)
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
@ -43,10 +41,6 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||
|
||||
api "androidx.core:core-ktx:${core}"
|
||||
api "androidx.recyclerview:recyclerview:${recyclerView}"
|
||||
api "androidx.appcompat:appcompat:${appCompat}"
|
||||
@ -83,7 +77,8 @@ dependencies {
|
||||
})
|
||||
|
||||
api "com.alibaba:arouter-api:$arouterVersion"
|
||||
kapt "com.alibaba:arouter-compiler:$arouterVersion"
|
||||
ksp("com.github.JailedBird:ArouterKspCompiler:${arouterKspCompilerVersion}")
|
||||
kapt "com.google.auto.service:auto-service:${autoServiceVersion}"
|
||||
|
||||
api project(':libraries:LGLibrary')
|
||||
api project(':libraries:QQShare')
|
||||
|
||||
@ -15,6 +15,8 @@ interface ILoginProvider : IProvider {
|
||||
callback: () -> Unit
|
||||
)
|
||||
|
||||
fun createLoggingDialog(context: Context): Dialog
|
||||
|
||||
fun createQuickLoginBackgroundView(context: Context): View
|
||||
|
||||
fun startQuickLoginHelperPageFromQuickLogin(loginToken: String, context: Context, callback: (() -> Unit)?)
|
||||
|
||||
@ -4,5 +4,5 @@ import com.alibaba.android.arouter.facade.template.IProvider
|
||||
|
||||
interface IPackageHelperProvider : IProvider {
|
||||
|
||||
fun getLocalPackageNameSet(): Set<String>
|
||||
fun getLocalPackageNameSet(): HashSet<String>
|
||||
}
|
||||
@ -6,8 +6,6 @@ import android.text.TextUtils;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileReader;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class ProcessUtil {
|
||||
@ -22,25 +20,13 @@ public class ProcessUtil {
|
||||
return currentProcessName;
|
||||
}
|
||||
|
||||
//0)通过反射 ActivityThread 获取实例再获取当前进程名
|
||||
currentProcessName = getCurrentProcessNameByActivityThreadInstance();
|
||||
if (!TextUtils.isEmpty(currentProcessName)) {
|
||||
return currentProcessName;
|
||||
}
|
||||
|
||||
//1)通过 CMD 获取当前进程名
|
||||
currentProcessName = getCurrentProcessNameByCMD(android.os.Process.myPid());
|
||||
if (!TextUtils.isEmpty(currentProcessName)) {
|
||||
return currentProcessName;
|
||||
}
|
||||
|
||||
//2)通过 Application 的 API 获取当前进程名
|
||||
//1)通过Application的API获取当前进程名
|
||||
currentProcessName = getCurrentProcessNameByApplication();
|
||||
if (!TextUtils.isEmpty(currentProcessName)) {
|
||||
return currentProcessName;
|
||||
}
|
||||
|
||||
//3)通过反射 ActivityThread 获取当前进程名
|
||||
//2)通过反射ActivityThread获取当前进程名
|
||||
currentProcessName = getCurrentProcessNameByActivityThread();
|
||||
if (!TextUtils.isEmpty(currentProcessName)) {
|
||||
return currentProcessName;
|
||||
@ -52,7 +38,7 @@ public class ProcessUtil {
|
||||
/**
|
||||
* 通过Application新的API获取进程名,无需反射,无需IPC,效率最高。
|
||||
*/
|
||||
private static String getCurrentProcessNameByApplication() {
|
||||
public static String getCurrentProcessNameByApplication() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||
return Application.getProcessName();
|
||||
}
|
||||
@ -62,7 +48,7 @@ public class ProcessUtil {
|
||||
/**
|
||||
* 通过反射ActivityThread获取进程名,避免了ipc
|
||||
*/
|
||||
private static String getCurrentProcessNameByActivityThread() {
|
||||
public static String getCurrentProcessNameByActivityThread() {
|
||||
String processName = null;
|
||||
try {
|
||||
final Method declaredMethod = Class.forName("android.app.ActivityThread", false, Application.class.getClassLoader())
|
||||
@ -78,52 +64,4 @@ public class ProcessUtil {
|
||||
return processName;
|
||||
}
|
||||
|
||||
private static String getCurrentProcessNameByActivityThreadInstance() {
|
||||
try {
|
||||
// Get ActivityThread class
|
||||
Class<?> activityThreadClass = Class.forName("android.app.ActivityThread",false, Application.class.getClassLoader());
|
||||
|
||||
// Get the current ActivityThread instance
|
||||
Method currentActivityThreadMethod = activityThreadClass.getDeclaredMethod("currentActivityThread");
|
||||
currentActivityThreadMethod.setAccessible(true);
|
||||
Object activityThread = currentActivityThreadMethod.invoke(null);
|
||||
|
||||
// Get the getProcessName method
|
||||
Method getProcessNameMethod = activityThreadClass.getDeclaredMethod("getProcessName");
|
||||
getProcessNameMethod.setAccessible(true);
|
||||
|
||||
// Call the getProcessName method
|
||||
return (String) getProcessNameMethod.invoke(activityThread);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static String getCurrentProcessNameByCMD(int pid) {
|
||||
//get from /proc/PID/cmdline
|
||||
BufferedReader br = null;
|
||||
try {
|
||||
br = new BufferedReader(new FileReader("/proc/" + pid + "/cmdline"));
|
||||
String processName = br.readLine();
|
||||
if (!TextUtils.isEmpty(processName)) {
|
||||
processName = processName.trim();
|
||||
if (!TextUtils.isEmpty(processName)) {
|
||||
return processName; //OK
|
||||
}
|
||||
}
|
||||
} catch (Exception ignored) {
|
||||
|
||||
} finally {
|
||||
try {
|
||||
if (br != null) {
|
||||
br.close();
|
||||
}
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
//failed
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@ -3,6 +3,7 @@ plugins {
|
||||
id 'org.jetbrains.kotlin.android'
|
||||
id 'kotlin-kapt'
|
||||
id 'kotlin-parcelize'
|
||||
id 'com.google.devtools.ksp'
|
||||
}
|
||||
|
||||
android {
|
||||
@ -13,8 +14,6 @@ android {
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode rootProject.ext.versionCode
|
||||
versionName rootProject.ext.versionName
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
@ -22,10 +21,8 @@ android {
|
||||
dataBinding true
|
||||
}
|
||||
|
||||
kapt {
|
||||
arguments {
|
||||
arg("AROUTER_MODULE_NAME", project.name)
|
||||
}
|
||||
ksp {
|
||||
arg("AROUTER_MODULE_NAME", project.name)
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
@ -44,6 +41,7 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
kapt "com.google.auto.service:auto-service:${autoServiceVersion}"
|
||||
|
||||
implementation(project(path: ":module_common")) {
|
||||
exclude group: 'androidx.swiperefreshlayout'
|
||||
|
||||
@ -0,0 +1,22 @@
|
||||
package com.gh.gamecenter.feature.entity
|
||||
|
||||
import android.os.Parcelable
|
||||
import com.google.gson.annotations.SerializedName
|
||||
import kotlinx.parcelize.Parcelize
|
||||
|
||||
@Parcelize
|
||||
class DiscoveryTagEntity(
|
||||
@SerializedName("_id")
|
||||
var id: String? = "",
|
||||
var text: String? = "",
|
||||
@SerializedName("keyword")
|
||||
var _keyword: String? = ""
|
||||
) : Parcelable {
|
||||
val keyword get(): String {
|
||||
val keyword = this._keyword
|
||||
if (keyword.isNullOrEmpty()) {
|
||||
return text ?: ""
|
||||
}
|
||||
return keyword
|
||||
}
|
||||
}
|
||||
@ -1051,7 +1051,6 @@ data class GameEntity(
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TAG: String = "GameEntity"
|
||||
const val CHECK_MIRROR_INFO_INTERVAL = 10 * 1000 // 检查镜像更新间隔 10s
|
||||
|
||||
private const val GAME_DOWNLOAD_BUTTON_MODE_UNKNOWN = 0
|
||||
|
||||
@ -70,6 +70,8 @@ class SettingsEntity(
|
||||
var hotSearch: List<HotSearch>? = listOf(),
|
||||
@SerializedName("tag")
|
||||
var hotTag: List<HotTagEntity>? = listOf(),
|
||||
@SerializedName("discover_tag")
|
||||
var discoveryTag: List<DiscoveryTagEntity>? = listOf(),
|
||||
@SerializedName("hot_list")
|
||||
var rankList: List<RankList>? = listOf(),
|
||||
@SerializedName("wechat_game_search_list")
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user