feat: 客户端删除已经不再应用的页面—客户端 https://jira.shanqu.cc/browse/GHZSCY-6491
This commit is contained in:
@ -72,7 +72,6 @@ android_build:
|
|||||||
only:
|
only:
|
||||||
- dev
|
- dev
|
||||||
- release
|
- release
|
||||||
- feat/GHZSCY-6488
|
|
||||||
|
|
||||||
# 代码检查
|
# 代码检查
|
||||||
sonarqube_analysis:
|
sonarqube_analysis:
|
||||||
@ -157,5 +156,4 @@ oss-upload&send-email:
|
|||||||
- /usr/local/bin/python /ci-android-mail-jira-comment.py
|
- /usr/local/bin/python /ci-android-mail-jira-comment.py
|
||||||
only:
|
only:
|
||||||
- dev
|
- dev
|
||||||
- release
|
- release
|
||||||
- feat/GHZSCY-6488
|
|
||||||
@ -333,14 +333,6 @@
|
|||||||
android:screenOrientation="portrait"
|
android:screenOrientation="portrait"
|
||||||
android:windowSoftInputMode="stateHidden" />
|
android:windowSoftInputMode="stateHidden" />
|
||||||
|
|
||||||
<activity
|
|
||||||
android:name=".category.CategoryDirectoryActivity"
|
|
||||||
android:screenOrientation="portrait" />
|
|
||||||
|
|
||||||
<activity
|
|
||||||
android:name=".category.CategoryListActivity"
|
|
||||||
android:screenOrientation="portrait" />
|
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="com.gh.gamecenter.UserInfoActivity"
|
android:name="com.gh.gamecenter.UserInfoActivity"
|
||||||
android:screenOrientation="portrait" />
|
android:screenOrientation="portrait" />
|
||||||
@ -562,14 +554,6 @@
|
|||||||
android:name=".simulatorgame.SimulatorManagementActivity"
|
android:name=".simulatorgame.SimulatorManagementActivity"
|
||||||
android:screenOrientation="portrait" />
|
android:screenOrientation="portrait" />
|
||||||
|
|
||||||
<activity
|
|
||||||
android:name=".catalog.CatalogActivity"
|
|
||||||
android:screenOrientation="portrait" />
|
|
||||||
|
|
||||||
<activity
|
|
||||||
android:name=".catalog.NewCatalogListActivity"
|
|
||||||
android:screenOrientation="portrait" />
|
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".forum.search.ForumOrUserSearchActivity"
|
android:name=".forum.search.ForumOrUserSearchActivity"
|
||||||
android:screenOrientation="portrait" />
|
android:screenOrientation="portrait" />
|
||||||
|
|||||||
@ -268,10 +268,6 @@ object DefaultUrlHandler {
|
|||||||
directToGameVideo(context, id, entrance, "")
|
directToGameVideo(context, id, entrance, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
EntranceConsts.HOST_CATEGORY -> {
|
|
||||||
val title = uri.getQueryParameter("title")
|
|
||||||
DirectUtils.directCategoryDirectory(context, id, title ?: "", entrance, "")
|
|
||||||
}
|
|
||||||
EntranceConsts.HOST_COLUMN_COLLECTION -> {
|
EntranceConsts.HOST_COLUMN_COLLECTION -> {
|
||||||
val name = uri.getQueryParameter("name")
|
val name = uri.getQueryParameter("name")
|
||||||
DirectUtils.directToColumnCollection(context, id, -1, entrance, name ?: "")
|
DirectUtils.directToColumnCollection(context, id, -1, entrance, name ?: "")
|
||||||
|
|||||||
@ -19,8 +19,6 @@ import com.gh.common.util.EntranceUtils.jumpActivity
|
|||||||
import com.gh.common.util.EntranceUtils.jumpActivityCompat
|
import com.gh.common.util.EntranceUtils.jumpActivityCompat
|
||||||
import com.gh.gamecenter.*
|
import com.gh.gamecenter.*
|
||||||
import com.gh.gamecenter.amway.AmwayActivity
|
import com.gh.gamecenter.amway.AmwayActivity
|
||||||
import com.gh.gamecenter.catalog.CatalogActivity
|
|
||||||
import com.gh.gamecenter.category.CategoryDirectoryActivity
|
|
||||||
import com.gh.gamecenter.category2.CategoryV2Activity
|
import com.gh.gamecenter.category2.CategoryV2Activity
|
||||||
import com.gh.gamecenter.common.base.activity.BaseActivity
|
import com.gh.gamecenter.common.base.activity.BaseActivity
|
||||||
import com.gh.gamecenter.common.base.activity.BaseActivity_TabLayout
|
import com.gh.gamecenter.common.base.activity.BaseActivity_TabLayout
|
||||||
@ -151,14 +149,12 @@ object DirectUtils {
|
|||||||
"qqqun",
|
"qqqun",
|
||||||
"tag",
|
"tag",
|
||||||
"all_community_article",
|
"all_community_article",
|
||||||
"category",
|
|
||||||
"block",
|
"block",
|
||||||
"column_collection",
|
"column_collection",
|
||||||
"server",
|
"server",
|
||||||
"top_game_comment",
|
"top_game_comment",
|
||||||
"wechat_bind",
|
"wechat_bind",
|
||||||
"video",
|
"video",
|
||||||
"catalog",
|
|
||||||
"category_v2",
|
"category_v2",
|
||||||
"common_collection",
|
"common_collection",
|
||||||
"game_list",
|
"game_list",
|
||||||
@ -285,10 +281,6 @@ object DirectUtils {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
"category", "分类" -> directCategoryDirectory(context, linkEntity.link!!, linkEntity.text!!)
|
|
||||||
|
|
||||||
"catalog" -> directCatalog(context, linkEntity.link!!, linkEntity.text!!, entrance, path)
|
|
||||||
|
|
||||||
"category_v2" -> directCategoryV2(
|
"category_v2" -> directCategoryV2(
|
||||||
context,
|
context,
|
||||||
linkEntity.link!!,
|
linkEntity.link!!,
|
||||||
@ -1423,47 +1415,6 @@ object DirectUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 跳转分类
|
|
||||||
*/
|
|
||||||
@JvmStatic
|
|
||||||
fun directCategoryDirectory(
|
|
||||||
context: Context,
|
|
||||||
categoryId: String,
|
|
||||||
categoryTitle: String,
|
|
||||||
entrance: String? = null,
|
|
||||||
path: String? = ""
|
|
||||||
) {
|
|
||||||
if (categoryId.isEmpty()) return
|
|
||||||
val bundle = Bundle()
|
|
||||||
bundle.putString(KEY_TO, CategoryDirectoryActivity::class.java.name)
|
|
||||||
bundle.putString(KEY_CATEGORY_ID, categoryId)
|
|
||||||
bundle.putString(KEY_CATEGORY_TITLE, categoryTitle)
|
|
||||||
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
|
|
||||||
bundle.putString(KEY_PATH, path)
|
|
||||||
jumpActivity(context, bundle)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 跳转新分类
|
|
||||||
*/
|
|
||||||
@JvmStatic
|
|
||||||
fun directCatalog(
|
|
||||||
context: Context,
|
|
||||||
catalogId: String,
|
|
||||||
catalogTitle: String,
|
|
||||||
entrance: String? = null,
|
|
||||||
path: String? = "",
|
|
||||||
) {
|
|
||||||
if (catalogId.isEmpty()) return
|
|
||||||
val bundle = Bundle()
|
|
||||||
bundle.putString(KEY_TO, CatalogActivity::class.java.name)
|
|
||||||
bundle.putString(KEY_CATALOG_ID, catalogId)
|
|
||||||
bundle.putString(KEY_CATALOG_TITLE, catalogTitle)
|
|
||||||
bundle.putString(KEY_ENTRANCE, BaseActivity.mergeEntranceAndPath(entrance, path))
|
|
||||||
jumpActivity(context, bundle)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 跳转新分类2.0
|
* 跳转新分类2.0
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -734,18 +734,6 @@ public class LogUtils {
|
|||||||
LoghubUtils.log(object, LOG_STORE_EVENT, false);
|
LoghubUtils.log(object, LOG_STORE_EVENT, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void logNewCatalogAppearanceEvent(String entrance, String key) {
|
|
||||||
logCatalogEvent("access_to_classification", entrance, key, -1, -1, -1, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void logSubCatalogClickEvent(String entrance, String key, int seq1) {
|
|
||||||
logCatalogEvent("click_first_classification", entrance, key, seq1, -1, -1, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void logSubCatalogContentClickEvent(String entrance, String key, int seq1, int seq2) {
|
|
||||||
logCatalogEvent("click_secondary_classification", entrance, key, seq1, seq2, -1, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void logSpecialCatalogContentClickEvent(String entrance, String key, int seq1, int seqContent) {
|
public static void logSpecialCatalogContentClickEvent(String entrance, String key, int seq1, int seqContent) {
|
||||||
logCatalogEvent("click_content", entrance, key, seq1, -1, seqContent, -1);
|
logCatalogEvent("click_content", entrance, key, seq1, -1, seqContent, -1);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,331 +0,0 @@
|
|||||||
package com.gh.common.view
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.graphics.Color
|
|
||||||
import android.util.AttributeSet
|
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import android.widget.ImageView
|
|
||||||
import android.widget.LinearLayout
|
|
||||||
import android.widget.PopupWindow
|
|
||||||
import android.widget.TextView
|
|
||||||
import androidx.annotation.ColorInt
|
|
||||||
import androidx.core.content.ContextCompat
|
|
||||||
import com.gh.gamecenter.R
|
|
||||||
import com.gh.gamecenter.common.utils.setDrawableEnd
|
|
||||||
import com.gh.gamecenter.common.utils.toColor
|
|
||||||
import com.gh.gamecenter.common.utils.visibleIf
|
|
||||||
import com.gh.gamecenter.entity.CatalogEntity
|
|
||||||
import com.gh.gamecenter.entity.SubjectSettingEntity
|
|
||||||
import com.google.android.flexbox.FlexboxLayout
|
|
||||||
|
|
||||||
class CatalogFilterView @JvmOverloads constructor(
|
|
||||||
context: Context,
|
|
||||||
attrs: AttributeSet? = null,
|
|
||||||
defStyleAttr: Int = 0
|
|
||||||
) : LinearLayout(context, attrs, defStyleAttr) {
|
|
||||||
|
|
||||||
private var mTypeTv: TextView
|
|
||||||
private var mCatalogTv: TextView
|
|
||||||
private var mSizeTv: TextView
|
|
||||||
private var mTypeContainer: View
|
|
||||||
private var mCatalogContainer: View
|
|
||||||
private var mSizeContainer: View
|
|
||||||
|
|
||||||
private var mTypeFilterArray = ArrayList<SortType>()
|
|
||||||
private var mCatalogFilterArray = ArrayList<CatalogEntity.SubCatalogEntity>()
|
|
||||||
private var sizeFilterArray: ArrayList<SubjectSettingEntity.Size>? = null
|
|
||||||
|
|
||||||
private var mOnCatalogFilterSetupListener: OnCatalogFilterSetupListener? = null
|
|
||||||
|
|
||||||
private var mTypePopupWindow: PopupWindow? = null
|
|
||||||
private var mCatalogPopupWindow: PopupWindow? = null
|
|
||||||
private var mSizePopupWindow: PopupWindow? = null
|
|
||||||
|
|
||||||
init {
|
|
||||||
View.inflate(context, R.layout.layout_catalog_filter, this)
|
|
||||||
|
|
||||||
mTypeTv = findViewById(R.id.type_tv)
|
|
||||||
mCatalogTv = findViewById(R.id.catalog_tv)
|
|
||||||
mSizeTv = findViewById(R.id.size_tv)
|
|
||||||
mTypeContainer = findViewById(R.id.container_type)
|
|
||||||
mCatalogContainer = findViewById(R.id.container_catalog)
|
|
||||||
mSizeContainer = findViewById(R.id.container_size)
|
|
||||||
|
|
||||||
mTypeContainer.setOnClickListener {
|
|
||||||
showSelectTypePopupWindow(this, mTypeTv, mTypeTv.text.toString())
|
|
||||||
}
|
|
||||||
|
|
||||||
mCatalogContainer.setOnClickListener {
|
|
||||||
showSelectCatalogPopupWindow(this, mCatalogTv, mCatalogTv.text.toString())
|
|
||||||
}
|
|
||||||
|
|
||||||
mSizeContainer.setOnClickListener {
|
|
||||||
showSelectSizePopupWindow(this, mSizeTv, mSizeTv.text.toString())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setTypeList(switch: CatalogEntity.CatalogSwitch) {
|
|
||||||
switch.run {
|
|
||||||
if ("on" == hotSort) mTypeFilterArray.add(SortType.RECOMMENDED)
|
|
||||||
if ("on" == newSort) mTypeFilterArray.add(SortType.NEWEST)
|
|
||||||
if ("on" == starSort) mTypeFilterArray.add(SortType.RATING)
|
|
||||||
}
|
|
||||||
if (mTypeFilterArray.isNotEmpty()) mTypeTv.text = mTypeFilterArray[0].value
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setCatalogList(subCatalogList: List<CatalogEntity.SubCatalogEntity>, initCatalogName: String) {
|
|
||||||
mCatalogFilterArray = ArrayList(subCatalogList)
|
|
||||||
mCatalogTv.text = initCatalogName
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setOnConfigSetupListener(onCatalogFilterSetupListener: OnCatalogFilterSetupListener) {
|
|
||||||
mOnCatalogFilterSetupListener = onCatalogFilterSetupListener
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun toggleHighlightedTextView(targetTextView: TextView, highlightIt: Boolean) {
|
|
||||||
if (highlightIt) {
|
|
||||||
targetTextView.background = ContextCompat.getDrawable(targetTextView.context, R.drawable.bg_tag_text)
|
|
||||||
targetTextView.setTextColor(Color.WHITE)
|
|
||||||
} else {
|
|
||||||
targetTextView.background = null
|
|
||||||
targetTextView.setTextColor(R.color.text_757575.toColor(context))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun showSelectTypePopupWindow(containerView: View, typeTv: TextView, typeText: String) {
|
|
||||||
typeTv.setTextColor(R.color.text_theme.toColor(context))
|
|
||||||
typeTv.setDrawableEnd(R.drawable.ic_filter_arrow_up)
|
|
||||||
|
|
||||||
val inflater = LayoutInflater.from(typeTv.context)
|
|
||||||
val layout = inflater.inflate(R.layout.layout_filter_size, null)
|
|
||||||
val popupWindow = PopupWindow(
|
|
||||||
layout,
|
|
||||||
LayoutParams.MATCH_PARENT,
|
|
||||||
LayoutParams.WRAP_CONTENT
|
|
||||||
).apply { mTypePopupWindow = this }
|
|
||||||
|
|
||||||
val flexboxLayout = layout.findViewById<FlexboxLayout>(R.id.flexbox)
|
|
||||||
val backgroundView = layout.findViewById<View>(R.id.background)
|
|
||||||
|
|
||||||
backgroundView.setOnClickListener {
|
|
||||||
popupWindow.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
for (type in mTypeFilterArray) {
|
|
||||||
val item = inflater.inflate(R.layout.item_filter_size, flexboxLayout, false)
|
|
||||||
|
|
||||||
// 单列 3 个,强行设置宽度为屏幕的 1/3
|
|
||||||
val width = typeTv.context.resources.displayMetrics.widthPixels / 3
|
|
||||||
val height = item.layoutParams.height
|
|
||||||
|
|
||||||
item.layoutParams = ViewGroup.LayoutParams(width, height)
|
|
||||||
flexboxLayout.addView(item)
|
|
||||||
|
|
||||||
val tv = item.findViewById<TextView>(R.id.size_tv)
|
|
||||||
tv.text = type.value
|
|
||||||
|
|
||||||
toggleHighlightedTextView(tv, typeText == type.value)
|
|
||||||
|
|
||||||
tv.tag = type.value
|
|
||||||
|
|
||||||
item.setOnClickListener {
|
|
||||||
toggleHighlightedTextView(tv, true)
|
|
||||||
popupWindow.dismiss()
|
|
||||||
typeTv.text = type.value
|
|
||||||
|
|
||||||
mOnCatalogFilterSetupListener?.onSetupSortType(type)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
popupWindow.setOnDismissListener {
|
|
||||||
typeTv.setTextColor(R.color.text_757575.toColor(context))
|
|
||||||
typeTv.setDrawableEnd(R.drawable.ic_filter_arrow_down)
|
|
||||||
mTypePopupWindow = null
|
|
||||||
}
|
|
||||||
|
|
||||||
popupWindow.isTouchable = true
|
|
||||||
popupWindow.isFocusable = true
|
|
||||||
popupWindow.animationStyle = 0
|
|
||||||
popupWindow.showAsDropDown(containerView, 0, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun showSelectCatalogPopupWindow(containerView: View, catalogTv: TextView, catalogText: String) {
|
|
||||||
catalogTv.setTextColor(R.color.text_theme.toColor(context))
|
|
||||||
catalogTv.setDrawableEnd(R.drawable.ic_filter_arrow_up)
|
|
||||||
|
|
||||||
val inflater = LayoutInflater.from(catalogTv.context)
|
|
||||||
val layout = inflater.inflate(R.layout.layout_filter_size, null)
|
|
||||||
val popupWindow = PopupWindow(
|
|
||||||
layout,
|
|
||||||
LayoutParams.MATCH_PARENT,
|
|
||||||
LayoutParams.WRAP_CONTENT
|
|
||||||
).apply { mCatalogPopupWindow = this }
|
|
||||||
|
|
||||||
val flexboxLayout = layout.findViewById<FlexboxLayout>(R.id.flexbox)
|
|
||||||
val backgroundView = layout.findViewById<View>(R.id.background)
|
|
||||||
|
|
||||||
backgroundView.setOnClickListener {
|
|
||||||
popupWindow.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
for (entity in mCatalogFilterArray) {
|
|
||||||
val item = inflater.inflate(R.layout.item_filter_size, flexboxLayout, false)
|
|
||||||
|
|
||||||
// 单列 3 个,强行设置宽度为屏幕的 1/3
|
|
||||||
val width = catalogTv.context.resources.displayMetrics.widthPixels / 3
|
|
||||||
val height = item.layoutParams.height
|
|
||||||
|
|
||||||
item.layoutParams = ViewGroup.LayoutParams(width, height)
|
|
||||||
flexboxLayout.addView(item)
|
|
||||||
|
|
||||||
val tv = item.findViewById<TextView>(R.id.size_tv)
|
|
||||||
val iv = item.findViewById<ImageView>(R.id.recommend_iv)
|
|
||||||
tv.text = entity.name
|
|
||||||
iv.visibleIf(entity.recommended)
|
|
||||||
|
|
||||||
toggleHighlightedTextView(tv, catalogText == entity.name)
|
|
||||||
|
|
||||||
tv.tag = entity.name
|
|
||||||
|
|
||||||
item.setOnClickListener {
|
|
||||||
toggleHighlightedTextView(tv, true)
|
|
||||||
popupWindow.dismiss()
|
|
||||||
catalogTv.text = entity.name
|
|
||||||
|
|
||||||
mOnCatalogFilterSetupListener?.onSetupSortCatalog(entity)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
popupWindow.setOnDismissListener {
|
|
||||||
catalogTv.setTextColor(R.color.text_757575.toColor(context))
|
|
||||||
catalogTv.setDrawableEnd(R.drawable.ic_filter_arrow_down)
|
|
||||||
mCatalogPopupWindow = null
|
|
||||||
}
|
|
||||||
|
|
||||||
popupWindow.isTouchable = true
|
|
||||||
popupWindow.isFocusable = true
|
|
||||||
popupWindow.animationStyle = 0
|
|
||||||
popupWindow.showAsDropDown(containerView, 0, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun showSelectSizePopupWindow(containerView: View, sizeTv: TextView, sizeText: String) {
|
|
||||||
sizeTv.setTextColor(R.color.text_theme.toColor(context))
|
|
||||||
sizeTv.setDrawableEnd(R.drawable.ic_filter_arrow_up)
|
|
||||||
|
|
||||||
val inflater = LayoutInflater.from(sizeTv.context)
|
|
||||||
val layout = inflater.inflate(R.layout.layout_filter_size, null)
|
|
||||||
val popupWindow = PopupWindow(
|
|
||||||
layout,
|
|
||||||
LayoutParams.MATCH_PARENT,
|
|
||||||
LayoutParams.WRAP_CONTENT
|
|
||||||
).apply { mSizePopupWindow = this }
|
|
||||||
|
|
||||||
val flexboxLayout = layout.findViewById<FlexboxLayout>(R.id.flexbox)
|
|
||||||
val backgroundView = layout.findViewById<View>(R.id.background)
|
|
||||||
|
|
||||||
sizeFilterArray = if (sizeFilterArray == null) {
|
|
||||||
getDefaultSizeFilterArray()
|
|
||||||
} else {
|
|
||||||
sizeFilterArray?.apply {
|
|
||||||
if (firstOrNull()?.text != "全部大小") {
|
|
||||||
add(0, SubjectSettingEntity.Size(min = -1, max = -1, text = "全部大小"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
backgroundView.setOnClickListener {
|
|
||||||
popupWindow.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
for (size in sizeFilterArray!!) {
|
|
||||||
val item = inflater.inflate(R.layout.item_filter_size, flexboxLayout, false)
|
|
||||||
|
|
||||||
// 单列 3 个,强行设置宽度为屏幕的 1/3
|
|
||||||
val width = sizeTv.context.resources.displayMetrics.widthPixels / 3
|
|
||||||
val height = item.layoutParams.height
|
|
||||||
|
|
||||||
item.layoutParams = ViewGroup.LayoutParams(width, height)
|
|
||||||
flexboxLayout.addView(item)
|
|
||||||
|
|
||||||
val tv = item.findViewById<TextView>(R.id.size_tv)
|
|
||||||
tv.text = size.text
|
|
||||||
|
|
||||||
toggleHighlightedTextView(tv, sizeText == size.text)
|
|
||||||
|
|
||||||
tv.tag = size.text
|
|
||||||
|
|
||||||
item.setOnClickListener {
|
|
||||||
toggleHighlightedTextView(tv, true)
|
|
||||||
popupWindow.dismiss()
|
|
||||||
sizeTv.text = size.text
|
|
||||||
|
|
||||||
mOnCatalogFilterSetupListener?.onSetupSortSize(size)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
popupWindow.setOnDismissListener {
|
|
||||||
sizeTv.setTextColor(R.color.text_757575.toColor(context))
|
|
||||||
sizeTv.setDrawableEnd(R.drawable.ic_filter_arrow_down)
|
|
||||||
mSizePopupWindow = null
|
|
||||||
}
|
|
||||||
|
|
||||||
popupWindow.isTouchable = true
|
|
||||||
popupWindow.isFocusable = true
|
|
||||||
popupWindow.animationStyle = 0
|
|
||||||
popupWindow.showAsDropDown(containerView, 0, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getDefaultSizeFilterArray(): ArrayList<SubjectSettingEntity.Size> {
|
|
||||||
return arrayListOf<SubjectSettingEntity.Size>().apply {
|
|
||||||
add(SubjectSettingEntity.Size(min = -1, max = -1, text = "全部大小"))
|
|
||||||
add(SubjectSettingEntity.Size(min = -1, max = 100, text = "100M以下"))
|
|
||||||
add(SubjectSettingEntity.Size(min = 100, max = 300, text = "100-300M"))
|
|
||||||
add(SubjectSettingEntity.Size(min = 300, max = 500, text = "300-500M"))
|
|
||||||
add(SubjectSettingEntity.Size(min = 500, max = 1000, text = "500M-1G"))
|
|
||||||
add(SubjectSettingEntity.Size(min = 1000, max = -1, text = "1G以上"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setRootBackgroundColor(@ColorInt color: Int) {
|
|
||||||
findViewById<View>(R.id.config_controller).setBackgroundColor(color)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setItemTextColor(@ColorInt color: Int) {
|
|
||||||
mTypeTv.setTextColor(color)
|
|
||||||
mCatalogTv.setTextColor(color)
|
|
||||||
mSizeTv.setTextColor(color)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun updatePopupWindow() {
|
|
||||||
when {
|
|
||||||
mTypePopupWindow != null && mTypePopupWindow!!.isShowing -> {
|
|
||||||
mTypePopupWindow?.dismiss()
|
|
||||||
showSelectTypePopupWindow(this, mTypeTv, mTypeTv.text.toString())
|
|
||||||
}
|
|
||||||
|
|
||||||
mCatalogPopupWindow != null && mCatalogPopupWindow!!.isShowing -> {
|
|
||||||
mCatalogPopupWindow?.dismiss()
|
|
||||||
showSelectCatalogPopupWindow(this, mCatalogTv, mCatalogTv.text.toString())
|
|
||||||
}
|
|
||||||
|
|
||||||
mSizePopupWindow != null && mSizePopupWindow!!.isShowing -> {
|
|
||||||
mSizePopupWindow?.dismiss()
|
|
||||||
showSelectSizePopupWindow(this, mSizeTv, mSizeTv.text.toString())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface OnCatalogFilterSetupListener {
|
|
||||||
fun onSetupSortSize(sortSize: SubjectSettingEntity.Size)
|
|
||||||
fun onSetupSortType(sortType: SortType)
|
|
||||||
fun onSetupSortCatalog(sortCatalog: CatalogEntity.SubCatalogEntity)
|
|
||||||
}
|
|
||||||
|
|
||||||
enum class SortType(val value: String) {
|
|
||||||
RECOMMENDED("热门推荐"),
|
|
||||||
NEWEST("最新上线"),
|
|
||||||
RATING("最高评分")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,64 +0,0 @@
|
|||||||
package com.gh.common.view
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.util.AttributeSet
|
|
||||||
import android.view.View
|
|
||||||
import android.widget.LinearLayout
|
|
||||||
import android.widget.TextView
|
|
||||||
import com.gh.gamecenter.R
|
|
||||||
import com.gh.gamecenter.category.CategoryListActivity
|
|
||||||
import com.gh.gamecenter.entity.CategoryEntity
|
|
||||||
|
|
||||||
class SubCategoryView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) :
|
|
||||||
LinearLayout(context, attrs, defStyleAttr) {
|
|
||||||
|
|
||||||
var leftTv: TextView
|
|
||||||
var centerTv: TextView
|
|
||||||
var rightTv: TextView
|
|
||||||
|
|
||||||
var leftDivider: View
|
|
||||||
var rightDivider: View
|
|
||||||
|
|
||||||
var primeCategory: CategoryEntity? = null
|
|
||||||
var categoryTitle: String? = ""
|
|
||||||
|
|
||||||
init {
|
|
||||||
View.inflate(context, R.layout.layout_sub_category, this)
|
|
||||||
|
|
||||||
leftTv = findViewById(R.id.tv_left_sub_category)
|
|
||||||
centerTv = findViewById(R.id.tv_center_sub_category)
|
|
||||||
rightTv = findViewById(R.id.tv_right_sub_category)
|
|
||||||
|
|
||||||
leftDivider = findViewById(R.id.divider_left)
|
|
||||||
rightDivider = findViewById(R.id.divider_right)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setLeftCategory(category: CategoryEntity) {
|
|
||||||
setCategory(leftTv, category)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setCenterCategory(category: CategoryEntity) {
|
|
||||||
setCategory(centerTv, category)
|
|
||||||
leftDivider.visibility = View.VISIBLE
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setRightCategory(category: CategoryEntity) {
|
|
||||||
setCategory(rightTv, category)
|
|
||||||
rightDivider.visibility = View.VISIBLE
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun setCategory(tv: TextView, category: CategoryEntity) {
|
|
||||||
tv.text = category.name
|
|
||||||
tv.setOnClickListener {
|
|
||||||
tv.context.startActivity(
|
|
||||||
CategoryListActivity.getIntent(
|
|
||||||
tv.context,
|
|
||||||
categoryTitle!!,
|
|
||||||
primeCategory!!,
|
|
||||||
category.name!!
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -5,7 +5,6 @@ import static com.gh.gamecenter.common.constant.EntranceConsts.ENTRANCE_PUSH;
|
|||||||
import static com.gh.gamecenter.common.constant.EntranceConsts.HOST_ANSWER;
|
import static com.gh.gamecenter.common.constant.EntranceConsts.HOST_ANSWER;
|
||||||
import static com.gh.gamecenter.common.constant.EntranceConsts.HOST_ARCHIVE_LOGIN;
|
import static com.gh.gamecenter.common.constant.EntranceConsts.HOST_ARCHIVE_LOGIN;
|
||||||
import static com.gh.gamecenter.common.constant.EntranceConsts.HOST_ARTICLE;
|
import static com.gh.gamecenter.common.constant.EntranceConsts.HOST_ARTICLE;
|
||||||
import static com.gh.gamecenter.common.constant.EntranceConsts.HOST_CATEGORY;
|
|
||||||
import static com.gh.gamecenter.common.constant.EntranceConsts.HOST_COLUMN;
|
import static com.gh.gamecenter.common.constant.EntranceConsts.HOST_COLUMN;
|
||||||
import static com.gh.gamecenter.common.constant.EntranceConsts.HOST_COLUMN_COLLECTION;
|
import static com.gh.gamecenter.common.constant.EntranceConsts.HOST_COLUMN_COLLECTION;
|
||||||
import static com.gh.gamecenter.common.constant.EntranceConsts.HOST_COMMUNITY;
|
import static com.gh.gamecenter.common.constant.EntranceConsts.HOST_COMMUNITY;
|
||||||
@ -315,10 +314,6 @@ public class SkipActivity extends BaseActivity {
|
|||||||
DirectUtils.directToCommunityColumn(this, community, columnId, entrance, "");
|
DirectUtils.directToCommunityColumn(this, community, columnId, entrance, "");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HOST_CATEGORY:
|
|
||||||
title = uri.getQueryParameter("title");
|
|
||||||
DirectUtils.directCategoryDirectory(this, path, title, entrance, pathName);
|
|
||||||
break;
|
|
||||||
case HOST_COLUMN_COLLECTION:
|
case HOST_COLUMN_COLLECTION:
|
||||||
DirectUtils.directToColumnCollection(this, path, -1, entrance, "", "", "", "", null,false);
|
DirectUtils.directToColumnCollection(this, path, -1, entrance, "", "", "", "", null,false);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -1,43 +0,0 @@
|
|||||||
package com.gh.gamecenter.catalog
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.Intent
|
|
||||||
import android.os.Bundle
|
|
||||||
import com.gh.base.DownloadToolbarActivity
|
|
||||||
import com.gh.gamecenter.R
|
|
||||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
|
||||||
import com.gh.gamecenter.common.utils.updateStatusBarColor
|
|
||||||
|
|
||||||
class CatalogActivity : DownloadToolbarActivity() {
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
setToolbarMenu(R.menu.menu_download)
|
|
||||||
updateStatusBarColor(R.color.ui_surface, R.color.ui_surface)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun showDownloadMenu(): Boolean {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun provideNormalIntent(): Intent {
|
|
||||||
return getTargetIntent(this, CatalogActivity::class.java, CatalogFragment::class.java)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDarkModeChanged() {
|
|
||||||
super.onDarkModeChanged()
|
|
||||||
updateStatusBarColor(R.color.ui_surface, R.color.ui_surface)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun isAutoResetViewBackgroundEnabled() = true
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
fun getIntent(context: Context, catalogId: String, catalogTitle: String, entrance: String): Intent {
|
|
||||||
val bundle = Bundle()
|
|
||||||
bundle.putString(EntranceConsts.KEY_CATALOG_ID, catalogId)
|
|
||||||
bundle.putString(EntranceConsts.KEY_CATALOG_TITLE, catalogTitle)
|
|
||||||
bundle.putString(EntranceConsts.KEY_ENTRANCE, entrance)
|
|
||||||
return getTargetIntent(context, CatalogActivity::class.java, CatalogFragment::class.java, bundle)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,53 +0,0 @@
|
|||||||
package com.gh.gamecenter.catalog
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import com.gh.gamecenter.common.base.BaseRecyclerViewHolder
|
|
||||||
import com.gh.gamecenter.common.utils.goneIf
|
|
||||||
import com.gh.gamecenter.common.utils.toBinding
|
|
||||||
import com.gh.gamecenter.common.utils.toColor
|
|
||||||
import com.gh.gamecenter.R
|
|
||||||
import com.gh.gamecenter.databinding.CatalogItemBinding
|
|
||||||
import com.gh.gamecenter.entity.CatalogEntity
|
|
||||||
import com.lightgame.adapter.BaseRecyclerAdapter
|
|
||||||
|
|
||||||
class CatalogAdapter(
|
|
||||||
context: Context,
|
|
||||||
private val mFragment: CatalogFragment,
|
|
||||||
private val mViewModel: CatalogViewModel,
|
|
||||||
private val mList: List<CatalogEntity.SubCatalogEntity>
|
|
||||||
) : BaseRecyclerAdapter<CatalogAdapter.CatalogItemViewHolder>(context) {
|
|
||||||
|
|
||||||
override fun getItemCount() = mList.size
|
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
|
|
||||||
CatalogItemViewHolder(parent.toBinding())
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: CatalogItemViewHolder, position: Int) {
|
|
||||||
holder.binding.run {
|
|
||||||
val catalogEntity = mList[position]
|
|
||||||
catalogName.text = catalogEntity.name
|
|
||||||
recommendTag.goneIf(!catalogEntity.recommended)
|
|
||||||
if (catalogEntity.name == mViewModel.selectedCatalogName) {
|
|
||||||
selectedTag.visibility = View.VISIBLE
|
|
||||||
catalogName.setTextColor(R.color.text_theme.toColor(mContext))
|
|
||||||
root.setBackgroundColor(R.color.ui_surface.toColor(mContext))
|
|
||||||
} else {
|
|
||||||
selectedTag.visibility = View.GONE
|
|
||||||
catalogName.setTextColor(R.color.text_primary.toColor(mContext))
|
|
||||||
root.background = null
|
|
||||||
}
|
|
||||||
root.setOnClickListener {
|
|
||||||
if (catalogEntity.name != mViewModel.selectedCatalogName) {
|
|
||||||
mViewModel.selectedCatalogName = catalogEntity.name
|
|
||||||
mViewModel.logSubCatalogClick(position)
|
|
||||||
mFragment.changeCatalog(position)
|
|
||||||
notifyDataSetChanged()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class CatalogItemViewHolder(val binding: CatalogItemBinding) : BaseRecyclerViewHolder<Any>(binding.root)
|
|
||||||
}
|
|
||||||
@ -1,240 +0,0 @@
|
|||||||
package com.gh.gamecenter.catalog
|
|
||||||
|
|
||||||
import android.os.Bundle
|
|
||||||
import android.view.View
|
|
||||||
import androidx.core.os.bundleOf
|
|
||||||
import androidx.lifecycle.Observer
|
|
||||||
import com.gh.gamecenter.common.base.fragment.LazyFragment
|
|
||||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
|
||||||
import com.gh.gamecenter.common.utils.dip2px
|
|
||||||
import com.gh.gamecenter.common.utils.toColor
|
|
||||||
import com.gh.gamecenter.common.utils.viewModelProviderFromParent
|
|
||||||
import com.gh.gamecenter.common.view.FixLinearLayoutManager
|
|
||||||
import com.gh.gamecenter.R
|
|
||||||
import com.gh.gamecenter.databinding.FragmentCatalogBinding
|
|
||||||
import com.gh.gamecenter.entity.CatalogEntity
|
|
||||||
|
|
||||||
class CatalogFragment : LazyFragment() {
|
|
||||||
|
|
||||||
private var mBinding: FragmentCatalogBinding? = null
|
|
||||||
private var mViewModel: CatalogViewModel? = null
|
|
||||||
private var mEntity: CatalogEntity? = null
|
|
||||||
private var mSpecialCatalogFragment: SpecialCatalogFragment? = null
|
|
||||||
private var mSubCatalogFragment: SubCatalogFragment? = null
|
|
||||||
|
|
||||||
private var mCatalogId: String = ""
|
|
||||||
private var mCatalogTitle: String = ""
|
|
||||||
private var mLastSelectedPosition = -1
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
savedInstanceState?.run {
|
|
||||||
mLastSelectedPosition = getInt(EntranceConsts.KEY_LAST_SELECTED_POSITION)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onSaveInstanceState(outState: Bundle) {
|
|
||||||
mViewModel?.run {
|
|
||||||
outState.putInt(EntranceConsts.KEY_LAST_SELECTED_POSITION, selectedCatalogPosition)
|
|
||||||
}
|
|
||||||
super.onSaveInstanceState(outState)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getRealLayoutId() = R.layout.fragment_catalog
|
|
||||||
|
|
||||||
override fun onRealLayoutInflated(inflatedView: View) {
|
|
||||||
mBinding = FragmentCatalogBinding.bind(inflatedView)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onFragmentFirstVisible() {
|
|
||||||
mCatalogId = arguments?.getString(EntranceConsts.KEY_CATALOG_ID) ?: ""
|
|
||||||
mCatalogTitle = arguments?.getString(EntranceConsts.KEY_CATALOG_TITLE) ?: ""
|
|
||||||
mViewModel = viewModelProviderFromParent(CatalogViewModel.Factory(mCatalogId, mCatalogTitle), mCatalogId)
|
|
||||||
|
|
||||||
mViewModel?.validEntranceName = if (mEntrance.contains("首页")) "首页" else "板块"
|
|
||||||
if (arguments?.getBoolean(EntranceConsts.KEY_IS_HOME) == true) {
|
|
||||||
mViewModel?.validEntranceName = "首页Tab栏"
|
|
||||||
}
|
|
||||||
mViewModel?.logAppearance()
|
|
||||||
|
|
||||||
super.onFragmentFirstVisible()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun initRealView() {
|
|
||||||
super.initRealView()
|
|
||||||
|
|
||||||
setNavigationTitle(mCatalogTitle)
|
|
||||||
mViewModel?.catalogs?.observe(viewLifecycleOwner, Observer {
|
|
||||||
mBinding?.run {
|
|
||||||
reuseLoading.root.visibility = View.GONE
|
|
||||||
if (it != null) {
|
|
||||||
reuseNoConnection.root.visibility = View.GONE
|
|
||||||
if (it.subCatalog.isNotEmpty()) {
|
|
||||||
containerCatalog.visibility = View.VISIBLE
|
|
||||||
reuseNoneData.root.visibility = View.GONE
|
|
||||||
mEntity = it
|
|
||||||
if (mEntity!!.hasSpecial) {
|
|
||||||
val specialEntity = CatalogEntity.SubCatalogEntity(name = "精选")
|
|
||||||
(mEntity!!.subCatalog as ArrayList).add(0, specialEntity)
|
|
||||||
}
|
|
||||||
initView()
|
|
||||||
} else {
|
|
||||||
containerCatalog.visibility = View.GONE
|
|
||||||
reuseNoneData.root.visibility = View.VISIBLE
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
containerCatalog.visibility = View.GONE
|
|
||||||
reuseNoneData.root.visibility = View.GONE
|
|
||||||
reuseNoConnection.root.visibility = View.VISIBLE
|
|
||||||
reuseNoConnection.root.setOnClickListener {
|
|
||||||
reuseNoConnection.root.visibility = View.GONE
|
|
||||||
reuseLoading.root.visibility = View.VISIBLE
|
|
||||||
mViewModel?.getCatalogs()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// 嵌入在首页时特殊处理
|
|
||||||
if (arguments?.getBoolean(EntranceConsts.KEY_IS_HOME) == true) {
|
|
||||||
mBinding?.divider?.visibility = View.GONE
|
|
||||||
mBinding?.root?.setBackgroundColor(R.color.ui_surface.toColor(requireContext()))
|
|
||||||
mBinding?.root?.setPadding(0, 8F.dip2px(), 0, 0)
|
|
||||||
mBinding?.rvCatalog?.setBackgroundColor(R.color.ui_background.toColor(requireContext()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun initView() {
|
|
||||||
mEntity?.run {
|
|
||||||
mViewModel?.run {
|
|
||||||
if (subCatalog.isNotEmpty()) {
|
|
||||||
if (mLastSelectedPosition != -1) {
|
|
||||||
selectedCatalogPosition = mLastSelectedPosition
|
|
||||||
selectedCatalogName = subCatalog[mLastSelectedPosition].name
|
|
||||||
} else {
|
|
||||||
selectedCatalogPosition = 0
|
|
||||||
selectedCatalogName = subCatalog[0].name
|
|
||||||
}
|
|
||||||
mBinding?.rvCatalog?.layoutManager = FixLinearLayoutManager(requireContext())
|
|
||||||
mBinding?.rvCatalog?.adapter =
|
|
||||||
CatalogAdapter(requireContext(), this@CatalogFragment, this, subCatalog)
|
|
||||||
|
|
||||||
if (hasSpecial && selectedCatalogPosition == 0) {
|
|
||||||
mSpecialCatalogFragment =
|
|
||||||
childFragmentManager.findFragmentByTag(SpecialCatalogFragment::class.java.name) as? SpecialCatalogFragment
|
|
||||||
?: SpecialCatalogFragment()
|
|
||||||
mSpecialCatalogFragment?.arguments = bundleOf(
|
|
||||||
EntranceConsts.KEY_IS_CATEGORY_V2 to false,
|
|
||||||
EntranceConsts.KEY_CATALOG_ID to id,
|
|
||||||
EntranceConsts.KEY_CATALOG_TITLE to mCatalogTitle,
|
|
||||||
EntranceConsts.KEY_EXPOSURE_SOURCE to arguments?.getParcelable(
|
|
||||||
EntranceConsts.KEY_EXPOSURE_SOURCE
|
|
||||||
)
|
|
||||||
)
|
|
||||||
childFragmentManager.beginTransaction().replace(
|
|
||||||
R.id.container_sub_catalog,
|
|
||||||
mSpecialCatalogFragment!!,
|
|
||||||
SpecialCatalogFragment::class.java.name
|
|
||||||
).commitAllowingStateLoss()
|
|
||||||
} else {
|
|
||||||
mSubCatalogFragment =
|
|
||||||
childFragmentManager.findFragmentByTag(SubCatalogFragment::class.java.name) as? SubCatalogFragment
|
|
||||||
?: SubCatalogFragment()
|
|
||||||
mSubCatalogFragment?.arguments = bundleOf(
|
|
||||||
EntranceConsts.KEY_CATALOG_ID to id,
|
|
||||||
EntranceConsts.KEY_PRIMARY_CATALOG_ID to subCatalog[selectedCatalogPosition].id,
|
|
||||||
EntranceConsts.KEY_CATALOG_TITLE to mCatalogTitle
|
|
||||||
)
|
|
||||||
childFragmentManager.beginTransaction().replace(
|
|
||||||
R.id.container_sub_catalog,
|
|
||||||
mSubCatalogFragment!!,
|
|
||||||
SubCatalogFragment::class.java.name
|
|
||||||
).commitAllowingStateLoss()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun changeCatalog(position: Int) {
|
|
||||||
mEntity?.run {
|
|
||||||
mViewModel?.run {
|
|
||||||
if (hasSpecial) {
|
|
||||||
changeCatalogIfHasSpecial(position)
|
|
||||||
} else {
|
|
||||||
changeSubCatalogInSubCatalogFragment(position)
|
|
||||||
}
|
|
||||||
selectedCatalogPosition = position
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun changeCatalogIfHasSpecial(position: Int) {
|
|
||||||
mViewModel?.run {
|
|
||||||
when {
|
|
||||||
selectedCatalogPosition == 0 -> changeToSubCatalogFragment(position)
|
|
||||||
position == 0 -> changeToSpecialCatalogFragment()
|
|
||||||
else -> changeSubCatalogInSubCatalogFragment(position)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun changeToSubCatalogFragment(position: Int) {
|
|
||||||
mEntity?.run {
|
|
||||||
mSubCatalogFragment =
|
|
||||||
childFragmentManager.findFragmentByTag(SubCatalogFragment::class.java.name) as? SubCatalogFragment
|
|
||||||
?: SubCatalogFragment()
|
|
||||||
mSubCatalogFragment?.arguments = bundleOf(
|
|
||||||
EntranceConsts.KEY_CATALOG_ID to id,
|
|
||||||
EntranceConsts.KEY_PRIMARY_CATALOG_ID to subCatalog[position].id,
|
|
||||||
EntranceConsts.KEY_CATALOG_TITLE to mCatalogTitle
|
|
||||||
)
|
|
||||||
childFragmentManager.beginTransaction().replace(
|
|
||||||
R.id.container_sub_catalog,
|
|
||||||
mSubCatalogFragment!!,
|
|
||||||
SubCatalogFragment::class.java.name
|
|
||||||
).commitAllowingStateLoss()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun changeToSpecialCatalogFragment() {
|
|
||||||
mEntity?.run {
|
|
||||||
mSpecialCatalogFragment =
|
|
||||||
childFragmentManager.findFragmentByTag(SpecialCatalogFragment::class.java.name) as? SpecialCatalogFragment
|
|
||||||
?: SpecialCatalogFragment()
|
|
||||||
mSpecialCatalogFragment?.arguments = bundleOf(
|
|
||||||
EntranceConsts.KEY_IS_CATEGORY_V2 to false,
|
|
||||||
EntranceConsts.KEY_CATALOG_ID to id,
|
|
||||||
EntranceConsts.KEY_CATALOG_TITLE to mCatalogTitle,
|
|
||||||
EntranceConsts.KEY_EXPOSURE_SOURCE to arguments?.getParcelable(
|
|
||||||
EntranceConsts.KEY_EXPOSURE_SOURCE
|
|
||||||
)
|
|
||||||
)
|
|
||||||
childFragmentManager.beginTransaction().replace(
|
|
||||||
R.id.container_sub_catalog,
|
|
||||||
mSpecialCatalogFragment!!,
|
|
||||||
SpecialCatalogFragment::class.java.name
|
|
||||||
).commitAllowingStateLoss()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun changeSubCatalogInSubCatalogFragment(position: Int) {
|
|
||||||
mEntity?.run {
|
|
||||||
if (mSubCatalogFragment?.isStateSaved == false) {
|
|
||||||
mSubCatalogFragment?.arguments = bundleOf(
|
|
||||||
EntranceConsts.KEY_CATALOG_ID to id,
|
|
||||||
EntranceConsts.KEY_PRIMARY_CATALOG_ID to subCatalog[position].id,
|
|
||||||
EntranceConsts.KEY_CATALOG_TITLE to mCatalogTitle
|
|
||||||
)
|
|
||||||
}
|
|
||||||
mSubCatalogFragment?.changeSubCatalog(subCatalog[position].id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDarkModeChanged() {
|
|
||||||
super.onDarkModeChanged()
|
|
||||||
mBinding?.rvCatalog?.adapter?.run {
|
|
||||||
notifyItemRangeChanged(0, itemCount)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,72 +0,0 @@
|
|||||||
package com.gh.gamecenter.catalog
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.app.Application
|
|
||||||
import androidx.lifecycle.AndroidViewModel
|
|
||||||
import androidx.lifecycle.MutableLiveData
|
|
||||||
import androidx.lifecycle.ViewModel
|
|
||||||
import androidx.lifecycle.ViewModelProvider
|
|
||||||
import com.gh.common.util.LogUtils
|
|
||||||
import com.gh.gamecenter.entity.CatalogEntity
|
|
||||||
import com.gh.gamecenter.common.retrofit.BiResponse
|
|
||||||
import com.gh.gamecenter.retrofit.RetrofitManager
|
|
||||||
import com.halo.assistant.HaloApp
|
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
|
||||||
import io.reactivex.schedulers.Schedulers
|
|
||||||
|
|
||||||
class CatalogViewModel(application: Application, val catalogId: String, val catalogTitle: String) :
|
|
||||||
AndroidViewModel(application) {
|
|
||||||
|
|
||||||
private val api = RetrofitManager.getInstance().api
|
|
||||||
var catalogs = MutableLiveData<CatalogEntity>()
|
|
||||||
|
|
||||||
var selectedCatalogName: String = ""
|
|
||||||
var selectedCatalogPosition: Int = 0
|
|
||||||
|
|
||||||
var validEntranceName: String = ""
|
|
||||||
|
|
||||||
init {
|
|
||||||
getCatalogs()
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("CheckResult")
|
|
||||||
fun getCatalogs() {
|
|
||||||
api.getCatalogs(catalogId)
|
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
.subscribe(object : BiResponse<CatalogEntity>() {
|
|
||||||
override fun onSuccess(data: CatalogEntity) {
|
|
||||||
catalogs.postValue(data)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onFailure(exception: Exception) {
|
|
||||||
super.onFailure(exception)
|
|
||||||
catalogs.postValue(null)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fun logAppearance() {
|
|
||||||
LogUtils.logNewCatalogAppearanceEvent(validEntranceName, catalogTitle)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun logSubCatalogClick(position: Int) {
|
|
||||||
LogUtils.logSubCatalogClickEvent(validEntranceName, "${catalogTitle}_${selectedCatalogName}", position)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun logSubCatalogContentClick(itemName: String, listPosition: Int) {
|
|
||||||
LogUtils.logSubCatalogContentClickEvent(
|
|
||||||
validEntranceName,
|
|
||||||
"${catalogTitle}_${selectedCatalogName}_${itemName}",
|
|
||||||
selectedCatalogPosition,
|
|
||||||
listPosition
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
class Factory(private val catalogId: String, private val catalogTitle: String) :
|
|
||||||
ViewModelProvider.NewInstanceFactory() {
|
|
||||||
override fun <T : ViewModel> create(modelClass: Class<T>): T {
|
|
||||||
return CatalogViewModel(HaloApp.getInstance().application, catalogId, catalogTitle) as T
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,56 +0,0 @@
|
|||||||
package com.gh.gamecenter.catalog
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.Intent
|
|
||||||
import android.os.Bundle
|
|
||||||
import com.gh.base.DownloadToolbarActivity
|
|
||||||
import com.gh.gamecenter.R
|
|
||||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
|
||||||
import com.gh.gamecenter.common.utils.updateStatusBarColor
|
|
||||||
import com.gh.gamecenter.entity.CatalogEntity
|
|
||||||
|
|
||||||
class NewCatalogListActivity : DownloadToolbarActivity() {
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
setToolbarMenu(R.menu.menu_download)
|
|
||||||
updateStatusBarColor(R.color.ui_surface, R.color.ui_surface)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun showDownloadMenu(): Boolean {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDarkModeChanged() {
|
|
||||||
super.onDarkModeChanged()
|
|
||||||
updateStatusBarColor(R.color.ui_surface, R.color.ui_surface)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun isAutoResetViewBackgroundEnabled() = true
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
fun getIntent(
|
|
||||||
context: Context,
|
|
||||||
primaryCatalogId: String, // 一级分类 id
|
|
||||||
primaryCatalogName: String, // 一级分类名
|
|
||||||
catalogTitle: String,
|
|
||||||
catalog: CatalogEntity,
|
|
||||||
initTitle: String
|
|
||||||
): Intent {
|
|
||||||
val bundle = Bundle()
|
|
||||||
bundle.putParcelable(EntranceConsts.KEY_DATA, catalog)
|
|
||||||
bundle.putString(EntranceConsts.KEY_PRIMARY_CATALOG_ID, primaryCatalogId)
|
|
||||||
bundle.putString(EntranceConsts.KEY_PRIMARY_CATALOG_NAME, primaryCatalogName)
|
|
||||||
bundle.putString(EntranceConsts.KEY_NAME, catalog.name)
|
|
||||||
bundle.putString(EntranceConsts.KEY_CATALOG_TITLE, catalogTitle)
|
|
||||||
bundle.putString(EntranceConsts.KEY_CATALOG_INIT_TITLE, initTitle)
|
|
||||||
return getTargetIntent(
|
|
||||||
context,
|
|
||||||
NewCatalogListActivity::class.java,
|
|
||||||
NewCatalogListFragment::class.java,
|
|
||||||
bundle
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,192 +0,0 @@
|
|||||||
package com.gh.gamecenter.catalog
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.util.SparseArray
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
|
||||||
import com.gh.common.exposure.IExposable
|
|
||||||
import com.gh.common.util.DownloadItemUtils
|
|
||||||
import com.gh.gamecenter.GameDetailActivity
|
|
||||||
import com.gh.gamecenter.R
|
|
||||||
import com.gh.gamecenter.adapter.viewholder.GameViewHolder
|
|
||||||
import com.gh.gamecenter.common.baselist.ListAdapter
|
|
||||||
import com.gh.gamecenter.common.constant.ItemViewType
|
|
||||||
import com.gh.gamecenter.common.exposure.ExposureSource
|
|
||||||
import com.gh.gamecenter.common.utils.dip2px
|
|
||||||
import com.gh.gamecenter.common.utils.toBinding
|
|
||||||
import com.gh.gamecenter.common.viewholder.FooterViewHolder
|
|
||||||
import com.gh.gamecenter.core.utils.StringUtils
|
|
||||||
import com.gh.gamecenter.eventbus.EBDownloadStatus
|
|
||||||
import com.gh.gamecenter.feature.entity.GameEntity
|
|
||||||
import com.gh.gamecenter.feature.exposure.ExposureEvent
|
|
||||||
import com.gh.gamecenter.feature.exposure.ExposureType
|
|
||||||
import com.gh.gamecenter.feature.game.GameItemViewHolder
|
|
||||||
import com.lightgame.download.DownloadEntity
|
|
||||||
|
|
||||||
class NewCatalogListAdapter(
|
|
||||||
context: Context,
|
|
||||||
private val mBaseExposureSource: ExposureSource,
|
|
||||||
private val mViewModel: NewCatalogListViewModel,
|
|
||||||
private val mEntrance: String?
|
|
||||||
) : ListAdapter<GameEntity>(context), IExposable {
|
|
||||||
|
|
||||||
private val mExposureEventSparseArray: SparseArray<ExposureEvent> = SparseArray()
|
|
||||||
|
|
||||||
val positionAndPackageMap = HashMap<String, Int>()
|
|
||||||
|
|
||||||
override fun setListData(updateData: MutableList<GameEntity>?) {
|
|
||||||
// 记录游戏位置
|
|
||||||
if (updateData != null) {
|
|
||||||
for (i in 0 until updateData.size) {
|
|
||||||
val gameEntity = updateData[i]
|
|
||||||
var packages = gameEntity.id
|
|
||||||
for (apkEntity in gameEntity.getApk()) {
|
|
||||||
packages += apkEntity.packageName
|
|
||||||
}
|
|
||||||
positionAndPackageMap[packages + i] = i
|
|
||||||
}
|
|
||||||
}
|
|
||||||
super.setListData(updateData)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun clearPositionAndPackageMap() {
|
|
||||||
positionAndPackageMap.clear()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun areItemsTheSame(oldItem: GameEntity?, newItem: GameEntity?): Boolean {
|
|
||||||
return oldItem?.id == newItem?.id
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItemViewType(position: Int): Int {
|
|
||||||
if (position == itemCount - 1) {
|
|
||||||
return ItemViewType.ITEM_FOOTER
|
|
||||||
}
|
|
||||||
return ItemViewType.GAME_NORMAL
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
|
||||||
return when (viewType) {
|
|
||||||
ItemViewType.GAME_NORMAL -> {
|
|
||||||
GameItemViewHolder(parent.toBinding())
|
|
||||||
}
|
|
||||||
else -> {
|
|
||||||
FooterViewHolder(mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItemCount(): Int {
|
|
||||||
return if (mEntityList == null || mEntityList.isEmpty()) return 0 else mEntityList.size + 1
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
|
|
||||||
if (holder is GameItemViewHolder) {
|
|
||||||
val padTop = if (position == 0) 16F.dip2px() else 8F.dip2px()
|
|
||||||
holder.itemView.setPadding(16F.dip2px(), padTop, 16F.dip2px(), 8F.dip2px())
|
|
||||||
|
|
||||||
val gameEntity = mEntityList[position]
|
|
||||||
|
|
||||||
holder.bindGameItem(gameEntity)
|
|
||||||
holder.initServerType(gameEntity)
|
|
||||||
|
|
||||||
val sortType = mViewModel.sortType.value
|
|
||||||
val sortSize = mViewModel.sortSize.text
|
|
||||||
val toolbarTitle = mViewModel.title
|
|
||||||
val selectedCatalogName = mViewModel.selectedCatalog.name
|
|
||||||
|
|
||||||
val exposureSources = ArrayList<ExposureSource>()
|
|
||||||
exposureSources.add(mBaseExposureSource)
|
|
||||||
exposureSources.add(ExposureSource(toolbarTitle))
|
|
||||||
exposureSources.add(ExposureSource("二级分类详情", "$selectedCatalogName+$sortType+$sortSize"))
|
|
||||||
|
|
||||||
val event = ExposureEvent.createEvent(gameEntity, exposureSources, null, ExposureType.EXPOSURE)
|
|
||||||
mExposureEventSparseArray.put(position, event)
|
|
||||||
|
|
||||||
holder.itemView.setOnClickListener {
|
|
||||||
GameDetailActivity.startGameDetailActivity(
|
|
||||||
mContext,
|
|
||||||
gameEntity,
|
|
||||||
StringUtils.buildString(
|
|
||||||
mEntrance,
|
|
||||||
"+(",
|
|
||||||
toolbarTitle,
|
|
||||||
":列表[",
|
|
||||||
selectedCatalogName,
|
|
||||||
"=",
|
|
||||||
sortType,
|
|
||||||
"=",
|
|
||||||
(position + 1).toString(),
|
|
||||||
"])"
|
|
||||||
),
|
|
||||||
traceEvent = event
|
|
||||||
)
|
|
||||||
}
|
|
||||||
DownloadItemUtils.setOnClickListener(
|
|
||||||
mContext,
|
|
||||||
holder.binding.downloadBtn,
|
|
||||||
gameEntity,
|
|
||||||
position,
|
|
||||||
this,
|
|
||||||
StringUtils.buildString(
|
|
||||||
StringUtils.buildString(
|
|
||||||
mEntrance,
|
|
||||||
"+(",
|
|
||||||
toolbarTitle,
|
|
||||||
":列表[",
|
|
||||||
selectedCatalogName,
|
|
||||||
"=",
|
|
||||||
sortType,
|
|
||||||
"=",
|
|
||||||
(position + 1).toString(),
|
|
||||||
"])"
|
|
||||||
)
|
|
||||||
),
|
|
||||||
location = StringUtils.buildString(selectedCatalogName, ":", gameEntity.name),
|
|
||||||
traceEvent = event
|
|
||||||
)
|
|
||||||
|
|
||||||
DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding), "star&brief")
|
|
||||||
} else if (holder is FooterViewHolder) {
|
|
||||||
holder.initItemPadding()
|
|
||||||
holder.initFooterViewHolder(mViewModel, mIsLoading, mIsNetworkError, mIsOver)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun notifyItemByDownload(download: DownloadEntity) {
|
|
||||||
for (key in positionAndPackageMap.keys) {
|
|
||||||
// sentry上报download.packageName可能为空
|
|
||||||
if (download.packageName != null
|
|
||||||
&& download.gameId != null
|
|
||||||
&& key.contains(download.packageName)
|
|
||||||
&& key.contains(download.gameId)
|
|
||||||
) {
|
|
||||||
val position = positionAndPackageMap[key]
|
|
||||||
if (position != null && mEntityList != null && position < mEntityList.size) {
|
|
||||||
mEntityList[position].getEntryMap()[download.platform] = download
|
|
||||||
notifyItemChanged(position)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun notifyItemAndRemoveDownload(status: EBDownloadStatus) {
|
|
||||||
for (key in positionAndPackageMap.keys) {
|
|
||||||
if (key.contains(status.packageName) && key.contains(status.gameId)) {
|
|
||||||
val position = positionAndPackageMap[key]
|
|
||||||
if (position != null && mEntityList != null && position < mEntityList.size) {
|
|
||||||
mEntityList[position].getEntryMap().remove(status.platform)
|
|
||||||
notifyItemChanged(position)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getEventByPosition(pos: Int): ExposureEvent? {
|
|
||||||
return mExposureEventSparseArray.get(pos)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getEventListByPosition(pos: Int): List<ExposureEvent>? {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,209 +0,0 @@
|
|||||||
package com.gh.gamecenter.catalog
|
|
||||||
|
|
||||||
import android.os.Bundle
|
|
||||||
import android.view.View
|
|
||||||
import com.ethanhua.skeleton.Skeleton
|
|
||||||
import com.gh.common.exposure.ExposureListener
|
|
||||||
import com.gh.common.util.DialogUtils
|
|
||||||
import com.gh.common.view.CatalogFilterView
|
|
||||||
import com.gh.common.xapk.XapkInstaller
|
|
||||||
import com.gh.common.xapk.XapkUnzipStatus
|
|
||||||
import com.gh.download.DownloadManager
|
|
||||||
import com.gh.gamecenter.R
|
|
||||||
import com.gh.gamecenter.common.constant.Constants
|
|
||||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
|
||||||
import com.gh.gamecenter.common.utils.observeNonNull
|
|
||||||
import com.gh.gamecenter.common.baselist.ListFragment
|
|
||||||
import com.gh.gamecenter.common.exposure.ExposureSource
|
|
||||||
import com.gh.gamecenter.common.utils.toColor
|
|
||||||
import com.gh.gamecenter.common.utils.viewModelProvider
|
|
||||||
import com.gh.gamecenter.databinding.FragmentCatalogListBinding
|
|
||||||
import com.gh.gamecenter.entity.CatalogEntity
|
|
||||||
import com.gh.gamecenter.feature.entity.GameEntity
|
|
||||||
import com.gh.gamecenter.entity.SubjectSettingEntity
|
|
||||||
import com.gh.gamecenter.eventbus.EBDownloadStatus
|
|
||||||
import com.gh.gamecenter.eventbus.EBPackage
|
|
||||||
import com.lightgame.download.DataWatcher
|
|
||||||
import com.lightgame.download.DownloadEntity
|
|
||||||
import org.greenrobot.eventbus.Subscribe
|
|
||||||
import org.greenrobot.eventbus.ThreadMode
|
|
||||||
|
|
||||||
class NewCatalogListFragment : ListFragment<GameEntity, NewCatalogListViewModel>() {
|
|
||||||
|
|
||||||
private var mPrimaryCatalogName: String = "" // 一级分类名
|
|
||||||
private var mPrimaryCatalogId: String = "" // 一级分类 id
|
|
||||||
private var mPrimeCatalog: CatalogEntity? = null
|
|
||||||
private var mSubCatalogList = arrayListOf<CatalogEntity.SubCatalogEntity>()
|
|
||||||
private var mInitCatalogName = ""
|
|
||||||
private var mAdapter: NewCatalogListAdapter? = null
|
|
||||||
private val mDataWatcher = object : DataWatcher() {
|
|
||||||
override fun onDataChanged(downloadEntity: DownloadEntity) {
|
|
||||||
mAdapter?.notifyItemByDownload(downloadEntity)
|
|
||||||
|
|
||||||
if (downloadEntity.meta[XapkInstaller.XAPK_UNZIP_STATUS] == XapkUnzipStatus.FAILURE.name) {
|
|
||||||
showUnzipFailureDialog(downloadEntity)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDataInit(downloadEntity: DownloadEntity) {
|
|
||||||
mAdapter?.notifyItemByDownload(downloadEntity)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private var mBinding: FragmentCatalogListBinding? = null
|
|
||||||
private lateinit var mExposureListener: ExposureListener
|
|
||||||
private lateinit var mViewModel: NewCatalogListViewModel
|
|
||||||
|
|
||||||
override fun getLayoutId() = 0
|
|
||||||
|
|
||||||
override fun getInflatedLayout() = FragmentCatalogListBinding.inflate(layoutInflater).apply { mBinding = this }.root
|
|
||||||
|
|
||||||
override fun provideListViewModel() = viewModelProvider<NewCatalogListViewModel>()
|
|
||||||
|
|
||||||
override fun provideListAdapter() = mAdapter
|
|
||||||
?: NewCatalogListAdapter(
|
|
||||||
requireContext(),
|
|
||||||
ExposureSource(mPrimaryCatalogName),
|
|
||||||
mViewModel,
|
|
||||||
mEntrance
|
|
||||||
).apply { mAdapter = this }
|
|
||||||
|
|
||||||
override fun getItemDecoration() = null
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
mViewModel = provideListViewModel()
|
|
||||||
|
|
||||||
mViewModel.title = arguments?.getString(EntranceConsts.KEY_NAME) ?: ""
|
|
||||||
mViewModel.categoryTitle = arguments?.getString(EntranceConsts.KEY_CATALOG_TITLE) ?: ""
|
|
||||||
mEntrance = arguments?.getString(EntranceConsts.KEY_ENTRANCE) ?: Constants.ENTRANCE_UNKNOWN
|
|
||||||
mPrimeCatalog = arguments?.getParcelable(EntranceConsts.KEY_DATA)
|
|
||||||
mSubCatalogList = mPrimeCatalog?.subCatalog as? ArrayList<CatalogEntity.SubCatalogEntity> ?: arrayListOf()
|
|
||||||
|
|
||||||
mInitCatalogName = arguments?.getString(EntranceConsts.KEY_CATALOG_INIT_TITLE) ?: ""
|
|
||||||
mPrimaryCatalogName = arguments?.getString(EntranceConsts.KEY_PRIMARY_CATALOG_NAME) ?: ""
|
|
||||||
mPrimaryCatalogId = arguments?.getString(EntranceConsts.KEY_PRIMARY_CATALOG_ID) ?: ""
|
|
||||||
|
|
||||||
mViewModel.selectedCatalog = mSubCatalogList.find { entity -> entity.name == mInitCatalogName }
|
|
||||||
?: CatalogEntity.SubCatalogEntity()
|
|
||||||
mViewModel.primaryCatalogId = mPrimaryCatalogId
|
|
||||||
initSortType()
|
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
||||||
super.onViewCreated(view, savedInstanceState)
|
|
||||||
|
|
||||||
setNavigationTitle(mViewModel.title)
|
|
||||||
|
|
||||||
initFilterView()
|
|
||||||
|
|
||||||
mViewModel.refresh.observeNonNull(this) { onRefresh() }
|
|
||||||
|
|
||||||
mExposureListener = ExposureListener(this, mAdapter!!)
|
|
||||||
mListRv.addOnScrollListener(mExposureListener)
|
|
||||||
|
|
||||||
mSkeletonScreen = Skeleton.bind(mBinding?.listSkeleton)
|
|
||||||
.shimmer(true)
|
|
||||||
.angle(Constants.SHIMMER_ANGLE)
|
|
||||||
.color(R.color.ui_skeleton_highlight)
|
|
||||||
.duration(Constants.SHIMMER_DURATION)
|
|
||||||
.maskWidth(Constants.MASK_WIDTH)
|
|
||||||
.gradientCenterColorWidth(Constants.GRADIENT_CENTER_COLOR_WIDTH)
|
|
||||||
.load(R.layout.fragment_tags_skeleton)
|
|
||||||
.show()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun initSortType() {
|
|
||||||
mPrimeCatalog?.switch?.run {
|
|
||||||
if (hotSort == "on") {
|
|
||||||
mViewModel.sortType = CatalogFilterView.SortType.RECOMMENDED
|
|
||||||
return@run
|
|
||||||
}
|
|
||||||
if (newSort == "on") {
|
|
||||||
mViewModel.sortType = CatalogFilterView.SortType.NEWEST
|
|
||||||
return@run
|
|
||||||
}
|
|
||||||
if (starSort == "on") {
|
|
||||||
mViewModel.sortType = CatalogFilterView.SortType.RATING
|
|
||||||
return@run
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun initFilterView() {
|
|
||||||
mBinding?.filterContainer?.run {
|
|
||||||
visibility = View.VISIBLE
|
|
||||||
setTypeList(mPrimeCatalog?.switch ?: CatalogEntity.CatalogSwitch())
|
|
||||||
setCatalogList(mSubCatalogList, mInitCatalogName)
|
|
||||||
setOnConfigSetupListener(object : CatalogFilterView.OnCatalogFilterSetupListener {
|
|
||||||
override fun onSetupSortSize(sortSize: SubjectSettingEntity.Size) {
|
|
||||||
mViewModel.updateSortConfig(sortSize = sortSize)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onSetupSortType(sortType: CatalogFilterView.SortType) {
|
|
||||||
mViewModel.updateSortConfig(sortType = sortType)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onSetupSortCatalog(sortCatalog: CatalogEntity.SubCatalogEntity) {
|
|
||||||
mViewModel.updateSortConfig(sortCatalog = sortCatalog)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onResume() {
|
|
||||||
super.onResume()
|
|
||||||
DownloadManager.getInstance().addObserver(mDataWatcher)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onPause() {
|
|
||||||
super.onPause()
|
|
||||||
DownloadManager.getInstance().removeObserver(mDataWatcher)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onRefresh() {
|
|
||||||
mAdapter?.clearPositionAndPackageMap()
|
|
||||||
|
|
||||||
super.onRefresh()
|
|
||||||
}
|
|
||||||
|
|
||||||
// 下载被删除事件
|
|
||||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
|
||||||
fun onEventMainThread(status: EBDownloadStatus) {
|
|
||||||
if ("delete" == status.status) {
|
|
||||||
mAdapter?.notifyItemAndRemoveDownload(status)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 安装/卸载 事件
|
|
||||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
|
||||||
fun onEventMainThread(busFour: EBPackage) {
|
|
||||||
if (busFour.isInstalledOrUninstalled()) {
|
|
||||||
mAdapter?.notifyDataSetChanged()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun showUnzipFailureDialog(downloadEntity: DownloadEntity) {
|
|
||||||
val data = mAdapter?.positionAndPackageMap ?: return
|
|
||||||
for (gameAndPosition in data) {
|
|
||||||
if (gameAndPosition.key.contains(downloadEntity.packageName)) {
|
|
||||||
val targetView = mLayoutManager.findViewByPosition(gameAndPosition.value)
|
|
||||||
if (targetView != null) {
|
|
||||||
DialogUtils.showUnzipFailureDialog(requireContext(), downloadEntity)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDarkModeChanged() {
|
|
||||||
super.onDarkModeChanged()
|
|
||||||
mBinding?.filterContainer?.run {
|
|
||||||
setRootBackgroundColor(R.color.ui_surface.toColor(requireContext()))
|
|
||||||
setItemTextColor(R.color.text_secondary.toColor(requireContext()))
|
|
||||||
updatePopupWindow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,98 +0,0 @@
|
|||||||
package com.gh.gamecenter.catalog
|
|
||||||
|
|
||||||
import android.app.Application
|
|
||||||
import androidx.lifecycle.MutableLiveData
|
|
||||||
import com.gh.gamecenter.common.entity.ExposureEntity
|
|
||||||
import com.gh.common.exposure.ExposureUtils
|
|
||||||
import com.gh.gamecenter.core.utils.UrlFilterUtils
|
|
||||||
import com.gh.common.view.CatalogFilterView
|
|
||||||
import com.gh.gamecenter.common.baselist.ListViewModel
|
|
||||||
import com.gh.gamecenter.entity.CatalogEntity
|
|
||||||
import com.gh.gamecenter.feature.entity.GameEntity
|
|
||||||
import com.gh.gamecenter.entity.SubjectSettingEntity
|
|
||||||
import com.gh.gamecenter.retrofit.RetrofitManager
|
|
||||||
import io.reactivex.Observable
|
|
||||||
import io.reactivex.Single
|
|
||||||
|
|
||||||
class NewCatalogListViewModel(application: Application) : ListViewModel<GameEntity, GameEntity>(application) {
|
|
||||||
|
|
||||||
var title = "" // 显示在 Toolbar 的标题
|
|
||||||
var categoryTitle = "" // 跳转进来的分类的标题
|
|
||||||
|
|
||||||
val refresh = MutableLiveData<Boolean>()
|
|
||||||
|
|
||||||
var selectedCatalog = CatalogEntity.SubCatalogEntity()
|
|
||||||
var sortType = CatalogFilterView.SortType.RECOMMENDED
|
|
||||||
var sortSize = SubjectSettingEntity.Size()
|
|
||||||
|
|
||||||
var primaryCatalogId = "" // 一级分类 id
|
|
||||||
private val sensitiveApi = RetrofitManager.getInstance().api
|
|
||||||
|
|
||||||
override fun provideDataObservable(page: Int): Observable<List<GameEntity>>? = null
|
|
||||||
|
|
||||||
override fun provideDataSingle(page: Int): Single<List<GameEntity>> {
|
|
||||||
return if (selectedCatalog.link.type == "column") { // column(专题)/tag(标签)
|
|
||||||
sensitiveApi.getColumn(selectedCatalog.link.link, getSortType(), getSortSize(), page) // 专题
|
|
||||||
} else {
|
|
||||||
sensitiveApi.getGamesWithSpecificTag(getSortSize(), getSortType(), page) // 标签
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun mergeResultLiveData() {
|
|
||||||
mResultLiveData.addSource(mListLiveData) {
|
|
||||||
it.forEach { game -> game.hideSizeInsideDes = true }
|
|
||||||
ExposureUtils.updateExposureInfo(
|
|
||||||
gameList = it,
|
|
||||||
containerId = primaryCatalogId,
|
|
||||||
containerType = ExposureEntity.CATEGORY_ID
|
|
||||||
)
|
|
||||||
mResultLiveData.postValue(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun updateSortConfig(
|
|
||||||
sortSize: SubjectSettingEntity.Size? = null,
|
|
||||||
sortType: CatalogFilterView.SortType? = null,
|
|
||||||
sortCatalog: CatalogEntity.SubCatalogEntity? = null
|
|
||||||
) {
|
|
||||||
when {
|
|
||||||
sortSize != null && sortSize != this.sortSize -> {
|
|
||||||
this.sortSize = sortSize
|
|
||||||
refresh.postValue(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
sortType != null && sortType != this.sortType -> {
|
|
||||||
this.sortType = sortType
|
|
||||||
refresh.postValue(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
sortCatalog != null && sortCatalog != selectedCatalog -> {
|
|
||||||
selectedCatalog = sortCatalog
|
|
||||||
refresh.postValue(true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getSortSize(): String? {
|
|
||||||
return if (selectedCatalog.link.type == "column") {
|
|
||||||
UrlFilterUtils.getFilterQuery(
|
|
||||||
"min_size", sortSize.min.toString(),
|
|
||||||
"max_size", sortSize.max.toString()
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
UrlFilterUtils.getFilterQuery(
|
|
||||||
"tag_id", selectedCatalog.link.link,
|
|
||||||
"min_size", sortSize.min.toString(),
|
|
||||||
"max_size", sortSize.max.toString()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getSortType(): String? {
|
|
||||||
return when (sortType) {
|
|
||||||
CatalogFilterView.SortType.RECOMMENDED -> if (selectedCatalog.link.type == "column") "position:1" else "download:-1"
|
|
||||||
CatalogFilterView.SortType.NEWEST -> "publish:-1"
|
|
||||||
CatalogFilterView.SortType.RATING -> "star:-1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,54 +0,0 @@
|
|||||||
package com.gh.gamecenter.catalog
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import com.gh.gamecenter.R
|
|
||||||
import com.gh.gamecenter.common.base.BaseRecyclerViewHolder
|
|
||||||
import com.gh.gamecenter.common.utils.*
|
|
||||||
import com.gh.gamecenter.databinding.SubCatalogItemBinding
|
|
||||||
import com.gh.gamecenter.entity.CatalogEntity
|
|
||||||
import com.lightgame.adapter.BaseRecyclerAdapter
|
|
||||||
|
|
||||||
class SubCatalogAdapter(
|
|
||||||
context: Context,
|
|
||||||
private val mCatalogViewModel: CatalogViewModel,
|
|
||||||
private val mPrimaryCatalog: CatalogEntity,
|
|
||||||
private var mList: List<CatalogEntity.SubCatalogEntity>
|
|
||||||
) : BaseRecyclerAdapter<SubCatalogAdapter.SubCatalogItemViewHolder>(context) {
|
|
||||||
|
|
||||||
private val mTypes = listOf("专题", "标签")
|
|
||||||
|
|
||||||
override fun getItemCount() = mList.size
|
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
|
|
||||||
SubCatalogItemViewHolder(parent.toBinding())
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: SubCatalogItemViewHolder, position: Int) {
|
|
||||||
holder.binding.run {
|
|
||||||
val catalogEntity = mList[position]
|
|
||||||
ImageUtils.display(catalogIcon, catalogEntity.icon)
|
|
||||||
catalogName.text = catalogEntity.name
|
|
||||||
catalogName.setTextColor(R.color.text_primary.toColor(mContext))
|
|
||||||
recommendTag.goneIf(!catalogEntity.recommended)
|
|
||||||
root.setOnClickListener {
|
|
||||||
mCatalogViewModel.logSubCatalogContentClick(catalogEntity.name, position)
|
|
||||||
if (mTypes.contains(catalogEntity.type)) {
|
|
||||||
root.context.startActivity(
|
|
||||||
NewCatalogListActivity.getIntent(
|
|
||||||
mContext,
|
|
||||||
mCatalogViewModel.catalogId,
|
|
||||||
mCatalogViewModel.catalogTitle,
|
|
||||||
catalogEntity.name,
|
|
||||||
mPrimaryCatalog,
|
|
||||||
catalogEntity.name
|
|
||||||
)
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
DialogHelper.showUpgradeDialog(mContext)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class SubCatalogItemViewHolder(val binding: SubCatalogItemBinding) : BaseRecyclerViewHolder<Any>(binding.root)
|
|
||||||
}
|
|
||||||
@ -1,94 +0,0 @@
|
|||||||
package com.gh.gamecenter.catalog
|
|
||||||
|
|
||||||
import android.os.Bundle
|
|
||||||
import android.view.View
|
|
||||||
import androidx.lifecycle.Observer
|
|
||||||
import androidx.recyclerview.widget.GridLayoutManager
|
|
||||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
|
||||||
import com.gh.gamecenter.common.utils.viewModelProvider
|
|
||||||
import com.gh.gamecenter.common.utils.viewModelProviderFromParent
|
|
||||||
import com.gh.gamecenter.databinding.FragmentSubCatalogBinding
|
|
||||||
import com.gh.gamecenter.entity.CatalogEntity
|
|
||||||
import com.gh.gamecenter.common.base.fragment.ToolbarFragment
|
|
||||||
|
|
||||||
class SubCatalogFragment : ToolbarFragment() {
|
|
||||||
|
|
||||||
private var mBinding: FragmentSubCatalogBinding? = null
|
|
||||||
private var mViewModel: SubCatalogViewModel? = null
|
|
||||||
private var mCatalogViewModel: CatalogViewModel? = null
|
|
||||||
private var mEntity: CatalogEntity? = null
|
|
||||||
private var mCatalogId: String = ""
|
|
||||||
private var mCatalogTitle: String = ""
|
|
||||||
private var mPrimaryCatalogId: String = ""
|
|
||||||
|
|
||||||
override fun getLayoutId() = 0
|
|
||||||
|
|
||||||
override fun getInflatedLayout() = FragmentSubCatalogBinding.inflate(layoutInflater).apply { mBinding = this }.root
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
|
|
||||||
mCatalogId = arguments?.getString(EntranceConsts.KEY_CATALOG_ID) ?: ""
|
|
||||||
mCatalogTitle = arguments?.getString(EntranceConsts.KEY_CATALOG_TITLE) ?: ""
|
|
||||||
mPrimaryCatalogId = arguments?.getString(EntranceConsts.KEY_PRIMARY_CATALOG_ID) ?: ""
|
|
||||||
mViewModel = viewModelProvider(SubCatalogViewModel.Factory(mCatalogId))
|
|
||||||
mCatalogViewModel = viewModelProviderFromParent(CatalogViewModel.Factory(mCatalogId, mCatalogTitle), mCatalogId)
|
|
||||||
mViewModel?.getSubCatalogs(mPrimaryCatalogId)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
||||||
super.onViewCreated(view, savedInstanceState)
|
|
||||||
|
|
||||||
mViewModel?.catalogs?.observe(viewLifecycleOwner, Observer {
|
|
||||||
mBinding?.run {
|
|
||||||
reuseLoading.root.visibility = View.GONE
|
|
||||||
if (it != null) {
|
|
||||||
reuseNoConnection.root.visibility = View.GONE
|
|
||||||
if (it.subCatalog.isNotEmpty()) {
|
|
||||||
rvSubCatalog.visibility = View.VISIBLE
|
|
||||||
reuseNoneData.root.visibility = View.GONE
|
|
||||||
mEntity = it
|
|
||||||
initView()
|
|
||||||
} else {
|
|
||||||
rvSubCatalog.visibility = View.GONE
|
|
||||||
reuseNoneData.root.visibility = View.VISIBLE
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
rvSubCatalog.visibility = View.GONE
|
|
||||||
reuseNoneData.root.visibility = View.GONE
|
|
||||||
reuseNoConnection.root.visibility = View.VISIBLE
|
|
||||||
reuseNoConnection.root.setOnClickListener {
|
|
||||||
reuseLoading.root.visibility = View.VISIBLE
|
|
||||||
mViewModel?.getSubCatalogs(mPrimaryCatalogId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun initView() {
|
|
||||||
mEntity?.takeIf { mCatalogViewModel != null }?.run {
|
|
||||||
mBinding?.rvSubCatalog?.layoutManager = GridLayoutManager(requireContext(), 3)
|
|
||||||
mBinding?.rvSubCatalog?.adapter = SubCatalogAdapter(requireContext(), mCatalogViewModel!!, this, subCatalog)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun changeSubCatalog(primaryCatalogId: String) {
|
|
||||||
mBinding?.run {
|
|
||||||
mPrimaryCatalogId = primaryCatalogId
|
|
||||||
rvSubCatalog.visibility = View.GONE
|
|
||||||
reuseNoneData.root.visibility = View.GONE
|
|
||||||
reuseNoConnection.root.visibility = View.GONE
|
|
||||||
reuseLoading.root.visibility = View.VISIBLE
|
|
||||||
mViewModel?.getSubCatalogs(mPrimaryCatalogId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDarkModeChanged() {
|
|
||||||
super.onDarkModeChanged()
|
|
||||||
mBinding?.rvSubCatalog?.adapter?.run {
|
|
||||||
mBinding?.rvSubCatalog?.recycledViewPool?.clear()
|
|
||||||
notifyItemRangeChanged(0, itemCount)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
package com.gh.gamecenter.catalog
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.app.Application
|
|
||||||
import androidx.lifecycle.AndroidViewModel
|
|
||||||
import androidx.lifecycle.MutableLiveData
|
|
||||||
import androidx.lifecycle.ViewModel
|
|
||||||
import androidx.lifecycle.ViewModelProvider
|
|
||||||
import com.gh.gamecenter.entity.CatalogEntity
|
|
||||||
import com.gh.gamecenter.common.retrofit.BiResponse
|
|
||||||
import com.gh.gamecenter.retrofit.RetrofitManager
|
|
||||||
import com.halo.assistant.HaloApp
|
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
|
||||||
import io.reactivex.schedulers.Schedulers
|
|
||||||
|
|
||||||
class SubCatalogViewModel(application: Application, private val catalogId: String) : AndroidViewModel(application) {
|
|
||||||
|
|
||||||
private val api = RetrofitManager.getInstance().api
|
|
||||||
var catalogs = MutableLiveData<CatalogEntity>()
|
|
||||||
|
|
||||||
|
|
||||||
@SuppressLint("CheckResult")
|
|
||||||
fun getSubCatalogs(primaryCatalogId: String) {
|
|
||||||
api.getSubCatalogs(catalogId, primaryCatalogId)
|
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
.subscribe(object : BiResponse<CatalogEntity>() {
|
|
||||||
override fun onSuccess(data: CatalogEntity) {
|
|
||||||
catalogs.postValue(data)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onFailure(exception: Exception) {
|
|
||||||
super.onFailure(exception)
|
|
||||||
catalogs.postValue(null)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
class Factory(private val catalogId: String) : ViewModelProvider.NewInstanceFactory() {
|
|
||||||
override fun <T : ViewModel> create(modelClass: Class<T>): T {
|
|
||||||
return SubCatalogViewModel(HaloApp.getInstance().application, catalogId) as T
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,51 +0,0 @@
|
|||||||
package com.gh.gamecenter.category
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.Intent
|
|
||||||
import android.os.Bundle
|
|
||||||
import com.gh.base.DownloadToolbarActivity
|
|
||||||
import com.gh.gamecenter.R
|
|
||||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
|
||||||
import com.gh.gamecenter.common.utils.updateStatusBarColor
|
|
||||||
|
|
||||||
class CategoryDirectoryActivity : DownloadToolbarActivity() {
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
fun getIntent(context: Context, categoryId: String, categoryTitle: String): Intent {
|
|
||||||
val bundle = Bundle()
|
|
||||||
bundle.putString(EntranceConsts.KEY_CATEGORY_ID, categoryId)
|
|
||||||
bundle.putString(EntranceConsts.KEY_CATEGORY_TITLE, categoryTitle)
|
|
||||||
return getTargetIntent(
|
|
||||||
context,
|
|
||||||
CategoryDirectoryActivity::class.java,
|
|
||||||
CategoryDirectoryFragment::class.java,
|
|
||||||
bundle
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
setToolbarMenu(R.menu.menu_download)
|
|
||||||
updateStatusBarColor(R.color.ui_surface, R.color.ui_surface)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun showDownloadMenu(): Boolean {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getActivityNameInChinese(): String {
|
|
||||||
return "游戏分类"
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun provideNormalIntent(): Intent {
|
|
||||||
return getTargetIntent(this, CategoryDirectoryActivity::class.java, CategoryDirectoryFragment::class.java)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun isAutoResetViewBackgroundEnabled() = true
|
|
||||||
|
|
||||||
override fun onDarkModeChanged() {
|
|
||||||
super.onDarkModeChanged()
|
|
||||||
updateStatusBarColor(R.color.ui_surface, R.color.ui_surface)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,157 +0,0 @@
|
|||||||
package com.gh.gamecenter.category
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import android.widget.LinearLayout
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
|
||||||
import com.gh.common.view.SubCategoryView
|
|
||||||
import com.gh.gamecenter.R
|
|
||||||
import com.gh.gamecenter.common.baselist.ListAdapter
|
|
||||||
import com.gh.gamecenter.category.CategoryListActivity.Companion.getIntent
|
|
||||||
import com.gh.gamecenter.common.utils.ImageUtils
|
|
||||||
import com.gh.gamecenter.common.utils.toBinding
|
|
||||||
import com.gh.gamecenter.common.utils.toColor
|
|
||||||
import com.gh.gamecenter.core.utils.DisplayUtils
|
|
||||||
import com.gh.gamecenter.databinding.ItemCategoryBinding
|
|
||||||
import com.gh.gamecenter.entity.CategoryEntity
|
|
||||||
import net.cachapa.expandablelayout.ExpandableLayout
|
|
||||||
|
|
||||||
class CategoryDirectoryAdapter(context: Context, var categoryTitle: String) : ListAdapter<CategoryEntity>(context) {
|
|
||||||
|
|
||||||
var recyclerView: RecyclerView? = null
|
|
||||||
var expandStatusMap: HashMap<Int, Boolean> = HashMap()
|
|
||||||
|
|
||||||
private var sixteenDp: Int = 0
|
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
|
||||||
if (sixteenDp == 0) sixteenDp = DisplayUtils.dip2px(parent.context, 16f)
|
|
||||||
return CategoryViewHolder(parent.toBinding())
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItemCount(): Int {
|
|
||||||
return mEntityList.size
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
|
|
||||||
when (holder) {
|
|
||||||
is CategoryViewHolder -> {
|
|
||||||
val category = mEntityList[position]
|
|
||||||
holder.binding.run {
|
|
||||||
divider.setBackgroundColor(R.color.ui_background.toColor(mContext))
|
|
||||||
containerPrimaryCategory.setOnClickListener {
|
|
||||||
root.context.startActivity(getIntent(root.context, categoryTitle, category, "全部"))
|
|
||||||
}
|
|
||||||
ImageUtils.display(iconIv, category.icon)
|
|
||||||
categoryName.text = category.name
|
|
||||||
}
|
|
||||||
holder.bindCategory(
|
|
||||||
category = mEntityList[position],
|
|
||||||
expandableStatusMap = expandStatusMap,
|
|
||||||
isExpended = expandStatusMap[position] != null && expandStatusMap[position] == true,
|
|
||||||
marginTop = sixteenDp,
|
|
||||||
categoryTitle = categoryTitle,
|
|
||||||
expandedAction = { recyclerView?.smoothScrollToPosition(position) })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class CategoryViewHolder(var binding: ItemCategoryBinding) : RecyclerView.ViewHolder(binding.root) {
|
|
||||||
fun bindCategory(
|
|
||||||
category: CategoryEntity,
|
|
||||||
expandableStatusMap: HashMap<Int, Boolean>,
|
|
||||||
isExpended: Boolean,
|
|
||||||
marginTop: Int,
|
|
||||||
categoryTitle: String,
|
|
||||||
expandedAction: () -> Unit
|
|
||||||
) {
|
|
||||||
category.data?.let {
|
|
||||||
var subCategoryView: SubCategoryView? = null
|
|
||||||
|
|
||||||
binding.containerUnexpandable.removeAllViews()
|
|
||||||
val unexpandableSize = if (it.size > 6) 6 else it.size
|
|
||||||
val unexpandableCategoryList = it.subList(0, unexpandableSize)
|
|
||||||
unexpandableCategoryList.forEachIndexed { index, c ->
|
|
||||||
when (index % 3) {
|
|
||||||
0 -> {
|
|
||||||
val params = LinearLayout.LayoutParams(
|
|
||||||
LinearLayout.LayoutParams.MATCH_PARENT,
|
|
||||||
LinearLayout.LayoutParams.MATCH_PARENT
|
|
||||||
)
|
|
||||||
if (subCategoryView != null) params.setMargins(0, marginTop, 0, 0)
|
|
||||||
|
|
||||||
subCategoryView = SubCategoryView(binding.root.context)
|
|
||||||
|
|
||||||
subCategoryView?.categoryTitle = categoryTitle
|
|
||||||
subCategoryView?.primeCategory = category
|
|
||||||
subCategoryView?.layoutParams = params
|
|
||||||
|
|
||||||
binding.containerUnexpandable.addView(subCategoryView)
|
|
||||||
subCategoryView?.setLeftCategory(c)
|
|
||||||
}
|
|
||||||
1 -> subCategoryView?.setCenterCategory(c)
|
|
||||||
2 -> subCategoryView?.setRightCategory(c)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (it.size >= 7) {
|
|
||||||
val extraCategoryList = it.subList(6, it.size)
|
|
||||||
|
|
||||||
binding.ivToggle.visibility = View.VISIBLE
|
|
||||||
binding.ivToggle.setOnClickListener { binding.containerExpandable.toggle() }
|
|
||||||
when {
|
|
||||||
isExpended -> binding.ivToggle.setImageResource(R.drawable.ic_category_arrow_up)
|
|
||||||
else -> binding.ivToggle.setImageResource(R.drawable.ic_category_arrow_down)
|
|
||||||
}
|
|
||||||
|
|
||||||
val subCategoryViewLinearLayout = LinearLayout(binding.root.context)
|
|
||||||
subCategoryViewLinearLayout.orientation = LinearLayout.VERTICAL
|
|
||||||
subCategoryView = SubCategoryView(binding.root.context)
|
|
||||||
|
|
||||||
binding.containerExpandable.removeAllViews()
|
|
||||||
binding.containerExpandable.addView(subCategoryViewLinearLayout)
|
|
||||||
binding.containerExpandable.setExpanded(isExpended, false)
|
|
||||||
binding.containerExpandable.setOnExpansionUpdateListener { _, state ->
|
|
||||||
when (state) {
|
|
||||||
ExpandableLayout.State.COLLAPSED -> {
|
|
||||||
binding.ivToggle.setImageResource(R.drawable.ic_category_arrow_down)
|
|
||||||
expandableStatusMap[adapterPosition] = false
|
|
||||||
}
|
|
||||||
ExpandableLayout.State.EXPANDED -> {
|
|
||||||
binding.ivToggle.setImageResource(R.drawable.ic_category_arrow_up)
|
|
||||||
expandableStatusMap[adapterPosition] = true
|
|
||||||
expandedAction.invoke()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extraCategoryList.forEachIndexed { index, c ->
|
|
||||||
when (index % 3) {
|
|
||||||
0 -> {
|
|
||||||
subCategoryView = SubCategoryView(binding.root.context)
|
|
||||||
|
|
||||||
val params = LinearLayout.LayoutParams(
|
|
||||||
LinearLayout.LayoutParams.MATCH_PARENT,
|
|
||||||
LinearLayout.LayoutParams.MATCH_PARENT
|
|
||||||
)
|
|
||||||
params.setMargins(0, marginTop, 0, 0)
|
|
||||||
|
|
||||||
subCategoryView?.categoryTitle = categoryTitle
|
|
||||||
subCategoryView?.primeCategory = category
|
|
||||||
subCategoryView?.layoutParams = params
|
|
||||||
|
|
||||||
subCategoryViewLinearLayout.addView(subCategoryView)
|
|
||||||
subCategoryView?.setLeftCategory(c)
|
|
||||||
}
|
|
||||||
1 -> subCategoryView?.setCenterCategory(c)
|
|
||||||
2 -> subCategoryView?.setRightCategory(c)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
binding.ivToggle.visibility = View.GONE
|
|
||||||
binding.containerExpandable.removeAllViews()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,104 +0,0 @@
|
|||||||
package com.gh.gamecenter.category
|
|
||||||
|
|
||||||
import android.graphics.Color
|
|
||||||
import android.view.View
|
|
||||||
import androidx.lifecycle.ViewModelProviders
|
|
||||||
import com.ethanhua.skeleton.Skeleton
|
|
||||||
import com.gh.gamecenter.common.constant.Constants
|
|
||||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
|
||||||
import com.gh.gamecenter.common.utils.toColor
|
|
||||||
import com.gh.gamecenter.common.view.VerticalItemDecoration
|
|
||||||
import com.gh.gamecenter.R
|
|
||||||
import com.gh.gamecenter.common.baselist.LazyListFragment
|
|
||||||
import com.gh.gamecenter.databinding.FragmentListBaseSkeletonBinding
|
|
||||||
import com.gh.gamecenter.entity.CategoryEntity
|
|
||||||
|
|
||||||
class CategoryDirectoryFragment : LazyListFragment<CategoryEntity, CategoryDirectoryListViewModel>() {
|
|
||||||
|
|
||||||
private lateinit var mViewModel: CategoryDirectoryListViewModel
|
|
||||||
private lateinit var mAdapter: CategoryDirectoryAdapter
|
|
||||||
private var mBinding: FragmentListBaseSkeletonBinding? = null
|
|
||||||
|
|
||||||
override fun getRealLayoutId() = R.layout.fragment_list_base_skeleton
|
|
||||||
|
|
||||||
override fun onRealLayoutInflated(inflatedView: View) {
|
|
||||||
super.onRealLayoutInflated(inflatedView)
|
|
||||||
mBinding = FragmentListBaseSkeletonBinding.bind(inflatedView)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onFragmentFirstVisible() {
|
|
||||||
mViewModel = ViewModelProviders.of(this).get(CategoryDirectoryListViewModel::class.java)
|
|
||||||
mViewModel.categoryId = arguments?.getString(EntranceConsts.KEY_CATEGORY_ID) ?: ""
|
|
||||||
mAdapter =
|
|
||||||
CategoryDirectoryAdapter(requireContext(), arguments?.getString(EntranceConsts.KEY_CATEGORY_TITLE) ?: "")
|
|
||||||
super.onFragmentFirstVisible()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun initRealView() {
|
|
||||||
super.initRealView()
|
|
||||||
|
|
||||||
setNavigationTitle(arguments?.getString(EntranceConsts.KEY_CATEGORY_TITLE))
|
|
||||||
|
|
||||||
mSkeletonScreen = Skeleton.bind(mBinding?.listSkeleton)
|
|
||||||
.shimmer(true)
|
|
||||||
.angle(Constants.SHIMMER_ANGLE)
|
|
||||||
.color(R.color.ui_skeleton_highlight)
|
|
||||||
.duration(Constants.SHIMMER_DURATION)
|
|
||||||
.maskWidth(Constants.MASK_WIDTH)
|
|
||||||
.gradientCenterColorWidth(Constants.GRADIENT_CENTER_COLOR_WIDTH)
|
|
||||||
.load(R.layout.fragment_category_skeleton)
|
|
||||||
.show()
|
|
||||||
onLoadRefresh()
|
|
||||||
|
|
||||||
if (arguments?.getBoolean(EntranceConsts.KEY_IS_HOME) == true) {
|
|
||||||
mListRv?.setPadding(
|
|
||||||
0,
|
|
||||||
context?.resources?.getDimension(R.dimen.home_recyclerview_padding_top)?.toInt() ?: 0,
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
)
|
|
||||||
mListRv?.clipToPadding = false
|
|
||||||
}
|
|
||||||
|
|
||||||
mListRv?.setBackgroundColor(R.color.ui_surface.toColor(requireContext()))
|
|
||||||
mAdapter.recyclerView = mListRv
|
|
||||||
mListRefresh?.isEnabled = false
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun isAutomaticLoad() = false
|
|
||||||
|
|
||||||
override fun provideListAdapter() = mAdapter
|
|
||||||
|
|
||||||
override fun provideListViewModel() = mViewModel
|
|
||||||
|
|
||||||
override fun getItemDecoration() = VerticalItemDecoration(context, 0F, false)
|
|
||||||
|
|
||||||
override fun onLoadRefresh() {
|
|
||||||
mCachedView?.setBackgroundColor(R.color.ui_surface.toColor(requireContext()))
|
|
||||||
super.onLoadRefresh()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onLoadDone() {
|
|
||||||
mCachedView?.setBackgroundColor(Color.TRANSPARENT)
|
|
||||||
super.onLoadDone()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onLoadEmpty() {
|
|
||||||
mCachedView?.setBackgroundColor(Color.TRANSPARENT)
|
|
||||||
super.onLoadEmpty()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onLoadError() {
|
|
||||||
mCachedView?.setBackgroundColor(Color.TRANSPARENT)
|
|
||||||
super.onLoadError()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDarkModeChanged() {
|
|
||||||
super.onDarkModeChanged()
|
|
||||||
mListRv?.setBackgroundColor(R.color.ui_surface.toColor(requireContext()))
|
|
||||||
mListRv?.adapter?.run {
|
|
||||||
mListRv?.recycledViewPool?.clear()
|
|
||||||
notifyItemRangeChanged(0, itemCount)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
package com.gh.gamecenter.category
|
|
||||||
|
|
||||||
import android.app.Application
|
|
||||||
import com.gh.gamecenter.common.baselist.ListViewModel
|
|
||||||
import com.gh.gamecenter.entity.CategoryEntity
|
|
||||||
import com.gh.gamecenter.retrofit.RetrofitManager
|
|
||||||
import io.reactivex.Observable
|
|
||||||
|
|
||||||
class CategoryDirectoryListViewModel(application: Application) :
|
|
||||||
ListViewModel<CategoryEntity, CategoryEntity>(application) {
|
|
||||||
|
|
||||||
var categoryId = ""
|
|
||||||
|
|
||||||
override fun mergeResultLiveData() {
|
|
||||||
mResultLiveData.addSource(mListLiveData, mResultLiveData::postValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun provideDataObservable(page: Int): Observable<MutableList<CategoryEntity>> {
|
|
||||||
return RetrofitManager.getInstance().api.getCategories(categoryId, page)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,53 +0,0 @@
|
|||||||
package com.gh.gamecenter.category
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.Intent
|
|
||||||
import android.os.Bundle
|
|
||||||
import com.gh.base.DownloadToolbarActivity
|
|
||||||
import com.gh.gamecenter.R
|
|
||||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
|
||||||
import com.gh.gamecenter.common.utils.updateStatusBarColor
|
|
||||||
import com.gh.gamecenter.entity.CategoryEntity
|
|
||||||
|
|
||||||
class CategoryListActivity : DownloadToolbarActivity() {
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
fun getIntent(context: Context, categoryTitle: String, category: CategoryEntity, initTitle: String): Intent {
|
|
||||||
val bundle = Bundle()
|
|
||||||
if (category.data!!.isEmpty() || category.data!![0].name != "全部") {
|
|
||||||
val plainCategory = CategoryEntity(id = category.id, name = "全部")
|
|
||||||
((category.data) as ArrayList).add(0, plainCategory)
|
|
||||||
}
|
|
||||||
bundle.putParcelable(EntranceConsts.KEY_DATA, category)
|
|
||||||
bundle.putString(EntranceConsts.KEY_NAME, category.name)
|
|
||||||
bundle.putString(EntranceConsts.KEY_CATEGORY_TITLE, categoryTitle)
|
|
||||||
bundle.putString(EntranceConsts.KEY_CATEGORY_INIT_TITLE, initTitle)
|
|
||||||
return getTargetIntent(
|
|
||||||
context,
|
|
||||||
CategoryListActivity::class.java,
|
|
||||||
NewCategoryListFragment::class.java,
|
|
||||||
bundle
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
setToolbarMenu(R.menu.menu_download)
|
|
||||||
updateStatusBarColor(R.color.ui_surface, R.color.ui_surface)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun showDownloadMenu(): Boolean {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getActivityNameInChinese(): String {
|
|
||||||
return "游戏分类详情"
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDarkModeChanged() {
|
|
||||||
super.onDarkModeChanged()
|
|
||||||
updateStatusBarColor(R.color.ui_surface, R.color.ui_surface)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,51 +0,0 @@
|
|||||||
package com.gh.gamecenter.category
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import com.gh.gamecenter.common.base.BaseRecyclerViewHolder
|
|
||||||
import com.gh.gamecenter.common.utils.toBinding
|
|
||||||
import com.gh.gamecenter.R
|
|
||||||
import com.gh.gamecenter.common.utils.toColor
|
|
||||||
import com.gh.gamecenter.common.utils.toDrawable
|
|
||||||
import com.gh.gamecenter.databinding.ItemTagBinding
|
|
||||||
import com.gh.gamecenter.entity.CategoryEntity
|
|
||||||
import com.lightgame.adapter.BaseRecyclerAdapter
|
|
||||||
|
|
||||||
class NewCategoryHorizontalAdapter(
|
|
||||||
context: Context,
|
|
||||||
private val mViewModel: NewCategoryListViewModel,
|
|
||||||
private val mCategoryList: List<CategoryEntity>,
|
|
||||||
private val mSmoothScrollAction: (position: Int) -> Unit
|
|
||||||
) : BaseRecyclerAdapter<TagsViewHolder>(context) {
|
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TagsViewHolder {
|
|
||||||
return TagsViewHolder(parent.toBinding())
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: TagsViewHolder, position: Int) {
|
|
||||||
val categoryEntity = mCategoryList[position]
|
|
||||||
|
|
||||||
if (mViewModel.selectedCategory.name == categoryEntity.name) {
|
|
||||||
holder.binding.tagTv.background = R.drawable.bg_tag_text.toDrawable()
|
|
||||||
holder.binding.tagTv.setTextColor(R.color.text_white.toColor(mContext))
|
|
||||||
} else {
|
|
||||||
holder.binding.tagTv.background = null
|
|
||||||
holder.binding.tagTv.setTextColor(R.color.text_757575.toColor(mContext))
|
|
||||||
}
|
|
||||||
|
|
||||||
holder.binding.tagTv.text = categoryEntity.name
|
|
||||||
holder.binding.tagTv.setOnClickListener {
|
|
||||||
mViewModel.changeSelectedCategory(categoryEntity)
|
|
||||||
notifyDataSetChanged()
|
|
||||||
|
|
||||||
mSmoothScrollAction.invoke(position)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItemCount(): Int {
|
|
||||||
return mCategoryList.size
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
class TagsViewHolder(val binding: ItemTagBinding) : BaseRecyclerViewHolder<Any>(binding.root)
|
|
||||||
@ -1,185 +0,0 @@
|
|||||||
package com.gh.gamecenter.category
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.util.SparseArray
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
|
||||||
import com.gh.common.exposure.IExposable
|
|
||||||
import com.gh.common.util.DownloadItemUtils
|
|
||||||
import com.gh.gamecenter.GameDetailActivity
|
|
||||||
import com.gh.gamecenter.R
|
|
||||||
import com.gh.gamecenter.adapter.viewholder.GameViewHolder
|
|
||||||
import com.gh.gamecenter.common.baselist.ListAdapter
|
|
||||||
import com.gh.gamecenter.common.constant.ItemViewType
|
|
||||||
import com.gh.gamecenter.common.exposure.ExposureSource
|
|
||||||
import com.gh.gamecenter.common.utils.dip2px
|
|
||||||
import com.gh.gamecenter.common.utils.toBinding
|
|
||||||
import com.gh.gamecenter.common.viewholder.FooterViewHolder
|
|
||||||
import com.gh.gamecenter.core.utils.StringUtils
|
|
||||||
import com.gh.gamecenter.eventbus.EBDownloadStatus
|
|
||||||
import com.gh.gamecenter.feature.entity.GameEntity
|
|
||||||
import com.gh.gamecenter.feature.exposure.ExposureEvent
|
|
||||||
import com.gh.gamecenter.feature.exposure.ExposureType
|
|
||||||
import com.gh.gamecenter.feature.game.GameItemViewHolder
|
|
||||||
import com.lightgame.download.DownloadEntity
|
|
||||||
|
|
||||||
class NewCategoryListAdapter(
|
|
||||||
context: Context,
|
|
||||||
private val mViewModel: NewCategoryListViewModel,
|
|
||||||
private val mEntrance: String?
|
|
||||||
) : ListAdapter<GameEntity>(context), IExposable {
|
|
||||||
|
|
||||||
private val mExposureEventSparseArray: SparseArray<ExposureEvent> = SparseArray()
|
|
||||||
|
|
||||||
val positionAndPackageMap = HashMap<String, Int>()
|
|
||||||
|
|
||||||
override fun setListData(updateData: MutableList<GameEntity>?) {
|
|
||||||
// 记录游戏位置
|
|
||||||
if (updateData != null) {
|
|
||||||
for (i in 0 until updateData.size) {
|
|
||||||
val gameEntity = updateData[i]
|
|
||||||
var packages = gameEntity.id
|
|
||||||
for (apkEntity in gameEntity.getApk()) {
|
|
||||||
packages += apkEntity.packageName
|
|
||||||
}
|
|
||||||
positionAndPackageMap[packages + i] = i
|
|
||||||
}
|
|
||||||
}
|
|
||||||
super.setListData(updateData)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun clearPositionAndPackageMap() {
|
|
||||||
positionAndPackageMap.clear()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun areItemsTheSame(oldItem: GameEntity?, newItem: GameEntity?): Boolean {
|
|
||||||
return oldItem?.id == newItem?.id
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItemViewType(position: Int): Int {
|
|
||||||
if (position == itemCount - 1) {
|
|
||||||
return ItemViewType.ITEM_FOOTER
|
|
||||||
}
|
|
||||||
return ItemViewType.GAME_NORMAL
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
|
||||||
return when (viewType) {
|
|
||||||
ItemViewType.GAME_NORMAL -> {
|
|
||||||
GameItemViewHolder(parent.toBinding())
|
|
||||||
}
|
|
||||||
else -> {
|
|
||||||
FooterViewHolder(mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItemCount(): Int {
|
|
||||||
return if (mEntityList == null || mEntityList.isEmpty()) return 0 else mEntityList.size + 1
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
|
|
||||||
if (holder is GameItemViewHolder) {
|
|
||||||
val gameEntity = mEntityList[position]
|
|
||||||
|
|
||||||
holder.bindGameItem(gameEntity)
|
|
||||||
holder.initServerType(gameEntity)
|
|
||||||
|
|
||||||
val padTop = if (position == 0) 16F.dip2px() else 8F.dip2px()
|
|
||||||
holder.itemView.setPadding(16F.dip2px(), padTop, 16F.dip2px(), 8F.dip2px())
|
|
||||||
|
|
||||||
val sortType = if ("download:-1" == mViewModel.getSortType()) "最热" else "最新"
|
|
||||||
val toolbarTitle = mViewModel.title
|
|
||||||
val categoryTitle = mViewModel.categoryTitle
|
|
||||||
val selectedCategoryName = mViewModel.selectedCategory.name ?: ""
|
|
||||||
|
|
||||||
val exposureSources = ArrayList<ExposureSource>()
|
|
||||||
exposureSources.add(ExposureSource(categoryTitle, selectedCategoryName))
|
|
||||||
exposureSources.add(ExposureSource("二级分类", "$selectedCategoryName+$sortType"))
|
|
||||||
|
|
||||||
val event = ExposureEvent.createEvent(gameEntity, exposureSources, null, ExposureType.EXPOSURE)
|
|
||||||
mExposureEventSparseArray.put(position, event)
|
|
||||||
|
|
||||||
holder.itemView.setOnClickListener {
|
|
||||||
GameDetailActivity.startGameDetailActivity(
|
|
||||||
mContext,
|
|
||||||
gameEntity,
|
|
||||||
StringUtils.buildString(
|
|
||||||
mEntrance,
|
|
||||||
"+(",
|
|
||||||
toolbarTitle,
|
|
||||||
":列表[",
|
|
||||||
selectedCategoryName,
|
|
||||||
"=",
|
|
||||||
sortType,
|
|
||||||
"=",
|
|
||||||
(position + 1).toString(),
|
|
||||||
"])"
|
|
||||||
),
|
|
||||||
traceEvent = event
|
|
||||||
)
|
|
||||||
}
|
|
||||||
DownloadItemUtils.setOnClickListener(
|
|
||||||
mContext,
|
|
||||||
holder.binding.downloadBtn,
|
|
||||||
gameEntity,
|
|
||||||
position,
|
|
||||||
this,
|
|
||||||
StringUtils.buildString(
|
|
||||||
StringUtils.buildString(
|
|
||||||
mEntrance,
|
|
||||||
"+(",
|
|
||||||
toolbarTitle,
|
|
||||||
":列表[",
|
|
||||||
selectedCategoryName,
|
|
||||||
"=",
|
|
||||||
sortType,
|
|
||||||
"=",
|
|
||||||
(position + 1).toString(),
|
|
||||||
"])"
|
|
||||||
)
|
|
||||||
),
|
|
||||||
location = StringUtils.buildString(selectedCategoryName, ":", gameEntity.name),
|
|
||||||
traceEvent = event
|
|
||||||
)
|
|
||||||
|
|
||||||
DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding))
|
|
||||||
} else if (holder is FooterViewHolder) {
|
|
||||||
holder.initItemPadding()
|
|
||||||
holder.initFooterViewHolder(mViewModel, mIsLoading, mIsNetworkError, mIsOver)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun notifyItemByDownload(download: DownloadEntity) {
|
|
||||||
for (key in positionAndPackageMap.keys) {
|
|
||||||
if (key.contains(download.packageName) && key.contains(download.gameId)) {
|
|
||||||
val position = positionAndPackageMap[key]
|
|
||||||
if (position != null && mEntityList != null && position < mEntityList.size) {
|
|
||||||
mEntityList[position].getEntryMap()[download.platform] = download
|
|
||||||
notifyItemChanged(position)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun notifyItemAndRemoveDownload(status: EBDownloadStatus) {
|
|
||||||
for (key in positionAndPackageMap.keys) {
|
|
||||||
if (key.contains(status.packageName) && key.contains(status.gameId)) {
|
|
||||||
val position = positionAndPackageMap[key]
|
|
||||||
if (position != null && mEntityList != null && position < mEntityList.size) {
|
|
||||||
mEntityList[position].getEntryMap().remove(status.platform)
|
|
||||||
notifyItemChanged(position)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getEventByPosition(pos: Int): ExposureEvent? {
|
|
||||||
return mExposureEventSparseArray.get(pos)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getEventListByPosition(pos: Int): List<ExposureEvent>? {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,198 +0,0 @@
|
|||||||
package com.gh.gamecenter.category
|
|
||||||
|
|
||||||
import android.os.Bundle
|
|
||||||
import android.view.View
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
|
||||||
import com.ethanhua.skeleton.Skeleton
|
|
||||||
import com.gh.common.exposure.ExposureListener
|
|
||||||
import com.gh.common.util.DialogUtils
|
|
||||||
import com.gh.common.view.ConfigFilterView
|
|
||||||
import com.gh.common.xapk.XapkInstaller
|
|
||||||
import com.gh.common.xapk.XapkUnzipStatus
|
|
||||||
import com.gh.download.DownloadManager
|
|
||||||
import com.gh.gamecenter.R
|
|
||||||
import com.gh.gamecenter.common.constant.Constants
|
|
||||||
import com.gh.gamecenter.common.baselist.ListAdapter
|
|
||||||
import com.gh.gamecenter.common.baselist.ListFragment
|
|
||||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
|
||||||
import com.gh.gamecenter.common.utils.observeNonNull
|
|
||||||
import com.gh.gamecenter.common.utils.toColor
|
|
||||||
import com.gh.gamecenter.common.utils.tryCatchInRelease
|
|
||||||
import com.gh.gamecenter.common.utils.viewModelProvider
|
|
||||||
import com.gh.gamecenter.databinding.FragmentTagsBinding
|
|
||||||
import com.gh.gamecenter.entity.CategoryEntity
|
|
||||||
import com.gh.gamecenter.feature.entity.GameEntity
|
|
||||||
import com.gh.gamecenter.entity.SubjectSettingEntity
|
|
||||||
import com.gh.gamecenter.eventbus.EBDownloadStatus
|
|
||||||
import com.gh.gamecenter.eventbus.EBPackage
|
|
||||||
import com.lightgame.download.DataWatcher
|
|
||||||
import com.lightgame.download.DownloadEntity
|
|
||||||
import org.greenrobot.eventbus.Subscribe
|
|
||||||
import org.greenrobot.eventbus.ThreadMode
|
|
||||||
|
|
||||||
class NewCategoryListFragment : ListFragment<GameEntity, NewCategoryListViewModel>() {
|
|
||||||
|
|
||||||
private var mPrimeCategory: CategoryEntity? = null
|
|
||||||
private var mSubCategoryList = arrayListOf<CategoryEntity>()
|
|
||||||
private val mBinding by lazy { FragmentTagsBinding.inflate(layoutInflater) }
|
|
||||||
|
|
||||||
private var mAdapter: NewCategoryListAdapter? = null
|
|
||||||
private val mDataWatcher = object : DataWatcher() {
|
|
||||||
override fun onDataChanged(downloadEntity: DownloadEntity) {
|
|
||||||
mAdapter?.notifyItemByDownload(downloadEntity)
|
|
||||||
|
|
||||||
if (downloadEntity.meta[XapkInstaller.XAPK_UNZIP_STATUS] == XapkUnzipStatus.FAILURE.name) {
|
|
||||||
showUnzipFailureDialog(downloadEntity)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDataInit(downloadEntity: DownloadEntity) {
|
|
||||||
mAdapter?.notifyItemByDownload(downloadEntity)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private lateinit var mExposureListener: ExposureListener
|
|
||||||
private lateinit var mViewModel: NewCategoryListViewModel
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
mViewModel = provideListViewModel()
|
|
||||||
|
|
||||||
mViewModel.title = arguments?.getString(EntranceConsts.KEY_NAME) ?: ""
|
|
||||||
mViewModel.categoryTitle = arguments?.getString(EntranceConsts.KEY_CATEGORY_TITLE) ?: ""
|
|
||||||
mEntrance = arguments?.getString(EntranceConsts.KEY_ENTRANCE) ?: Constants.ENTRANCE_UNKNOWN
|
|
||||||
mPrimeCategory = arguments?.getParcelable(EntranceConsts.KEY_DATA)
|
|
||||||
mSubCategoryList = mPrimeCategory?.data as? ArrayList<CategoryEntity> ?: arrayListOf()
|
|
||||||
|
|
||||||
val initSelectedCategory = arguments?.getString(EntranceConsts.KEY_CATEGORY_INIT_TITLE)
|
|
||||||
|
|
||||||
mViewModel.selectedCategory =
|
|
||||||
mSubCategoryList.find { categoryEntity -> categoryEntity.name == initSelectedCategory }
|
|
||||||
?: CategoryEntity()
|
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
||||||
super.onViewCreated(view, savedInstanceState)
|
|
||||||
|
|
||||||
setNavigationTitle(mViewModel.title)
|
|
||||||
|
|
||||||
mViewModel.refresh.observeNonNull(this) { onRefresh() }
|
|
||||||
|
|
||||||
mBinding.configContainer.visibility = View.VISIBLE
|
|
||||||
mBinding.configContainer.updateAllTextView(mViewModel.sortType)
|
|
||||||
mBinding.configContainer.setOnConfigSetupListener(object : ConfigFilterView.OnConfigFilterSetupListener {
|
|
||||||
override fun onShowSortSize() {}
|
|
||||||
|
|
||||||
override fun onSetupSortSize(sortSize: SubjectSettingEntity.Size) {
|
|
||||||
mViewModel.updateSortConfig(sortSize = sortSize)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onSetupSortType(sortType: ConfigFilterView.SortType) {
|
|
||||||
mViewModel.updateSortConfig(sortType = sortType)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
mExposureListener = ExposureListener(this, mAdapter!!)
|
|
||||||
mListRv.addOnScrollListener(mExposureListener)
|
|
||||||
|
|
||||||
updateCategoriesView(mSubCategoryList)
|
|
||||||
|
|
||||||
mSkeletonScreen =
|
|
||||||
Skeleton.bind(mBinding.listSkeleton).shimmer(false).load(R.layout.fragment_subject_skeleton).show()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onResume() {
|
|
||||||
super.onResume()
|
|
||||||
DownloadManager.getInstance().addObserver(mDataWatcher)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onPause() {
|
|
||||||
super.onPause()
|
|
||||||
DownloadManager.getInstance().removeObserver(mDataWatcher)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItemDecoration() = null
|
|
||||||
|
|
||||||
override fun getLayoutId() = 0
|
|
||||||
|
|
||||||
override fun getInflatedLayout() = mBinding.root
|
|
||||||
|
|
||||||
override fun provideListViewModel(): NewCategoryListViewModel {
|
|
||||||
return viewModelProvider()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun provideListAdapter(): ListAdapter<GameEntity> {
|
|
||||||
return mAdapter
|
|
||||||
?: NewCategoryListAdapter(requireContext(), mViewModel, mEntrance).apply { mAdapter = this }
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun updateCategoriesView(categoryList: ArrayList<CategoryEntity>) {
|
|
||||||
mBinding.tagsRecyclerView.layoutManager =
|
|
||||||
LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
|
|
||||||
mBinding.tagsRecyclerView.adapter = NewCategoryHorizontalAdapter(requireContext(), mViewModel, categoryList) {
|
|
||||||
mBinding.tagsRecyclerView.smoothScrollToPosition(it)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 调整选中标签位置
|
|
||||||
for (index in 0 until categoryList.size) {
|
|
||||||
if (categoryList[index].name == mViewModel.selectedCategory.name) {
|
|
||||||
mBinding.tagsRecyclerView.postDelayed({
|
|
||||||
tryCatchInRelease { mBinding.tagsRecyclerView.smoothScrollToPosition(index) }
|
|
||||||
}, 200)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onRefresh() {
|
|
||||||
mAdapter?.clearPositionAndPackageMap()
|
|
||||||
|
|
||||||
super.onRefresh()
|
|
||||||
}
|
|
||||||
|
|
||||||
// 下载被删除事件
|
|
||||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
|
||||||
fun onEventMainThread(status: EBDownloadStatus) {
|
|
||||||
if ("delete" == status.status) {
|
|
||||||
mAdapter?.notifyItemAndRemoveDownload(status)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 安装/卸载 事件
|
|
||||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
|
||||||
fun onEventMainThread(busFour: EBPackage) {
|
|
||||||
if (busFour.isInstalledOrUninstalled()) {
|
|
||||||
mAdapter?.notifyDataSetChanged()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun showUnzipFailureDialog(downloadEntity: DownloadEntity) {
|
|
||||||
val data = mAdapter?.positionAndPackageMap ?: return
|
|
||||||
for (gameAndPosition in data) {
|
|
||||||
if (gameAndPosition.key.contains(downloadEntity.packageName)) {
|
|
||||||
val targetView = mLayoutManager.findViewByPosition(gameAndPosition.value)
|
|
||||||
if (targetView != null) {
|
|
||||||
DialogUtils.showUnzipFailureDialog(requireContext(), downloadEntity)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDarkModeChanged() {
|
|
||||||
super.onDarkModeChanged()
|
|
||||||
mBinding.run {
|
|
||||||
divider.setBackgroundColor(R.color.ui_background.toColor(requireContext()))
|
|
||||||
tagsRecyclerView.setBackgroundColor(R.color.ui_surface.toColor(requireContext()))
|
|
||||||
tagsRecyclerView.adapter?.run {
|
|
||||||
notifyItemRangeChanged(0, itemCount)
|
|
||||||
}
|
|
||||||
configContainer.run {
|
|
||||||
container.setBackgroundColor(R.color.ui_surface.toColor(requireContext()))
|
|
||||||
updateAllTextView(mViewModel.sortType)
|
|
||||||
updatePopupWindow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,81 +0,0 @@
|
|||||||
package com.gh.gamecenter.category
|
|
||||||
|
|
||||||
import android.app.Application
|
|
||||||
import androidx.lifecycle.MutableLiveData
|
|
||||||
import com.gh.common.exposure.ExposureUtils
|
|
||||||
import com.gh.gamecenter.core.utils.UrlFilterUtils
|
|
||||||
import com.gh.common.view.ConfigFilterView
|
|
||||||
import com.gh.gamecenter.common.baselist.ListViewModel
|
|
||||||
import com.gh.gamecenter.entity.CategoryEntity
|
|
||||||
import com.gh.gamecenter.feature.entity.GameEntity
|
|
||||||
import com.gh.gamecenter.entity.SubjectSettingEntity
|
|
||||||
import com.gh.gamecenter.retrofit.RetrofitManager
|
|
||||||
import io.reactivex.Observable
|
|
||||||
import io.reactivex.Single
|
|
||||||
|
|
||||||
class NewCategoryListViewModel(application: Application) : ListViewModel<GameEntity, GameEntity>(application) {
|
|
||||||
|
|
||||||
var title = "" // 显示在 Toolbar 的标题
|
|
||||||
var categoryTitle = "" // 跳转进来的分类的标题
|
|
||||||
|
|
||||||
val refresh = MutableLiveData<Boolean>()
|
|
||||||
|
|
||||||
var selectedCategory = CategoryEntity()
|
|
||||||
|
|
||||||
var sortType = ConfigFilterView.SortType.RECOMMENDED
|
|
||||||
private var mSortSize = SubjectSettingEntity.Size()
|
|
||||||
|
|
||||||
override fun provideDataObservable(page: Int): Observable<List<GameEntity>>? {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun provideDataSingle(page: Int): Single<List<GameEntity>> {
|
|
||||||
return RetrofitManager.getInstance()
|
|
||||||
.api
|
|
||||||
.getGamesInCategory(selectedCategory.id, getSortType(), getSortSize(), page)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun mergeResultLiveData() {
|
|
||||||
mResultLiveData.addSource(mListLiveData) {
|
|
||||||
ExposureUtils.updateExposureInfo(it)
|
|
||||||
mResultLiveData.postValue(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun changeSelectedCategory(category: CategoryEntity) {
|
|
||||||
if (selectedCategory != category) {
|
|
||||||
selectedCategory = category
|
|
||||||
|
|
||||||
refresh.postValue(true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun updateSortConfig(
|
|
||||||
sortSize: SubjectSettingEntity.Size? = null,
|
|
||||||
sortType: ConfigFilterView.SortType? = null
|
|
||||||
) {
|
|
||||||
if (sortSize != null && sortSize != mSortSize) {
|
|
||||||
mSortSize = sortSize
|
|
||||||
refresh.postValue(true)
|
|
||||||
} else if (sortType != null && sortType != this.sortType) {
|
|
||||||
this.sortType = sortType
|
|
||||||
refresh.postValue(true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getSortSize(): String? {
|
|
||||||
return UrlFilterUtils.getFilterQuery(
|
|
||||||
"min_size", mSortSize.min.toString(),
|
|
||||||
"max_size", mSortSize.max.toString()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getSortType(): String? {
|
|
||||||
return if (sortType == ConfigFilterView.SortType.RECOMMENDED) {
|
|
||||||
"download:-1"
|
|
||||||
} else {
|
|
||||||
"publish:-1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -6,40 +6,6 @@ import com.gh.gamecenter.feature.entity.GameEntity
|
|||||||
import com.google.gson.annotations.SerializedName
|
import com.google.gson.annotations.SerializedName
|
||||||
import kotlinx.parcelize.Parcelize
|
import kotlinx.parcelize.Parcelize
|
||||||
|
|
||||||
@Parcelize
|
|
||||||
data class CatalogEntity(
|
|
||||||
@SerializedName("_id")
|
|
||||||
var id: String = "",
|
|
||||||
var name: String = "",
|
|
||||||
var switch: CatalogSwitch = CatalogSwitch(),
|
|
||||||
@SerializedName("has_special")
|
|
||||||
var hasSpecial: Boolean = false,
|
|
||||||
@SerializedName("sub_catalogs")
|
|
||||||
var subCatalog: List<SubCatalogEntity> = emptyList()
|
|
||||||
) : Parcelable {
|
|
||||||
|
|
||||||
@Parcelize
|
|
||||||
data class SubCatalogEntity(
|
|
||||||
@SerializedName("_id")
|
|
||||||
var id: String = "",
|
|
||||||
var name: String = "",
|
|
||||||
var icon: String = "",
|
|
||||||
var type: String = "",
|
|
||||||
var link: LinkEntity = LinkEntity(),
|
|
||||||
var recommended: Boolean = false
|
|
||||||
) : Parcelable
|
|
||||||
|
|
||||||
@Parcelize
|
|
||||||
data class CatalogSwitch(
|
|
||||||
@SerializedName("sort_hot")
|
|
||||||
var hotSort: String = "",
|
|
||||||
@SerializedName("sort_new")
|
|
||||||
var newSort: String = "",
|
|
||||||
@SerializedName("sort_star")
|
|
||||||
var starSort: String = ""
|
|
||||||
) : Parcelable
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Parcelize
|
@Parcelize
|
||||||
class SpecialCatalogEntity(
|
class SpecialCatalogEntity(
|
||||||
|
|||||||
@ -73,8 +73,6 @@ data class SubjectRecommendEntity(
|
|||||||
"column" -> "专题"
|
"column" -> "专题"
|
||||||
"column_collection" -> "专题合集"
|
"column_collection" -> "专题合集"
|
||||||
"block" -> "版块"
|
"block" -> "版块"
|
||||||
"category" -> "分类"
|
|
||||||
"catalog" -> "新分类"
|
|
||||||
"category_v2" -> "新分类2.0"
|
"category_v2" -> "新分类2.0"
|
||||||
"column_test" -> "开测表"
|
"column_test" -> "开测表"
|
||||||
"server" -> "开服表"
|
"server" -> "开服表"
|
||||||
|
|||||||
@ -11,8 +11,6 @@ import androidx.fragment.app.Fragment
|
|||||||
import androidx.viewpager.widget.ViewPager
|
import androidx.viewpager.widget.ViewPager
|
||||||
import com.gh.gamecenter.R
|
import com.gh.gamecenter.R
|
||||||
import com.gh.gamecenter.amway.AmwayFragment
|
import com.gh.gamecenter.amway.AmwayFragment
|
||||||
import com.gh.gamecenter.catalog.CatalogFragment
|
|
||||||
import com.gh.gamecenter.category.CategoryDirectoryFragment
|
|
||||||
import com.gh.gamecenter.category2.CategoryV2Fragment
|
import com.gh.gamecenter.category2.CategoryV2Fragment
|
||||||
import com.gh.gamecenter.common.base.adapter.FragmentAdapter
|
import com.gh.gamecenter.common.base.adapter.FragmentAdapter
|
||||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
import com.gh.gamecenter.common.constant.EntranceConsts
|
||||||
@ -159,16 +157,6 @@ abstract class HomeTabWrapperFragment : SearchToolWrapperFragment() {
|
|||||||
putString(GameServersTestFragment.TEST_COLUMN_ID, tabEntity.link)
|
putString(GameServersTestFragment.TEST_COLUMN_ID, tabEntity.link)
|
||||||
})
|
})
|
||||||
|
|
||||||
"category" -> CategoryDirectoryFragment().with(Bundle().apply {
|
|
||||||
putString(EntranceConsts.KEY_CATEGORY_ID, tabEntity.link)
|
|
||||||
putString(EntranceConsts.KEY_CATEGORY_TITLE, tabEntity.text)
|
|
||||||
})
|
|
||||||
|
|
||||||
"catalog" -> CatalogFragment().with(Bundle().apply {
|
|
||||||
putString(EntranceConsts.KEY_CATALOG_ID, tabEntity.link)
|
|
||||||
putString(EntranceConsts.KEY_CATALOG_TITLE, tabEntity.text)
|
|
||||||
})
|
|
||||||
|
|
||||||
"category_v2" -> CategoryV2Fragment().with(Bundle().apply {
|
"category_v2" -> CategoryV2Fragment().with(Bundle().apply {
|
||||||
putString(EntranceConsts.KEY_CATEGORY_ID, tabEntity.link)
|
putString(EntranceConsts.KEY_CATEGORY_ID, tabEntity.link)
|
||||||
putString(EntranceConsts.KEY_CATEGORY_TITLE, tabEntity.text)
|
putString(EntranceConsts.KEY_CATEGORY_TITLE, tabEntity.text)
|
||||||
|
|||||||
@ -26,7 +26,6 @@ import com.gh.gamecenter.adapter.viewholder.GameHeadViewHolder
|
|||||||
import com.gh.gamecenter.adapter.viewholder.GameImageViewHolder
|
import com.gh.gamecenter.adapter.viewholder.GameImageViewHolder
|
||||||
import com.gh.gamecenter.adapter.viewholder.GameViewHolder
|
import com.gh.gamecenter.adapter.viewholder.GameViewHolder
|
||||||
import com.gh.gamecenter.adapter.viewholder.GameViewPagerViewHolder
|
import com.gh.gamecenter.adapter.viewholder.GameViewPagerViewHolder
|
||||||
import com.gh.gamecenter.category.CategoryDirectoryActivity
|
|
||||||
import com.gh.gamecenter.common.baselist.LoadStatus
|
import com.gh.gamecenter.common.baselist.LoadStatus
|
||||||
import com.gh.gamecenter.common.callback.OnViewClickListener
|
import com.gh.gamecenter.common.callback.OnViewClickListener
|
||||||
import com.gh.gamecenter.common.constant.EntranceConsts
|
import com.gh.gamecenter.common.constant.EntranceConsts
|
||||||
@ -980,14 +979,6 @@ class GameFragmentAdapter(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
"category" -> mContext.startActivity(
|
|
||||||
CategoryDirectoryActivity.getIntent(
|
|
||||||
mContext,
|
|
||||||
entity.link!!,
|
|
||||||
entity.text!!
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
"column" -> {
|
"column" -> {
|
||||||
SubjectActivity.startSubjectActivity(
|
SubjectActivity.startSubjectActivity(
|
||||||
mContext,
|
mContext,
|
||||||
|
|||||||
@ -20,7 +20,6 @@ import com.gh.gamecenter.entity.BadgeEntity;
|
|||||||
import com.gh.gamecenter.entity.BlockEntity;
|
import com.gh.gamecenter.entity.BlockEntity;
|
||||||
import com.gh.gamecenter.entity.BottomTab;
|
import com.gh.gamecenter.entity.BottomTab;
|
||||||
import com.gh.gamecenter.entity.CarouselEntity;
|
import com.gh.gamecenter.entity.CarouselEntity;
|
||||||
import com.gh.gamecenter.entity.CatalogEntity;
|
|
||||||
import com.gh.gamecenter.entity.CategoryEntity;
|
import com.gh.gamecenter.entity.CategoryEntity;
|
||||||
import com.gh.gamecenter.entity.CommonCollectionContentEntity;
|
import com.gh.gamecenter.entity.CommonCollectionContentEntity;
|
||||||
import com.gh.gamecenter.entity.CommonCollectionEntity;
|
import com.gh.gamecenter.entity.CommonCollectionEntity;
|
||||||
@ -913,19 +912,6 @@ public interface ApiService {
|
|||||||
@GET("blocks/{block_id}/columns")
|
@GET("blocks/{block_id}/columns")
|
||||||
Observable<List<SubjectEntity>> getBlockColumns(@Path("block_id") String blockId, @Query("page") int page);
|
Observable<List<SubjectEntity>> getBlockColumns(@Path("block_id") String blockId, @Query("page") int page);
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类目录
|
|
||||||
*/
|
|
||||||
@Headers({"Content-Type: application/json", "Accept: application/json"})
|
|
||||||
@GET("categories/{category_id}/directories")
|
|
||||||
Observable<List<CategoryEntity>> getCategories(@Path("category_id") String categoryId, @Query("page") int page);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类游戏
|
|
||||||
*/
|
|
||||||
@GET("categories/{category_id}/games")
|
|
||||||
Single<List<GameEntity>> getGamesInCategory(@Path("category_id") String categoryId, @Query("sort") String sort, @Query("filter") String filter, @Query("page") int page);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取关注的用户列表
|
* 获取关注的用户列表
|
||||||
*/
|
*/
|
||||||
@ -2285,18 +2271,6 @@ public interface ApiService {
|
|||||||
@Query("page") int page,
|
@Query("page") int page,
|
||||||
@Query("page_size") int pageSize);
|
@Query("page_size") int pageSize);
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取一级分类数据
|
|
||||||
*/
|
|
||||||
@GET("catalogs/{catalog_id}")
|
|
||||||
Single<CatalogEntity> getCatalogs(@Path("catalog_id") String catalogId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取一级分类数据 及其 二级分类数据
|
|
||||||
*/
|
|
||||||
@GET("catalogs/{catalog_id}/{primary_catalog_id}")
|
|
||||||
Single<CatalogEntity> getSubCatalogs(@Path("catalog_id") String catalogId, @Path("primary_catalog_id") String primaryCatalogId);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取精选分类
|
* 获取精选分类
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:shape="rectangle">
|
|
||||||
<corners android:radius="14dp" />
|
|
||||||
<solid android:color="#14FFFFFF" />
|
|
||||||
</shape>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 290 B |
Binary file not shown.
|
Before Width: | Height: | Size: 304 B |
@ -1,34 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="80dp"
|
|
||||||
android:layout_height="52dp">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/selected_tag"
|
|
||||||
android:layout_width="14dp"
|
|
||||||
android:layout_height="6dp"
|
|
||||||
android:layout_centerHorizontal="true"
|
|
||||||
android:layout_marginTop="34dp"
|
|
||||||
android:src="@drawable/ic_catalog_selected"
|
|
||||||
android:visibility="gone"
|
|
||||||
tools:visibility="visible" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/catalog_name"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:gravity="center"
|
|
||||||
android:textColor="@color/text_primary"
|
|
||||||
android:textSize="12sp"
|
|
||||||
tools:text="精选" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/recommend_tag"
|
|
||||||
android:layout_width="16dp"
|
|
||||||
android:layout_height="12dp"
|
|
||||||
android:layout_marginLeft="52dp"
|
|
||||||
android:layout_marginTop="16dp"
|
|
||||||
android:src="@drawable/ic_recommend"
|
|
||||||
tools:visibility="visible" />
|
|
||||||
</RelativeLayout>
|
|
||||||
@ -1,50 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:background="@color/ui_surface">
|
|
||||||
|
|
||||||
<View
|
|
||||||
android:id="@+id/divider"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="1dp"
|
|
||||||
android:background="@color/ui_divider" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/container_catalog"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_marginTop="1dp"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
|
||||||
android:id="@+id/rv_catalog"
|
|
||||||
android:layout_width="80dp"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:background="@color/ui_background" />
|
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
android:id="@+id/container_sub_catalog"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<include
|
|
||||||
android:id="@+id/reuse_no_connection"
|
|
||||||
layout="@layout/reuse_no_connection" />
|
|
||||||
|
|
||||||
<include
|
|
||||||
android:id="@+id/reuse_none_data"
|
|
||||||
layout="@layout/reuse_none_data" />
|
|
||||||
|
|
||||||
<include
|
|
||||||
android:id="@+id/reuse_data_exception"
|
|
||||||
layout="@layout/reuse_data_exception" />
|
|
||||||
|
|
||||||
<include
|
|
||||||
android:id="@+id/reuse_loading"
|
|
||||||
layout="@layout/reuse_loading"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_centerInParent="true" />
|
|
||||||
</RelativeLayout>
|
|
||||||
@ -1,60 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
android:id="@+id/list_skeleton"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_below="@id/filter_container" />
|
|
||||||
|
|
||||||
<com.gh.common.view.CatalogFilterView
|
|
||||||
android:id="@+id/filter_container"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
|
|
||||||
<View
|
|
||||||
android:id="@+id/divider"
|
|
||||||
android:layout_below="@id/filter_container"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="1dp"
|
|
||||||
android:background="@color/ui_background" />
|
|
||||||
|
|
||||||
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
|
||||||
android:id="@+id/list_refresh"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_below="@id/divider">
|
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
|
||||||
android:id="@+id/list_rv"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
|
||||||
|
|
||||||
<include
|
|
||||||
layout="@layout/reuse_loading"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_centerInParent="true" />
|
|
||||||
|
|
||||||
<include
|
|
||||||
layout="@layout/reuse_no_connection"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_below="@id/filter_container" />
|
|
||||||
|
|
||||||
<include
|
|
||||||
layout="@layout/reuse_none_data"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_below="@id/filter_container" />
|
|
||||||
|
|
||||||
<include
|
|
||||||
layout="@layout/reuse_data_exception"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_below="@id/filter_container" />
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:paddingTop="4dp"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<include layout="@layout/item_skeleton_category" />
|
|
||||||
|
|
||||||
<include layout="@layout/item_skeleton_category" />
|
|
||||||
|
|
||||||
<include layout="@layout/item_skeleton_category" />
|
|
||||||
|
|
||||||
<include layout="@layout/item_skeleton_category" />
|
|
||||||
|
|
||||||
<include layout="@layout/item_skeleton_category" />
|
|
||||||
|
|
||||||
<include layout="@layout/item_skeleton_category" />
|
|
||||||
|
|
||||||
<include layout="@layout/item_skeleton_category" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</RelativeLayout>
|
|
||||||
@ -1,30 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:background="@color/ui_surface">
|
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
|
||||||
android:id="@+id/rv_sub_catalog"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent" />
|
|
||||||
|
|
||||||
<include
|
|
||||||
android:id="@+id/reuse_no_connection"
|
|
||||||
layout="@layout/reuse_no_connection" />
|
|
||||||
|
|
||||||
<include
|
|
||||||
android:id="@+id/reuse_none_data"
|
|
||||||
layout="@layout/reuse_none_data" />
|
|
||||||
|
|
||||||
<include
|
|
||||||
android:id="@+id/reuse_data_exception"
|
|
||||||
layout="@layout/reuse_data_exception" />
|
|
||||||
|
|
||||||
<include
|
|
||||||
android:id="@+id/reuse_loading"
|
|
||||||
layout="@layout/reuse_loading"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_centerInParent="true" />
|
|
||||||
</RelativeLayout>
|
|
||||||
@ -1,91 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<View
|
|
||||||
android:id="@+id/divider"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="8dp"
|
|
||||||
android:background="@color/ui_background" />
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
android:id="@+id/container_category"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="37dp">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/container_primary_category"
|
|
||||||
android:layout_width="90dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:gravity="center"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<com.facebook.drawee.view.SimpleDraweeView
|
|
||||||
android:id="@+id/iconIv"
|
|
||||||
android:layout_width="25dp"
|
|
||||||
android:layout_height="25dp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/categoryName"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:textColor="#000"
|
|
||||||
android:textSize="12sp"
|
|
||||||
tools:text="不是不能用" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/container_sub_category"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_toRightOf="@id/container_primary_category"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/container_unexpandable"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="vertical" />
|
|
||||||
|
|
||||||
<net.cachapa.expandablelayout.ExpandableLayout
|
|
||||||
android:id="@+id/container_expandable"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:el_expanded="false" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="37dp"
|
|
||||||
android:layout_below="@id/container_category">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/iv_toggle"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_alignParentBottom="true"
|
|
||||||
android:layout_centerHorizontal="true"
|
|
||||||
android:paddingLeft="20dp"
|
|
||||||
android:paddingTop="20dp"
|
|
||||||
android:paddingRight="20dp"
|
|
||||||
android:paddingBottom="10dp"
|
|
||||||
android:src="@drawable/ic_category_arrow_down"
|
|
||||||
android:visibility="gone"
|
|
||||||
tools:visibility="visible" />
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
</LinearLayout>
|
|
||||||
@ -1,88 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:paddingTop="38dp"
|
|
||||||
android:paddingBottom="36dp"
|
|
||||||
android:layout_marginTop="8dp">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/viewLeft"
|
|
||||||
android:layout_width="90dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:gravity="center"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<View
|
|
||||||
android:layout_width="28dp"
|
|
||||||
android:layout_height="28dp"
|
|
||||||
android:background="@drawable/bg_skeleton_radius_4" />
|
|
||||||
|
|
||||||
<View
|
|
||||||
android:layout_width="28dp"
|
|
||||||
android:layout_height="12dp"
|
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:background="@drawable/bg_skeleton_radius_4" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:gravity="center_horizontal"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<View
|
|
||||||
android:layout_width="48dp"
|
|
||||||
android:layout_height="16dp"
|
|
||||||
android:background="@drawable/bg_skeleton_radius_4" />
|
|
||||||
|
|
||||||
<View
|
|
||||||
android:layout_width="48dp"
|
|
||||||
android:layout_height="16dp"
|
|
||||||
android:layout_marginTop="16dp"
|
|
||||||
android:background="@drawable/bg_skeleton_radius_4" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:gravity="center_horizontal"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<View
|
|
||||||
android:layout_width="48dp"
|
|
||||||
android:layout_height="16dp"
|
|
||||||
android:background="@drawable/bg_skeleton_radius_4" />
|
|
||||||
|
|
||||||
<View
|
|
||||||
android:layout_width="48dp"
|
|
||||||
android:layout_height="16dp"
|
|
||||||
android:layout_marginTop="16dp"
|
|
||||||
android:background="@drawable/bg_skeleton_radius_4" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:gravity="center_horizontal"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<View
|
|
||||||
android:layout_width="48dp"
|
|
||||||
android:layout_height="16dp"
|
|
||||||
android:background="@drawable/bg_skeleton_radius_4" />
|
|
||||||
|
|
||||||
<View
|
|
||||||
android:layout_width="48dp"
|
|
||||||
android:layout_height="16dp"
|
|
||||||
android:layout_marginTop="16dp"
|
|
||||||
android:background="@drawable/bg_skeleton_radius_4" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
@ -1,36 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:id="@+id/config_controller"
|
|
||||||
style="@style/filterRoot">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/container_type"
|
|
||||||
style="@style/filterItemContainer">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/type_tv"
|
|
||||||
style="@style/filterItem"
|
|
||||||
tools:text="热门推荐" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/container_catalog"
|
|
||||||
style="@style/filterItemContainer">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/catalog_tv"
|
|
||||||
style="@style/filterItem"
|
|
||||||
tools:text="MOD单机" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/container_size"
|
|
||||||
style="@style/filterItemContainer">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/size_tv"
|
|
||||||
style="@style/filterItem"
|
|
||||||
android:text="全部大小" />
|
|
||||||
</LinearLayout>
|
|
||||||
</LinearLayout>
|
|
||||||
@ -1,59 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/tv_left_sub_category"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:gravity="center"
|
|
||||||
android:ellipsize="end"
|
|
||||||
android:textColor="@color/text_black"
|
|
||||||
android:maxLines="1"
|
|
||||||
android:textSize="12sp"
|
|
||||||
tools:text="星海爭霸" />
|
|
||||||
|
|
||||||
<View
|
|
||||||
android:id="@+id/divider_left"
|
|
||||||
android:layout_width="1dp"
|
|
||||||
android:layout_height="15dp"
|
|
||||||
android:background="#ededed"
|
|
||||||
android:visibility="gone"
|
|
||||||
tools:visibility="visible" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/tv_center_sub_category"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:gravity="center"
|
|
||||||
android:ellipsize="end"
|
|
||||||
android:maxLines="1"
|
|
||||||
android:textColor="@color/text_black"
|
|
||||||
android:textSize="12sp"
|
|
||||||
tools:text="空海爭霸" />
|
|
||||||
|
|
||||||
<View
|
|
||||||
android:id="@+id/divider_right"
|
|
||||||
android:layout_width="1dp"
|
|
||||||
android:layout_height="15dp"
|
|
||||||
android:background="#ededed"
|
|
||||||
android:visibility="gone"
|
|
||||||
tools:visibility="visible" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/tv_right_sub_category"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:ellipsize="end"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:gravity="center"
|
|
||||||
android:maxLines="1"
|
|
||||||
android:textColor="@color/text_black"
|
|
||||||
android:textSize="12sp"
|
|
||||||
tools:text="地海爭霸" />
|
|
||||||
</LinearLayout>
|
|
||||||
@ -1,51 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:layout_width="64dp"
|
|
||||||
android:layout_height="64dp"
|
|
||||||
android:layout_centerHorizontal="true"
|
|
||||||
android:layout_marginTop="17dp"
|
|
||||||
android:background="@drawable/bg_sub_catalog_item" />
|
|
||||||
|
|
||||||
<com.facebook.drawee.view.SimpleDraweeView
|
|
||||||
android:id="@+id/catalog_icon"
|
|
||||||
android:layout_width="64dp"
|
|
||||||
android:layout_height="64dp"
|
|
||||||
android:layout_centerHorizontal="true"
|
|
||||||
android:layout_marginTop="17dp"
|
|
||||||
app:fadeDuration="500"
|
|
||||||
app:placeholderImage="@drawable/occupy"
|
|
||||||
app:placeholderImageScaleType="fitXY"
|
|
||||||
app:roundedCornerRadius="16dp"
|
|
||||||
app:roundingBorderColor="@color/ui_background"
|
|
||||||
app:roundingBorderWidth="1dp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/catalog_name"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_below="@+id/catalog_icon"
|
|
||||||
android:layout_centerHorizontal="true"
|
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:layout_marginBottom="7dp"
|
|
||||||
android:includeFontPadding="false"
|
|
||||||
android:textColor="@color/text_primary"
|
|
||||||
android:textSize="12sp"
|
|
||||||
tools:text="加速插件" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/recommend_tag"
|
|
||||||
android:layout_width="18dp"
|
|
||||||
android:layout_height="14dp"
|
|
||||||
android:layout_alignLeft="@+id/catalog_icon"
|
|
||||||
android:layout_alignBottom="@+id/catalog_icon"
|
|
||||||
android:layout_marginLeft="50dp"
|
|
||||||
android:layout_marginBottom="54dp"
|
|
||||||
android:src="@drawable/ic_recommend"
|
|
||||||
tools:visibility="visible" />
|
|
||||||
</RelativeLayout>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 678 B |
Binary file not shown.
|
Before Width: | Height: | Size: 605 B |
Binary file not shown.
|
Before Width: | Height: | Size: 1008 B |
Binary file not shown.
|
Before Width: | Height: | Size: 755 B |
@ -31,7 +31,6 @@ public class EntranceConsts {
|
|||||||
public static final String HOST_USERHOME = "userhome";//个人主页
|
public static final String HOST_USERHOME = "userhome";//个人主页
|
||||||
public static final String HOST_VIDEO = "video";
|
public static final String HOST_VIDEO = "video";
|
||||||
public static final String HOST_FORUM = "forum";
|
public static final String HOST_FORUM = "forum";
|
||||||
public static final String HOST_CATEGORY = "category";//分类
|
|
||||||
public static final String HOST_COLUMN_COLLECTION = "column_collection";//专题合集
|
public static final String HOST_COLUMN_COLLECTION = "column_collection";//专题合集
|
||||||
public static final String HOST_COMMUNITY_QUESTION_LABEL_DETAIL = "community_question_label_detail";//问题标签详情
|
public static final String HOST_COMMUNITY_QUESTION_LABEL_DETAIL = "community_question_label_detail";//问题标签详情
|
||||||
public static final String HOST_COMMUNITY_COLUMN_DETAIL = "community_column_detail";//专栏详情
|
public static final String HOST_COMMUNITY_COLUMN_DETAIL = "community_column_detail";//专栏详情
|
||||||
@ -170,10 +169,8 @@ public class EntranceConsts {
|
|||||||
public static final String KEY_IS_COLUMN_COLLECTION = "is_column_collection";//是专题合集
|
public static final String KEY_IS_COLUMN_COLLECTION = "is_column_collection";//是专题合集
|
||||||
public static final String KEY_DRAFT_ID = "draft_id";
|
public static final String KEY_DRAFT_ID = "draft_id";
|
||||||
public static final String KEY_KAIFU_LIST = "kaifuList";
|
public static final String KEY_KAIFU_LIST = "kaifuList";
|
||||||
public static final String KEY_CATEGORY = "category";
|
|
||||||
public static final String KEY_CATEGORY_ID = "category_id";
|
public static final String KEY_CATEGORY_ID = "category_id";
|
||||||
public static final String KEY_CATEGORY_TITLE = "category_title";
|
public static final String KEY_CATEGORY_TITLE = "category_title";
|
||||||
public static final String KEY_CATEGORY_INIT_TITLE = "category_init_title";
|
|
||||||
public static final String KEY_BLOCK_DATA = "blockData";
|
public static final String KEY_BLOCK_DATA = "blockData";
|
||||||
public static final String KEY_ASK_TAG = "askTag";
|
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 = "libao";
|
||||||
@ -251,11 +248,7 @@ public class EntranceConsts {
|
|||||||
public static final String KEY_SIMULATOR = "simulator";
|
public static final String KEY_SIMULATOR = "simulator";
|
||||||
public static final String KEY_MARKET_DETAILS = "market_details";
|
public static final String KEY_MARKET_DETAILS = "market_details";
|
||||||
public static final String KEY_CATALOG_ID = "catalogId";
|
public static final String KEY_CATALOG_ID = "catalogId";
|
||||||
public static final String KEY_PRIMARY_CATALOG_ID = "primaryCatalogId";
|
|
||||||
public static final String KEY_PRIMARY_CATALOG_NAME = "primaryCatalogName";
|
|
||||||
public static final String KEY_CATALOG_TITLE = "catalog_title";
|
public static final String KEY_CATALOG_TITLE = "catalog_title";
|
||||||
public static final String KEY_CATALOG_INIT_TITLE = "catalog_init_title";
|
|
||||||
public static final String KEY_CATEGORY_LIST = "categoty_list";
|
|
||||||
public static final String KEY_IS_FREE = "is_free";
|
public static final String KEY_IS_FREE = "is_free";
|
||||||
public static final String KEY_IS_SIGN = "is_sign";
|
public static final String KEY_IS_SIGN = "is_sign";
|
||||||
public static final String KEY_IS_FORCED_TO_CERTIFICATE = "is_forced_to_certificate";
|
public static final String KEY_IS_FORCED_TO_CERTIFICATE = "is_forced_to_certificate";
|
||||||
|
|||||||
Reference in New Issue
Block a user