diff --git a/app/src/main/java/com/gh/base/fragment/BaseFragment.java b/app/src/main/java/com/gh/base/fragment/BaseFragment.java index 3be0fb3e50..d291f71673 100644 --- a/app/src/main/java/com/gh/base/fragment/BaseFragment.java +++ b/app/src/main/java/com/gh/base/fragment/BaseFragment.java @@ -145,7 +145,10 @@ public abstract class BaseFragment extends Fragment implements OnRequestCallB } else { mCachedView = View.inflate(getContext(), getLayoutId(), null); } - ButterKnife.bind(this, mCachedView); + + if (useButterKnife()) { + ButterKnife.bind(this, mCachedView); + } initView(mCachedView); @@ -309,4 +312,8 @@ public abstract class BaseFragment extends Fragment implements OnRequestCallB protected boolean addSyncPageObserver() { return false; } + + protected boolean useButterKnife() { + return true; + } } diff --git a/app/src/main/java/com/gh/base/fragment/BaseLazyTabFragment.kt b/app/src/main/java/com/gh/base/fragment/BaseLazyTabFragment.kt new file mode 100644 index 0000000000..85f3e40cca --- /dev/null +++ b/app/src/main/java/com/gh/base/fragment/BaseLazyTabFragment.kt @@ -0,0 +1,152 @@ +package com.gh.base.fragment + +import android.content.Intent +import android.graphics.Typeface +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.widget.CheckedTextView +import android.widget.TextView +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager +import butterknife.BindView +import com.gh.base.adapter.FragmentAdapter +import com.gh.common.view.TabIndicatorView +import com.gh.gamecenter.R +import com.google.android.material.tabs.TabLayout +import com.google.android.material.tabs.TabLayout.OnTabSelectedListener +import com.halo.assistant.HaloApp +import com.lightgame.utils.Utils +import com.lightgame.view.NoScrollableViewPager + +abstract class BaseLazyTabFragment : BaseLazyFragment(), ViewPager.OnPageChangeListener { + + @BindView(R.id.fragment_tab_layout) + lateinit var mTabLayout: TabLayout + @BindView(R.id.fragment_view_pager) + lateinit var mViewPager: NoScrollableViewPager + @BindView(R.id.fragment_tab_indicator) + lateinit var mTabIndicatorView: TabIndicatorView + + var mFragmentsList: MutableList = arrayListOf() + + var mTabTitleList: MutableList = arrayListOf() + + var mCheckedIndex = 0 + + abstract fun initFragmentList(fragments: MutableList) + + abstract fun initTabTitleList(tabTitleList: MutableList) + + protected open fun provideIndicatorWidth(): Int { + return 20 + } + + protected open fun provideTabView(position: Int, tabTitle: String?): View? { + return null + } + + override fun getLayoutId(): Int { + return R.layout.fragment_tablayout_viewpager + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + val fragments = childFragmentManager.fragments + if (fragments != null) { + for (fragment in fragments) { + fragment.onActivityResult(requestCode, resultCode, data) + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + if (arguments != null) mCheckedIndex = requireArguments().getInt(PAGE_INDEX, 0) + mFragmentsList = ArrayList() + initFragmentList(mFragmentsList) + mTabTitleList = ArrayList() + initTabTitleList(mTabTitleList) + } + + override fun onFragmentFirstVisible() { + super.onFragmentFirstVisible() + + mViewPager.offscreenPageLimit = mFragmentsList.size + mViewPager.addOnPageChangeListener(this) + mViewPager.adapter = FragmentAdapter(childFragmentManager, mFragmentsList, mTabTitleList) + mViewPager.currentItem = mCheckedIndex + mTabLayout.setupWithViewPager(mViewPager) + mTabIndicatorView.setupWithTabLayout(mTabLayout) + mTabIndicatorView.setupWithViewPager(mViewPager) + mTabIndicatorView.setIndicatorWidth(provideIndicatorWidth()) + for (i in 0 until mTabLayout.tabCount) { + val tab = mTabLayout.getTabAt(i) ?: continue + val tabTitle = if (tab.text != null) tab.text.toString() else "" + var tabView = provideTabView(i, tabTitle) + if (tabView == null) tabView = createDefaultTabCustomView(tabTitle) + tab.customView = tabView + } + initTabStyle(mTabLayout, mCheckedIndex) + } + + open fun initTabStyle(tabLayout: TabLayout?, currentItem: Int) { // 默认选择addOnTabSelectedListener不会回调 + val tabCount = tabLayout!!.tabCount + if (tabCount > 0) { + val tab = tabLayout.getTabAt(currentItem) + if (tab != null) updateTabStyle(tab, true) + } + tabLayout.addOnTabSelectedListener(object : OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab) { + updateTabStyle(tab, true) + } + + override fun onTabUnselected(tab: TabLayout.Tab) { + updateTabStyle(tab, false) + } + + override fun onTabReselected(tab: TabLayout.Tab) { + updateTabStyle(tab, true) + } + }) + } + + open fun updateTabStyle(tab: TabLayout.Tab, isChecked: Boolean) { + val tabView = tab.customView + if (tabView == null) { + Utils.log("TabLayout->Tab样式不是通用样式,请检查") + return + } + val tabTitle: TextView? + tabTitle = if (tabView is TextView) { + tabView + } else { + tabView.findViewById(R.id.tab_title) + } + if (tabTitle == null) { + Utils.log("TabLayout->Tab样式不是通用样式,请检查") + return + } + tabTitle.typeface = if (isChecked) Typeface.DEFAULT_BOLD else Typeface.DEFAULT + } + + // 如果不设置View的话,无法动态设置字体样式 + open fun createDefaultTabCustomView(title: String?): View { + val view = LayoutInflater.from(HaloApp.getInstance().application.baseContext).inflate(R.layout.tab_item, null) + val tabTitle = view.findViewById(R.id.tab_title) + if (tabTitle is CheckedTextView) { + tabTitle.text = title + } + return view + } + + override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} + + override fun onPageSelected(position: Int) {} + + override fun onPageScrollStateChanged(state: Int) {} + + companion object { + const val PAGE_INDEX = "PAGE_INDEX" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/util/PackageUtils.java b/app/src/main/java/com/gh/common/util/PackageUtils.java index 55b04a0973..511724c547 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -14,8 +14,6 @@ import android.os.Build; import android.os.Bundle; import android.text.TextUtils; -import androidx.core.content.FileProvider; - import com.g00fy2.versioncompare.Version; import com.gh.common.constant.Constants; import com.gh.gamecenter.BuildConfig; @@ -38,7 +36,8 @@ import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.List; -import javax.annotation.Nullable; +import androidx.annotation.Nullable; +import androidx.core.content.FileProvider; public class PackageUtils { diff --git a/app/src/main/java/com/gh/common/view/ExpandTextView.java b/app/src/main/java/com/gh/common/view/ExpandTextView.java index 4c7c2227d6..96b3b9b390 100644 --- a/app/src/main/java/com/gh/common/view/ExpandTextView.java +++ b/app/src/main/java/com/gh/common/view/ExpandTextView.java @@ -1,6 +1,7 @@ package com.gh.common.view; import android.content.Context; +import android.content.res.TypedArray; import android.graphics.Color; import android.os.Build; import android.text.Layout; @@ -12,12 +13,12 @@ import android.text.style.ClickableSpan; import android.util.AttributeSet; import android.view.View; -import androidx.appcompat.widget.AppCompatTextView; -import androidx.core.content.ContextCompat; - import com.gh.common.util.DisplayUtils; import com.gh.gamecenter.R; +import androidx.appcompat.widget.AppCompatTextView; +import androidx.core.content.ContextCompat; + public class ExpandTextView extends AppCompatTextView { private CharSequence mSnapshotText; @@ -40,6 +41,9 @@ public class ExpandTextView extends AppCompatTextView { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { mMaxLines = getMaxLines(); } + TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.ExpandTextView); + mExpendText = array.getString(R.styleable.ExpandTextView_expandText) == null ? mExpendText : array.getString(R.styleable.ExpandTextView_expandText); + array.recycle(); } @Override diff --git a/app/src/main/java/com/gh/common/view/VerticalItemDecoration.java b/app/src/main/java/com/gh/common/view/VerticalItemDecoration.java index e01f330542..7aa1013cdf 100644 --- a/app/src/main/java/com/gh/common/view/VerticalItemDecoration.java +++ b/app/src/main/java/com/gh/common/view/VerticalItemDecoration.java @@ -4,13 +4,14 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; import android.view.View; import com.gh.common.util.DisplayUtils; import com.gh.gamecenter.R; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; + public class VerticalItemDecoration extends RecyclerView.ItemDecoration { private Paint paint; @@ -18,13 +19,21 @@ public class VerticalItemDecoration extends RecyclerView.ItemDecoration { private int mIntervalLR; private boolean mIsShowIntervalTop; - public VerticalItemDecoration(Context context, float interval, boolean isShowIntervalTop) { + public VerticalItemDecoration(Context context, float interval, boolean isShowIntervalTop, int colorRes) { paint = new Paint(); - paint.setColor(ContextCompat.getColor(context, R.color.background)); + if (colorRes != 0) { + paint.setColor(ContextCompat.getColor(context, colorRes)); + } else { + paint.setColor(ContextCompat.getColor(context, R.color.background)); + } mInterval = DisplayUtils.dip2px(context, interval); mIsShowIntervalTop = isShowIntervalTop; } + public VerticalItemDecoration(Context context, float interval, boolean isShowIntervalTop) { + this(context, interval, isShowIntervalTop, 0); + } + public VerticalItemDecoration(Context context, int interval, boolean isShowIntervalTop, int intervalLR) { paint = new Paint(); paint.setColor(ContextCompat.getColor(context, R.color.background)); diff --git a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolWrapperFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolWrapperFragment.java index 660bf6964f..8c4f7d79f5 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolWrapperFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolWrapperFragment.java @@ -4,7 +4,7 @@ import android.os.Bundle; import android.view.View; import android.widget.LinearLayout; -import com.gh.base.fragment.BaseFragment; +import com.gh.base.fragment.BaseLazyFragment; import com.gh.common.constant.Config; import com.gh.common.util.DisplayUtils; import com.gh.common.util.EntranceUtils; @@ -27,7 +27,7 @@ import butterknife.BindView; * @Date 02/07/2017 * @Time 11:30 AM */ -public class SearchToolWrapperFragment extends BaseFragment { +public class SearchToolWrapperFragment extends BaseLazyFragment { @BindView(R.id.wrapperLl) LinearLayout wrapperLl; diff --git a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java index 12a235d352..0ecdd8e97d 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java @@ -13,11 +13,8 @@ import android.view.animation.Animation; import android.view.animation.ScaleAnimation; import android.widget.TextView; -import androidx.annotation.Nullable; -import androidx.lifecycle.ViewModelProviders; - import com.gh.base.SearchBarHint; -import com.gh.base.fragment.BaseFragment; +import com.gh.base.fragment.BaseLazyFragment; import com.gh.common.constant.Config; import com.gh.common.databind.BindingAdapters; import com.gh.common.util.CheckLoginUtils; @@ -44,6 +41,8 @@ import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; import java.util.List; +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProviders; import butterknife.BindView; @@ -51,7 +50,7 @@ import butterknife.BindView; * Created by LGT on 2016/9/9. * 工具栏 搜索控制 */ -public class SearchToolbarFragment extends BaseFragment implements View.OnClickListener, SearchBarHint { +public class SearchToolbarFragment extends BaseLazyFragment implements View.OnClickListener, SearchBarHint { @BindView(R.id.action_tip) TextView mDownloadHintTv; diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt index 3f156c6bc1..2e5b799ec8 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt @@ -121,6 +121,11 @@ class GameDetailViewModel(application: Application, }) } + fun getGameDetailNew(){ + + + } + /** * 获取游戏详情的内容获取相应内容的用户相关信息 */ diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt index b76ae5cb89..0eceb01ed2 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt @@ -12,20 +12,19 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.gh.common.util.* import com.gh.common.view.HorizontalItemDecoration +import com.gh.common.view.VerticalItemDecoration import com.gh.gamecenter.R import com.gh.gamecenter.SuggestionActivity import com.gh.gamecenter.adapter.viewholder.FooterViewHolder import com.gh.gamecenter.adapter.viewholder.GameDetailIntroViewHolder import com.gh.gamecenter.adapter.viewholder.GameDetailPluginViewHolder import com.gh.gamecenter.adapter.viewholder.ReuseViewHolder -import com.gh.gamecenter.databinding.GameHorizontalListBinding -import com.gh.gamecenter.databinding.GamedetailItemCommentsBinding -import com.gh.gamecenter.databinding.GamedetailItemImageBinding -import com.gh.gamecenter.databinding.GamedetailItemRelatedVersionBinding +import com.gh.gamecenter.databinding.* import com.gh.gamecenter.entity.* import com.gh.gamecenter.eventbus.EBReuse import com.gh.gamecenter.game.horizontal.GameHorizontalListViewHolder import com.gh.gamecenter.gamedetail.GameDetailFragment +import com.gh.gamecenter.home.amway.LeftPagerSnapHelper import com.gh.gamecenter.suggest.SuggestType import com.lightgame.adapter.BaseRecyclerAdapter import org.greenrobot.eventbus.EventBus @@ -80,6 +79,14 @@ class DescAdapter(context: Context, IMAGE } else if (descItemData.comments != null) { COMMENTS + } else if (descItemData.videos != null) { + VIDEOS + } else if (descItemData.gallery != null) { + IMAGE_GALLERY + } else if (descItemData.updateContent != null) { + UPDATE_CONTENT + } else if (descItemData.server != null) { + LATEST_SERVICE } else { FOOTER } @@ -103,13 +110,6 @@ class DescAdapter(context: Context, val binding = GameHorizontalListBinding.bind(mLayoutInflater.inflate(R.layout.game_horizontal_list, parent, false)) GameHorizontalListViewHolder(binding) } - FOOTER -> { - val view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false) - FooterViewHolder(view) - } - IMAGE -> { - GameDetailRecommendImageViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.gamedetail_item_image, parent, false)) - } COMMENTS -> { GameDetailCommentsViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.gamedetail_item_comments, parent, false)) } @@ -117,6 +117,27 @@ class DescAdapter(context: Context, val view = mLayoutInflater.inflate(R.layout.gamedetail_item_custom_column, parent, false) GameDetailCustomColumnViewHolder(view) } + + + IMAGE -> { + GameDetailRecommendImageViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.gamedetail_item_image, parent, false)) + } + VIDEOS -> { + GameVideoGalleryViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.game_gallery_list, parent, false)) + } + IMAGE_GALLERY -> { + GameImageGalleryViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.game_gallery_list, parent, false)) + } + UPDATE_CONTENT -> { + GameUpdateContentViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.game_update_content, parent, false)) + } + LATEST_SERVICE -> { + GameLatestServiceViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.game_latest_service_list, parent, false)) + } + FOOTER -> { + val view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false) + FooterViewHolder(view) + } else -> { val view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false) FooterViewHolder(view) @@ -140,6 +161,15 @@ class DescAdapter(context: Context, is GameDetailRelatedVersionViewHolder -> bindRelatedVersion(holder, descItemList[position]) + is GameVideoGalleryViewHolder -> bindVideosViewHolder(holder, descItemList[position].videos) + + is GameImageGalleryViewHolder -> bindImageGalleryViewHolder(holder, descItemList[position].gallery) + + is GameUpdateContentViewHolder -> bindUpdateContentViewHolder(holder, descItemList[position].updateContent) + + is GameLatestServiceViewHolder -> bindLatestServiceViewHolder(holder, descItemList[position].server) + + is FooterViewHolder -> { holder.loading.visibility = View.GONE holder.hint.setText(R.string.game_suggestion_hint) @@ -289,7 +319,7 @@ class DescAdapter(context: Context, viewHolder.introGallery.layoutManager = LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false) val gameGalleryAdapter = GameGalleryAdapter( mContext, - descItemData.intro?.video, + null, descItemData.intro?.gallery!!, gameName!!, StringUtils.buildString(mEntrance, "+(游戏详情[", gameName, "]:游戏介绍)")) @@ -351,14 +381,78 @@ class DescAdapter(context: Context, } } + private fun bindVideosViewHolder(viewHolder: GameVideoGalleryViewHolder, videos: ArrayList?) { + viewHolder.binding.galleryRv.isNestedScrollingEnabled = false + if (viewHolder.binding.galleryRv.adapter == null) { + viewHolder.binding.galleryRv.apply { + layoutManager = LinearLayoutManager(mContext, RecyclerView.HORIZONTAL, false) + val gameGalleryAdapter = GameGalleryAdapter(mContext, videos, null, gameName!!, + StringUtils.buildString(mEntrance, "+(游戏详情[", gameName, "]:游戏介绍)")) + adapter = gameGalleryAdapter + addItemDecoration(HorizontalItemDecoration(mContext, 8, videos?.size ?: 0)) + val snapHelper = LeftPagerSnapHelper(0) + snapHelper.attachToRecyclerView(this) + } + } + viewHolder.binding.titleTv.text = "视频(${videos?.size ?: 0})" + viewHolder.binding.moreTv.visibleIf(videos?.size ?: 0 >= 3) + viewHolder.binding.moreTv.setOnClickListener { + + } + } + + private fun bindImageGalleryViewHolder(viewHolder: GameImageGalleryViewHolder, gallery: ArrayList?) { + viewHolder.binding.galleryRv.isNestedScrollingEnabled = false + if (viewHolder.binding.galleryRv.adapter == null) { + viewHolder.binding.galleryRv.apply { + layoutManager = LinearLayoutManager(mContext, RecyclerView.HORIZONTAL, false) + val gameGalleryAdapter = GameGalleryAdapter(mContext, null, gallery, gameName!!, + StringUtils.buildString(mEntrance, "+(游戏详情[", gameName, "]:游戏介绍)")) + adapter = gameGalleryAdapter + addItemDecoration(HorizontalItemDecoration(mContext, 8, gallery?.size ?: 0)) + } + } + viewHolder.binding.titleTv.text = "图片" + viewHolder.binding.moreTv.visibility = View.GONE + } + + private fun bindUpdateContentViewHolder(holder: GameUpdateContentViewHolder, updateContent: String?) { + holder.binding.contentTv.text = updateContent ?: "" + holder.binding.historyVersionTv.setOnClickListener { + ToastUtils.showToast("历史版本") + } + } + + + private fun bindLatestServiceViewHolder(viewHolder: GameLatestServiceViewHolder, server: GameDetailServer?) { + viewHolder.binding.serviceRv.isNestedScrollingEnabled = false + if (viewHolder.binding.serviceRv.adapter == null) { + viewHolder.binding.serviceRv.apply { + layoutManager = LinearLayoutManager(mContext) + val serviceAdapter = GameLatestServiceAdapter(mContext, server?.calendar!!) + adapter = serviceAdapter + addItemDecoration(VerticalItemDecoration(mContext, 12F, false, R.color.white)) + } + } + viewHolder.binding.moreTv.visibleIf(server?.calendar?.size ?: 0 > 10) + viewHolder.binding.moreTv.setOnClickListener { + + } + } + companion object { - const val IMAGE = 3 const val INTRO = 4 const val HEADER = 6 - const val COMMENTS = 8 - const val RECOMMENDED_GAMES = 100 + const val COMMENTS = 8//评论 const val CUSTOM_COLUMN = 64 const val RELATED_VERSION = 128 + + const val IMAGE = 3//图片推荐 + const val RECOMMENDED_GAMES = 100//大家都在玩 + const val VIDEOS = 129//视频 + const val IMAGE_GALLERY = 130//图片 + const val UPDATE_CONTENT = 131//更新内容 + const val LATEST_SERVICE = 132//最新开服 const val FOOTER = 101 } @@ -375,4 +469,12 @@ class DescAdapter(context: Context, class GameDetailCustomColumnViewHolder(view: View) : GameDetailPluginViewHolder(view) class GameDetailRelatedVersionViewHolder(var binding: GamedetailItemRelatedVersionBinding) : RecyclerView.ViewHolder(binding.root) + + class GameVideoGalleryViewHolder(var binding: GameGalleryListBinding) : RecyclerView.ViewHolder(binding.root) + + class GameImageGalleryViewHolder(var binding: GameGalleryListBinding) : RecyclerView.ViewHolder(binding.root) + + class GameUpdateContentViewHolder(var binding: GameUpdateContentBinding) : RecyclerView.ViewHolder(binding.root) + + class GameLatestServiceViewHolder(var binding: GameLatestServiceListBinding) : RecyclerView.ViewHolder(binding.root) } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescItemData.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescItemData.kt index 26cb3a53d0..56aa42391a 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescItemData.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescItemData.kt @@ -10,7 +10,11 @@ data class DescItemData( var customColumn: GameDetailEntity.CustomColumn? = null, var relatedVersion: GameDetailEntity.RelatedVersion? = null, var recommendedImage: LinkEntity? = null, - var comments: ArrayList? = null) { + var comments: ArrayList? = null, + var videos: ArrayList? = null, + var gallery: ArrayList? = null, + var updateContent: String? = null, + var server: GameDetailServer? = null) { data class Intro( var name: String? = "", diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescViewModel.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescViewModel.kt index 1a0ff950d7..ec1354aa38 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescViewModel.kt @@ -98,6 +98,20 @@ class DescViewModel(application: Application, mDataList.add(DescItemData(recommendedImage = it.imageRecommend)) } + //Todo:测试数据 + if (it.gallery != null) { + mDataList.add(DescItemData(gallery = it.gallery)) + } + if (it.introVideo != null) { + mDataList.add(DescItemData(videos = arrayListOf(it.introVideo!!, it.introVideo!!, it.introVideo!!))) + } + mDataList.add(DescItemData(updateContent = "1、功能标签只显示标签名字在第一行,游戏没有填写功能标签就不显示" + + "2、详细信息板块有多少内容显示多少内容,即各个数据的位置不是固定的" + + "3、做设备上是否安装QQ应用的判断,如有安装则直接跳转,未安装则点击是复制并toast“已复制”")) + if (it.serverEntity != null) { + mDataList.add(DescItemData(server = it.serverEntity)) + } + list.postValue(mDataList) if (mGameDetail?.showComment == true) { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameGalleryAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameGalleryAdapter.kt index 297a1546c3..106e805b26 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameGalleryAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameGalleryAdapter.kt @@ -19,11 +19,10 @@ import com.gh.gamecenter.ViewImageActivity import com.gh.gamecenter.databinding.GalleryVideoItemBinding import com.gh.gamecenter.entity.GameDetailEntity import com.gh.gamecenter.video.detail.VideoDetailContainerViewModel -import java.util.* class GameGalleryAdapter(var context: Context, - private val mVideo: GameDetailEntity.Video? = null, - private val mGallery: ArrayList, + private val mVideo: ArrayList? = null, + private val mGallery: ArrayList? = null, private val mGameName: String, private val mEntrance: String) : RecyclerView.Adapter() { @@ -39,17 +38,18 @@ class GameGalleryAdapter(var context: Context, VIDEO -> { VideoViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.gallery_video_item, parent, false)) } - else -> { + IMAGE -> { val view = mLayoutInflater.inflate(R.layout.gamedetail_screenshot_item, parent, false) GameGalleryViewHolder(view) } + else -> throw NullPointerException() } } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder) { is GameGalleryViewHolder -> { - ImageUtils.display(holder.screenshotIv, mGallery[position - getVideoCount()]) + ImageUtils.display(holder.screenshotIv, mGallery?.get(position)) holder.screenshotIv.loadingCallback = object : WrapContentDraweeView.LoadingCallback { override fun loaded() { holder.screenshotIv.post { @@ -67,14 +67,14 @@ class GameGalleryAdapter(var context: Context, DataCollectionUtils.uploadClick(context, "游戏介绍", "游戏详情") MtaHelper.onEvent("游戏详情_新", "点击游戏截图", mGameName) - val intent = ViewImageActivity.getViewImageIntent(context, mGallery, holder.adapterPosition - getVideoCount(), mEntrance) + val intent = ViewImageActivity.getViewImageIntent(context, mGallery, holder.adapterPosition, mEntrance) context.startActivity(intent) } } is VideoViewHolder -> { - ImageUtils.display(holder.binding.screenshotItemIv, mVideo!!.poster) - holder.binding.videoCountTv.text = "${mVideo.videoCount}个视频" - holder.binding.screenshotItemIv.loadingCallback = object : WrapContentDraweeView.LoadingCallback { + ImageUtils.display(holder.binding.screenshotItemIv, mVideo?.get(position)!!.poster) +// holder.binding.videoCountTv.text = "${mVideo.videoCount}个视频" + /*holder.binding.screenshotItemIv.loadingCallback = object : WrapContentDraweeView.LoadingCallback { override fun loaded() { holder.binding.screenshotItemIv.post { holder.binding.screenshotItemIv.layoutParams.apply { @@ -86,28 +86,31 @@ class GameGalleryAdapter(var context: Context, holder.itemView.requestLayout() } } - } + }*/ + holder.binding.videoTitleTv.text= mVideo[position].title holder.binding.screenshotItemIv.setOnClickListener { -// DirectUtils.directToVideoDetail(holder.binding.root.context, mVideo.videoId, mVideo.videoId, path = "游戏详情-介绍视频") - DirectUtils.directToVideoDetail(holder.binding.root.context, mVideo.videoId, VideoDetailContainerViewModel.Location.VIDEO_HOT.value, path = "游戏详情-介绍视频") + // DirectUtils.directToVideoDetail(holder.binding.root.context, mVideo.videoId, mVideo.videoId, path = "游戏详情-介绍视频") + DirectUtils.directToVideoDetail(holder.binding.root.context, mVideo[position].videoId, VideoDetailContainerViewModel.Location.VIDEO_HOT.value, path = "游戏详情-介绍视频") } } } } override fun getItemCount(): Int { - return mGallery.size + getVideoCount() - } - - override fun getItemViewType(position: Int): Int { - return if (position == 0 && mVideo != null) { - VIDEO - } else { - IMAGE + return when { + mVideo != null -> mVideo.size + mGallery != null -> mGallery.size + else -> 0 } } - private fun getVideoCount() = if (mVideo == null) 0 else 1 + override fun getItemViewType(position: Int): Int { + return when { + mVideo != null -> VIDEO + mGallery != null -> IMAGE + else -> 0 + } + } class GameGalleryViewHolder(itemView: View) : BaseRecyclerViewHolder(itemView) { @BindView(R.id.screenshot_item_iv) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameLatestServiceAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameLatestServiceAdapter.kt new file mode 100644 index 0000000000..fc58585cac --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameLatestServiceAdapter.kt @@ -0,0 +1,27 @@ +package com.gh.gamecenter.gamedetail.desc + +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.ItemGameDetailLatestServiceBinding +import com.gh.gamecenter.entity.ServerCalendarEntity + +class GameLatestServiceAdapter(val context: Context, val datas: MutableList) : RecyclerView.Adapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return GameLatestServiceViewHolder(DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.item_game_detail_latest_service, parent, false)) + } + + override fun getItemCount(): Int = if (datas.size > 10) 10 else datas.size + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is GameLatestServiceViewHolder){ + holder.binding.timeTv.text=datas[position].getFormatTime("MM-dd HH:mm") + holder.binding.serviceNameTv.text=datas[position].getNote() + } + } + + class GameLatestServiceViewHolder(var binding: ItemGameDetailLatestServiceBinding) : RecyclerView.ViewHolder(binding.root) +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/entity/GameDetailEntity.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/entity/GameDetailEntity.kt new file mode 100644 index 0000000000..d32b975221 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/entity/GameDetailEntity.kt @@ -0,0 +1,44 @@ +package com.gh.gamecenter.gamedetail.entity + +import androidx.annotation.Keep +import com.google.gson.annotations.SerializedName + +@Keep +data class GameDetailEntity( + @SerializedName("show_comment") + var showComment: Boolean = false,//游戏评论开关 + @SerializedName("direct_comment") + var directComment: Boolean = false,//安装游戏才能评论 + var star: Float = 0f, + @SerializedName("share_code") + var shareCode: String = "",// 分享码 + var ranking: Ranking? = null,// 游戏榜单排名,无排名时,字段不存在 + @SerializedName("detail_tab") + var detailEntity: ArrayList = ArrayList() +) + +@Keep +data class Ranking( + @SerializedName("column_id") + var column_id: String = "",//专题id + @SerializedName("column_name") + var columnName: String = "",// 专题标题 + var no: String = ""// 排名名次 +) + +@Keep +data class DetailEntity( + var type: String = "", + var noticeEntity: NoticeEntity? = null +) + +//公告文章 +@Keep +data class NoticeEntity( + @SerializedName("_id") + var id: String = "", + var title: String = "", + var type: String = "", + var time: String = "", + var overtime: String = "" +) diff --git a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java index bec64fadeb..f94d7638a1 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java +++ b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java @@ -2,29 +2,18 @@ package com.gh.gamecenter.personal; import android.annotation.SuppressLint; import android.content.Intent; -import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; -import android.preference.PreferenceManager; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; +import android.view.ViewStub; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.widget.Toolbar; -import androidx.core.content.ContextCompat; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProviders; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; - import com.facebook.drawee.view.SimpleDraweeView; -import com.gh.base.fragment.BaseFragment; +import com.gh.base.fragment.BaseLazyFragment; import com.gh.common.databind.BindingAdapters; import com.gh.common.notifier.Notifier; import com.gh.common.util.CheckLoginUtils; @@ -86,7 +75,16 @@ import java.util.ArrayList; import java.util.Locale; import java.util.concurrent.TimeUnit; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.Toolbar; +import androidx.core.content.ContextCompat; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProviders; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import butterknife.BindView; +import butterknife.ButterKnife; import butterknife.OnClick; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; @@ -97,7 +95,8 @@ import retrofit2.HttpException; import static com.gh.gamecenter.fragment.MainWrapperFragment.INDEX_PERSONAL; -public class PersonalFragment extends BaseFragment implements Observer> { +// TODO 转成 kotlin,处理红点相关逻辑,优化列表刷新方式 +public class PersonalFragment extends BaseLazyFragment implements Observer> { @BindView(R.id.list_refresh) SwipeRefreshLayout mListRefresh; @@ -138,13 +137,12 @@ public class PersonalFragment extends BaseFragment implements Observer { + int absOffset = Math.abs(verticalOffset); + int invisibleOffset = DisplayUtils.dip2px(40F); + if (absOffset <= invisibleOffset) { + mUserIconSmall.setVisibility(View.GONE); + mPersonalUserNameSmall.setVisibility(View.GONE); + } else { + mUserIconSmall.setVisibility(View.VISIBLE); + mPersonalUserNameSmall.setVisibility(View.VISIBLE); + } + mListRefresh.setEnabled(absOffset <= 2); + }); + mListRefresh.setColorSchemeColors(ContextCompat.getColor(requireContext(), R.color.theme)); + mListRefresh.setProgressViewOffset(false, 0, DisplayUtils.dip2px(80) + DisplayUtils.getStatusBarHeight(requireContext().getResources())); + mListRefresh.setOnRefreshListener(() -> { + mPersonalViewModel.getHaloAddons(); + if (CheckLoginUtils.isLogin()) { + mUnreadViewModel.retry(); + MessageUnreadRepository.INSTANCE.loadMessageUnreadTotal(); + mUserHomeViewModel.getBadgeList(); + mUserHomeViewModel.availableBadges(); + } + mBaseHandler.postDelayed(() -> { + mListRefresh.setRefreshing(false); + }, 2000); + MtaHelper.onEvent("我的光环_新", "下拉刷新", "下拉刷新"); + }); + } + + private void observeChanges() { mUserViewModel.getLoginObsUserinfo().observe(this, this); - mUserHomeViewModel = ViewModelProviders.of(this, new UserHomeViewModel.Factory(HaloApp.getInstance().getApplication(), - UserManager.getInstance().getUserId())).get(UserHomeViewModel.class); mUserHomeViewModel.getBadges().observe(this, badgeEntities -> { if (badgeEntities.isEmpty()) { mPersonalBadgeTv.setText("领取徽章"); @@ -201,7 +259,6 @@ public class PersonalFragment extends BaseFragment implements Observer mPersonalBadgeTips.setVisibility(count > 0 ? View.VISIBLE : View.GONE)); - mPersonalViewModel = ViewModelProviders.of(this).get(PersonalViewModel.class); mPersonalViewModel.getHaloAddData().observe(this, datas -> { if (!datas.isEmpty()) { mPersonalFuncGroupAdapter.setListData(datas); @@ -211,8 +268,6 @@ public class PersonalFragment extends BaseFragment implements Observer { if (messageUnread != null && messageUnread.getTotal() > 0) { @@ -256,45 +311,9 @@ public class PersonalFragment extends BaseFragment implements Observer { - int absOffset = Math.abs(verticalOffset); - int invisibleOffset = DisplayUtils.dip2px(40F); - if (absOffset <= invisibleOffset) { - mUserIconSmall.setVisibility(View.GONE); - mPersonalUserNameSmall.setVisibility(View.GONE); - } else { - mUserIconSmall.setVisibility(View.VISIBLE); - mPersonalUserNameSmall.setVisibility(View.VISIBLE); - } - mListRefresh.setEnabled(absOffset <= 2); - }); - mListRefresh.setColorSchemeColors(ContextCompat.getColor(requireContext(), R.color.theme)); - mListRefresh.setProgressViewOffset(false, 0, DisplayUtils.dip2px(80) + DisplayUtils.getStatusBarHeight(requireContext().getResources())); - mListRefresh.setOnRefreshListener(() -> { - mPersonalViewModel.getHaloAddons(); - if (CheckLoginUtils.isLogin()) { - mUnreadViewModel.retry(); - MessageUnreadRepository.INSTANCE.loadMessageUnreadTotal(); - mUserHomeViewModel.getBadgeList(); - mUserHomeViewModel.availableBadges(); - } - mBaseHandler.postDelayed(() -> { - mListRefresh.setRefreshing(false); - }, 2000); - MtaHelper.onEvent("我的光环_新", "下拉刷新", "下拉刷新"); - }); - } - - @Override - public void onResume() { - super.onResume(); if (NetworkUtils.isNetworkConnected(requireContext())) { mUnreadViewModel.retry(); mUserHomeViewModel.getBadgeList(); @@ -465,7 +484,6 @@ public class PersonalFragment extends BaseFragment implements Observer 24 * 60 * 60 * 1000) { - return true; - } - return false; + return lastSignDay != curDay || curTime - lastSignTime > 24 * 60 * 60 * 1000; } - private String getSignSkipText(String text) { return TextUtils.isEmpty(text) ? "去首页看看" : text; } @@ -551,7 +565,6 @@ public class PersonalFragment extends BaseFragment implements Observer userInfoEntity) { UserInfoEntity notifyUserInfo; @@ -583,7 +596,7 @@ public class PersonalFragment extends BaseFragment implements Observer>, LoginHelper.LoginCallback { - - @BindView(R.id.scroll_view) - ScrollView mScrollView; - @BindView(R.id.personal_login_qq) - View mLoginQq; - @BindView(R.id.personal_login_wechat) - View mLoginWechat; - @BindView(R.id.personal_login_weibo) - View mLoginWeibo; - @BindView(R.id.personal_user_icon) - SimpleDraweeView mUserIcon; - @BindView(R.id.personal_user_name) - TextView mUserName; - @BindView(R.id.login_qq_icon) - ImageView mLoginQqIcon; - @BindView(R.id.login_qq_tv) - TextView mLoginQqTv; - @BindView(R.id.login_wechat_icon) - ImageView mLoginWechatIcon; - @BindView(R.id.login_wechat_tv) - TextView mLoginWechatTv; - @BindView(R.id.login_weibo_icon) - ImageView mLoginWeiboIcon; - @BindView(R.id.login_weibo_tv) - TextView mLoginWeiboTv; - @BindView(R.id.personal_game) - View mPersonalGame; - @BindView(R.id.personal_share) - View mPersonalShare; - @BindView(R.id.personal_suggestion) - View mPersonalSuggestion; - @BindView(R.id.personal_setting_update_hint) - TextView mPersonalSettingUpdateHint; - @BindView(R.id.personal_setting) - View mPersonalSetting; - @BindView(R.id.login_message_hint) - TextView mLoginMessageHint; // 亦即登录后按钮 - @BindView(R.id.user_icon_hint) - View mIconHint; - @BindView(R.id.personal_ask) - View mPersonalAsk; - @BindView(R.id.personal_home_fans_hint) - TextView mFansHint; - @BindView(R.id.personal_user_badge) - SimpleDraweeView mUserBadge; - - public final static String LOGIN_TAG = "login_tag"; //登入标识 - public final static String LOGOUT_TAG = "logout_tag"; // 登出标识 - public final static String MESSAGE_UNREAD_TAG = "message_unread_tag"; - public final static String MESSAGE_READ_OVER = "MESSAGE_READ_OVER"; - public static final int REQUEST_MESSAGE = 199; - - private UserInfoEntity mUserInfoEntity; - - private WaitingDialogFragment mLoginDialog; - - private SharedPreferences sp; - private AppDatabase mDatabase; - - private UserViewModel mUserViewModel; - private MessageUnreadViewModel mUnreadViewModel; - - private boolean mIsLogging = false; - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == Constants.REQUEST_LOGIN) { // QQ Login callback - LoginHelper.onQQLoginCallback(requestCode, resultCode, data); - } else if (requestCode == 32973) {// 32973 WeiBo requestCode - LoginHelper.onWeiboLoginCallback(requestCode, resultCode, data); - } else if (requestCode == REQUEST_MESSAGE) { - if (mUnreadViewModel != null) mUnreadViewModel.retry(); - } - } - - @Override - protected int getLayoutId() { - return R.layout.fragment_personal_copy; - } - - @SuppressLint("CheckResult") - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - sp = PreferenceManager.getDefaultSharedPreferences(getContext()); - mDatabase = AppDatabase.getInstance(getContext()); - - checkUpdate(); - - final UserViewModel.Factory factory = new UserViewModel.Factory(getActivity().getApplication()); - mUserViewModel = ViewModelProviders.of(this, factory).get(UserViewModel.class); - mUserViewModel.getLoginObsUserinfo().observe(this, this); - - mUnreadViewModel = ViewModelProviders.of(this, - new MessageUnreadViewModel.Factory(HaloApp.getInstance().getApplication())).get(MessageUnreadViewModel.class); - mUnreadViewModel.getLiveData().observe(this - , messageUnread -> { - if (messageUnread != null && messageUnread.getTotal() > 0) { - mFansHint.setVisibility(messageUnread.getFans() > 0 ? View.VISIBLE : View.GONE); - mFansHint.setText((messageUnread.getFans() + "个新粉丝")); - int count = messageUnread.getTotal() - messageUnread.getFans(); - mLoginMessageHint.setVisibility(count > 0 ? View.VISIBLE : View.GONE); - BindingAdapters.setMessageUnread(mLoginMessageHint, count); - - // 第一次开启应用时检查消息中心看有没有未读消息确定需不需要弹 Notifier 通知 - if (mUnreadViewModel.isFirstTimeInit()) { - mUnreadViewModel.flagFirstTimeInit(false); - - if (messageUnread.getMeta() != null && messageUnread.getMeta().getUser() != null) { - if (messageUnread.getMeta() != null) { - String displayText = StringUtils.shrinkStringWithDot(messageUnread.getMeta().getUser().getName(), 8); - String suffixText; - if ("follow_question".equals(messageUnread.getMeta().getType())) { - suffixText = "回答了你关注的问题"; - } else { - suffixText = "回答了你的问题"; - } - displayText += suffixText; - - String content = messageUnread.getMeta().getAnswerId() + displayText; - - if (Notifier.shouldShowNotifier(content)) { - Notifier.create(getActivity()) - .setText(displayText) - .setDuration(5000) - .setIcon(messageUnread.getMeta().getUser().getIcon()) - .setOnClickListener(view -> { - Bundle bundle = new Bundle(); - bundle.putString(EntranceUtils.KEY_ANSWER_ID, messageUnread.getMeta().getAnswerId()); - bundle.putString(EntranceUtils.KEY_ENTRANCE, EntranceUtils.ENTRANCE_UMENG); - bundle.putString(EntranceUtils.KEY_TO, AnswerDetailActivity.class.getName()); - EntranceUtils.jumpActivity(getActivity(), bundle); - - MtaHelper.onEvent("消息弹窗", suffixText, "Does not contains any parameter."); - - // 标记已读 - JSONObject jsonObject = new JSONObject(); - try { - jsonObject.put("type", messageUnread.getMeta().getType()); - RequestBody body = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString()); - RetrofitManager.getInstance(requireContext()).getApi() - .postMessageRead(UserManager.getInstance().getUserId(), messageUnread.getMeta().getMessageId(), body) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Response() { - @Override - public void onResponse(@Nullable ResponseBody response) { - super.onResponse(response); - MessageUnreadRepository.INSTANCE.loadMessageUnreadData(); - } - }); - } catch (Exception e) { - e.printStackTrace(); - } - - Notifier.hide(); - }) - .show(true, 500L); - Notifier.tagNotifierAsShowed(content); - } - } - } - } - EventBus.getDefault().post(new EBReuse(MESSAGE_UNREAD_TAG)); - } else { - mLoginMessageHint.setVisibility(View.GONE); - mFansHint.setVisibility(View.GONE); - EventBus.getDefault().post(new EBReuse(MESSAGE_READ_OVER)); - } - }); - - // 微信/签到 - RxView.clicks(mLoginWechat) - .throttleFirst(1, TimeUnit.SECONDS) - .subscribe(aVoid -> { - if (mUserInfoEntity != null) { - MtaHelper.onEvent("我的光环", "签到"); - sign(); - } else { - MtaHelper.onEvent("我的光环", "微信登录"); - LoginHelper.loginWithWechat(this); - } - }); - } - - // 连接上网络事件 - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(EBNetworkState busNetworkState) { - if (busNetworkState.isNetworkConnected() - && mUserViewModel.isLogin() - && (mUserInfoEntity == null || TextUtils.isEmpty(UserManager.getInstance().getToken()))) { - mUserViewModel.retryCheckLogin(); - } - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(EBReuse reuse) { - if (MESSAGE_READ_OVER.equals(reuse.getType())) { // 消息阅读完成 - if (mLoginMessageHint != null) { - mLoginMessageHint.setVisibility(View.GONE); - } - } - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(EBUISwitch busNine) { - if (MainWrapperFragment.EB_MAIN_SCROLL_TOP.equals(busNine.getFrom()) - && MainWrapperFragment.INDEX_PERSONAL == busNine.getPosition()) { - mScrollView.fullScroll(ScrollView.FOCUS_UP); - } - } - - @OnClick({ - R.id.personal_login_qq, R.id.personal_login_weibo, R.id.personal_user_icon, - R.id.personal_history, R.id.personal_user_name, R.id.personal_game, R.id.personal_share, - R.id.personal_suggestion, R.id.personal_setting, R.id.personal_ask, R.id.personal_home, - R.id.personal_draft, R.id.personal_video_manager, R.id.personal_bind_wechat}) - public void onViewClicked(View view) { - switch (view.getId()) { - case R.id.personal_login_qq: - if (mUserInfoEntity != null) { - MtaHelper.onEvent("我的光环", "收藏"); - startActivity(CollectionActivity.getCollectionActivity(getContext(), "(我的光环)")); - } else { - MtaHelper.onEvent("我的光环", "QQ登录"); - LoginHelper.loginWithQQ(this, requireActivity()); - } - break; - case R.id.personal_login_weibo: - if (mUserInfoEntity != null) { - MtaHelper.onEvent("我的光环", "消息"); - startActivityForResult(MessageActivity.getIntent(getContext(), "(我的光环)+(消息中心)"), REQUEST_MESSAGE); - } else { - MtaHelper.onEvent("我的光环", "微博登录"); - LoginHelper.loginWithWeibo(this, requireActivity()); - } - break; - case R.id.personal_user_icon: - case R.id.personal_user_name: - if (mIconHint.getVisibility() == View.VISIBLE) { - LoginTokenEntity loginToken = UserManager.getInstance().getLoginTokenEntity(); - mIconHint.setVisibility(View.GONE); - if (loginToken != null && loginToken.getId() != null) - sp.edit().putBoolean(loginToken.getId(), false).apply(); - } - - if (mUserInfoEntity != null) { - MtaHelper.onEvent("我的光环", "个人中心"); - startActivity(UserInfoActivity.getIntent(getContext())); - } else { - MtaHelper.onEvent("我的光环", "手机登录"); - CheckLoginUtils.checkLogin(getContext(), "我的光环-手机登录", null); - } - break; - case R.id.personal_game: - if (mUserInfoEntity != null) { - MtaHelper.onEvent("我的光环", "我的游戏"); - startActivity(new Intent(getContext(), MyGameActivity.class)); - } else { - toast("请先登录"); - MtaHelper.onEvent("我的光环", "我的游戏"); - CheckLoginUtils.checkLogin(getContext(), "我的光环-我的游戏", null); - } - break; - case R.id.personal_share: - MtaHelper.onEvent("我的光环", "分享"); - startActivity(ShareGhActivity.getIntent(getContext())); - break; - case R.id.personal_suggestion: - MtaHelper.onEvent("我的光环", "反馈"); - startActivity(HelpAndFeedbackActivity.getIntent(getActivity())); - break; - case R.id.personal_bind_wechat: - MtaHelper.onEvent("我的光环", "设置微信提醒"); - startActivity(WebActivity.getBindWechatIntent(requireContext())); - break; - case R.id.personal_setting: - MtaHelper.onEvent("我的光环", "设置图标"); - DataCollectionUtils.uploadClick(getActivity(), "设置图标", "我的光环"); - startActivity(SettingActivity.getIntent(getContext(), - mPersonalSettingUpdateHint.getVisibility() == View.VISIBLE, "(我的光环)")); - break; - case R.id.personal_ask: - MtaHelper.onEvent("我的光环", "我的问答"); - CheckLoginUtils.checkLogin(getContext(), "我的光环-我的问答", () -> startActivity(MyAskActivity.getIntent(getContext()))); - break; - case R.id.personal_home: - CheckLoginUtils.checkLogin(getContext(), "我的光环-个人主页", () -> { - DirectUtils.directToHomeActivity(getContext(), UserManager.getInstance().getUserId(), "", "我的光环"); - }); - MtaHelper.onEvent("我的光环", "个人主页"); - break; - case R.id.personal_draft: - CheckLoginUtils.checkLogin(getContext(), "我的光环-我的草稿", () -> { - startActivity(CommunityDraftWrapperActivity.getIntent(getContext())); - }); - MtaHelper.onEvent("我的光环", "我的草稿"); - break; - case R.id.personal_history: - startActivity(HistoryActivity.getHistoryIntent(getContext(), "我的光环-浏览记录")); - MtaHelper.onEvent("我的光环", "浏览记录"); - break; - case R.id.personal_video_manager: - CheckLoginUtils.checkLogin(getContext(), "我的光环-视频投稿", () -> { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) { - startActivity(VideoManagerActivity.getIntent(getContext(), "", "我的光环-视频投稿")); - } else { - DialogUtils.showAlertDialog(getContext(), "提示", - "抱歉,您当前系统版本过低,暂不支持视频功能", "我知道了", - null, null, null); - } - }); - MtaHelper.onEvent("我的光环", "视频投稿"); - break; - } - } - - private boolean isCanSign(long time) { - SimpleDateFormat formatDay = new SimpleDateFormat("dd", Locale.CHINA); - - long lastSignTime = time * 1000; - long curTime = Utils.getTime(getContext()) * 1000; - int lastSignDay = Integer.parseInt(formatDay.format(lastSignTime)); - int curDay = Integer.parseInt(formatDay.format(curTime)); - if (lastSignDay != curDay || curTime - lastSignTime > 24 * 60 * 60 * 1000) { - return true; - } - return false; - } - - private void sign() { - RetrofitManager.getInstance(getContext()).getApi() - .postSign(UserManager.getInstance().getUserId()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Response() { - @Override - public void onResponse(SignEntity signEntity) { - mLoginWechatTv.setText("已签到"); - if (isCanSign(signEntity.getLastTime())) { - DialogUtils.showSignDialog(getContext(), "签到成功,获得经验:1" - , getString(R.string.sign_dialog_content, signEntity.getSerialSign()) - , getString(R.string.sign_dialog_content2, signEntity.getExperience()) - , getSignSkipText(signEntity.getTitle()), () -> { - signSkip(signEntity); - } - ); - signEntity.setLastTime(System.currentTimeMillis() / 1000); - } else { - DialogUtils.showSignDialog(getContext(), "今天已签到,明天再来吧~" - , getString(R.string.sign_dialog_content, signEntity.getSerialSign()) - , getString(R.string.sign_dialog_content2, signEntity.getExperience()) - , getSignSkipText(signEntity.getTitle()), () -> { - signSkip(signEntity); - } - ); - } - - signEntity.setId(UserManager.getInstance().getUserId()); - if (mDatabase.signDao().updateSignEntity(signEntity) <= 0) { - mDatabase.signDao().addSignEntity(signEntity); - } - } - - @Override - public void onFailure(HttpException e) { - if (e == null || e.code() != 401) { - toast(R.string.loading_network_error); - } - } - }); - - } - - private String getSignSkipText(String text) { - return TextUtils.isEmpty(text) ? "去首页看看" : text; - } - - private void signSkip(SignEntity signEntity) { - SignEntity.Data data = signEntity.getData(); - String entrance = "(我的光环)+(签到)"; - if (data == null || TextUtils.isEmpty(data.getType())) { - EventBus.getDefault().post(new EBSkip(MainActivity.EB_SKIP_MAIN, MainWrapperFragment.INDEX_HOME)); - return; - } - switch (data.getType()) { - case "game": - DataUtils.onMtaEvent(getActivity(), "我的光环_签到跳转", "游戏", signEntity.getTitle()); - GameDetailActivity.startGameDetailActivity(getContext(), data.getLink(), entrance); - break; - case "news": - DataUtils.onMtaEvent(getActivity(), "我的光环_签到跳转", "文章", signEntity.getTitle()); - startActivity(NewsDetailActivity.getIntentById(getContext(), data.getLink(), entrance)); - break; - case "column": - DataUtils.onMtaEvent(getActivity(), "我的光环_签到跳转", "专题", signEntity.getTitle()); - SubjectActivity.startSubjectActivity(getContext(), data.getLink(), null, false, entrance); - break; - } - } - - - private void changeLoginState(boolean isLogin) { - if (isLogin) { - SignEntity signEntity = mDatabase.signDao().getSignEntityById(UserManager.getInstance().getUserId()); - if (signEntity != null && !isCanSign(signEntity.getLastTime())) { - mLoginWechatTv.setText("已签到"); - } else { - mLoginWechatTv.setText("签到"); - } - if (mUserInfoEntity != null) { - ImageUtils.displayIcon(mUserIcon, mUserInfoEntity.getIcon()); - mUserName.setText(mUserInfoEntity.getName()); - if (mUserInfoEntity.getAuth() != null) { - mUserBadge.setVisibility(View.VISIBLE); - ImageUtils.display(mUserBadge, mUserInfoEntity.getAuth().getIcon()); - } - } - mLoginQqIcon.setImageResource(R.drawable.personal_collection_icon); - mLoginQqTv.setText("收藏"); - mLoginWechatIcon.setImageResource(R.drawable.personal_sign_icon); - mLoginWeiboIcon.setImageResource(R.drawable.personal_message_icon); - mLoginWeiboTv.setText("消息"); - } else { - mUserBadge.setVisibility(View.GONE); - mIconHint.setVisibility(View.GONE); - mLoginQqIcon.setImageResource(R.drawable.qq_login_icon); - mLoginQqTv.setText(getString(R.string.QQ)); - mLoginWechatIcon.setImageResource(R.drawable.wechat_login_icon); - mLoginWechatTv.setText(getString(R.string.wechat)); - mLoginWeiboIcon.setImageResource(R.drawable.weibo_login_icon); - mLoginWeiboTv.setText(getString(R.string.sina_weibo)); - mUserIcon.setImageURI(""); - mUserName.setText("手机登录"); - if (mLoginMessageHint.getVisibility() == View.VISIBLE) { - mLoginMessageHint.setVisibility(View.GONE); - EventBus.getDefault().post(new EBReuse(MESSAGE_READ_OVER)); - } - } - } - - private void checkUpdate() { - String channel = HaloApp.getInstance().getChannel(); - RetrofitManager.getInstance(getContext()) - .getApi() - .getUpdate(PackageUtils.getVersionName(), PackageUtils.getVersionCode(), channel) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Response() { - @Override - public void onResponse(AppEntity response) { - super.onResponse(response); - if (response.getVersionCode() > PackageUtils.getVersionCode()) { - mPersonalSettingUpdateHint.setVisibility(View.VISIBLE); - } else { - mPersonalSettingUpdateHint.setVisibility(View.GONE); - } - } - }); - } - - @Override - public void onLoginSuccess(@NotNull LoginTag loginType, @NotNull JSONObject jsonContent) { - if (CommonDebug.IS_DEBUG) { - Utils.log("Login Output=>获取第三方登录信息成功" + jsonContent.toString() + "" + loginType.name()); - } - if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) { - mLoginDialog = WaitingDialogFragment.newInstance(getString(R.string.logging)); - mLoginDialog.show(getChildFragmentManager(), null); - } - - mIsLogging = true; - mUserViewModel.login(jsonContent, loginType); - LogUtils.login("logging", loginType.name(), getLoginEntranceByType(loginType.name())); - } - - @Override - public void onLoginFailure(@NotNull LoginTag loginType, @NotNull String error) { - toast(error); - } - - @Override - public void onChanged(@Nullable ApiResponse userInfoEntity) { - UserInfoEntity notifyUserInfo; - if (userInfoEntity != null) { - notifyUserInfo = userInfoEntity.getData(); - } else { - notifyUserInfo = null; - } - - if (notifyUserInfo != null && mUserInfoEntity == null) { // 单个用户,首次触发 - mUnreadViewModel.retry(); // 检查是否有未读消息 - EventBus.getDefault().post(new EBConcernChanged()); - /** - * default_icon_ 判断是不是默认头像 - * 具体默认头像链接请看: - * {@link com.gh.common.util.UserIconUtils#getUserIconUrl(int)} - */ - LoginTokenEntity loginToken = UserManager.getInstance().getLoginTokenEntity(); - if (loginToken != null && loginToken.getId() != null && - sp.getBoolean(loginToken.getId(), true) && - notifyUserInfo.getIcon() != null && - notifyUserInfo.getIcon().contains("default_icon_")) { - mIconHint.setVisibility(View.VISIBLE); - } - - LoginTokenEntity loginTokenEntity = UserManager.getInstance().getLoginTokenEntity(); - if (mIsLogging && loginTokenEntity != null) { - String loginType = loginTokenEntity.getLoginType(); - LogUtils.login("success", loginType, getLoginEntranceByType(loginType)); - mIsLogging = false; - } - } - - mUserInfoEntity = notifyUserInfo; - if (notifyUserInfo == null) { - mUnreadViewModel.clean(); - changeLoginState(false); - EventBus.getDefault().post(new EBConcernChanged()); - } else { - changeLoginState(true); - } - - if (mLoginDialog != null) { - mLoginDialog.dismissAllowingStateLoss(); - } - } - - public static String getLoginEntranceByType(String loginTag) { - String entrance = ""; - switch (loginTag) { - case "qq": - entrance = "我的光环-QQ"; - break; - case "wechat": - entrance = "我的光环-微信"; - break; - case "weibo": - entrance = "我的光环-新浪微博"; - break; - } - return entrance; - } -} diff --git a/app/src/main/java/com/gh/gamecenter/qa/CommunityFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/CommunityFragment.kt index 328d5a4d05..954b4e465a 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/CommunityFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/CommunityFragment.kt @@ -18,7 +18,7 @@ import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders import butterknife.OnClick import com.facebook.drawee.view.SimpleDraweeView -import com.gh.base.fragment.BaseFragment_TabLayout +import com.gh.base.fragment.BaseLazyTabFragment import com.gh.common.dialog.TrackableDialog import com.gh.common.util.* import com.gh.gamecenter.R @@ -45,7 +45,7 @@ import kotterknife.bindView import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode -class CommunityFragment : BaseFragment_TabLayout() { +class CommunityFragment : BaseLazyTabFragment() { private val mAskSelectCommunity by bindView(R.id.community_icon) private val mNoConn by bindView(R.id.reuse_no_connection) @@ -58,10 +58,10 @@ class CommunityFragment : BaseFragment_TabLayout() { private lateinit var mFollowHint: View - private val mAskFollowFragment = AskFollowFragment() - private val mRecommendsFragment = AskRecommendWrapperFragment() - private val mColumnFragment = AskColumnFragment() - private val mAskAllFragment = AskAllFragment() + private var mAskFollowFragment: AskFollowFragment? = null + private var mRecommendsFragment: AskRecommendWrapperFragment? = null + private var mColumnFragment: AskColumnFragment? = null + private var mAskAllFragment: AskAllFragment? = null private lateinit var mColumnViewModel: AskColumnViewModel private lateinit var mViewModel: CommunityViewModel @@ -72,10 +72,10 @@ class CommunityFragment : BaseFragment_TabLayout() { private var mCommunitiesSelectFragment: CommunitiesSelectWrapperFragment? = null override fun initFragmentList(fragments: MutableList) { - fragments.add(mAskFollowFragment) - fragments.add(mRecommendsFragment) - fragments.add(mColumnFragment) - fragments.add(mAskAllFragment) + fragments.add(AskFollowFragment().also { mAskFollowFragment = it }) + fragments.add(AskRecommendWrapperFragment().also { mRecommendsFragment = it }) + fragments.add(AskColumnFragment().also { mColumnFragment = it }) + fragments.add(AskAllFragment().also { mAskAllFragment = it }) } override fun initTabTitleList(tabTitleList: MutableList) { @@ -105,15 +105,8 @@ class CommunityFragment : BaseFragment_TabLayout() { } } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - sp = PreferenceManager.getDefaultSharedPreferences(context) - mHasClickedSelectGame = sp.getBoolean(SP_KEY_CLICKED_SELECT_GAME, false) - - val factory = AskColumnViewModel.Factory(HaloApp.getInstance().application) - mColumnViewModel = ViewModelProviders.of(this, factory).get(AskColumnViewModel::class.java) - - mViewModel = ViewModelProviders.of(this).get(CommunityViewModel::class.java) + override fun onFragmentFirstVisible() { + super.onFragmentFirstVisible() if (UserManager.getInstance().isLoggedIn) { mViewModel.checkUnreadFollowTimeline() @@ -179,11 +172,11 @@ class CommunityFragment : BaseFragment_TabLayout() { mTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { - if (tab.position == INDEX_FOLLOW && mAskFollowFragment.isVisible) { + if (tab.position == INDEX_FOLLOW && mAskFollowFragment?.isVisible == true) { // 关注 tab 存在未读红点,刷新一下 - val isRefreshing = mAskFollowFragment.load() + val isRefreshing = mAskFollowFragment?.load() ?: false if (mFollowHint.visibility == View.VISIBLE && !isRefreshing) { - mAskFollowFragment.onRefresh() + mAskFollowFragment?.onRefresh() } } @@ -195,10 +188,10 @@ class CommunityFragment : BaseFragment_TabLayout() { override fun onTabReselected(tab: TabLayout.Tab) { when (tab.position) { - INDEX_FOLLOW -> mAskFollowFragment.scrollToTop(true) - INDEX_RECOMMEND -> mRecommendsFragment.scrollToTop(true) - INDEX_COLUMN -> mColumnFragment.scrollToTop(true) - INDEX_ALL -> mAskAllFragment.scrollToTop(true) + INDEX_FOLLOW -> mAskFollowFragment?.scrollToTop(true) + INDEX_RECOMMEND -> mRecommendsFragment?.scrollToTop(true) + INDEX_COLUMN -> mColumnFragment?.scrollToTop(true) + INDEX_ALL -> mAskAllFragment?.scrollToTop(true) } } }) @@ -206,6 +199,17 @@ class CommunityFragment : BaseFragment_TabLayout() { mViewPager.setScrollable(false) } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + sp = PreferenceManager.getDefaultSharedPreferences(context) + mHasClickedSelectGame = sp.getBoolean(SP_KEY_CLICKED_SELECT_GAME, false) + + val factory = AskColumnViewModel.Factory(HaloApp.getInstance().application) + mColumnViewModel = ViewModelProviders.of(this, factory).get(AskColumnViewModel::class.java) + + mViewModel = ViewModelProviders.of(this).get(CommunityViewModel::class.java) + } + override fun onResume() { super.onResume() if (!TextUtils.isEmpty(UserManager.getInstance().community.id)) { @@ -297,11 +301,11 @@ class CommunityFragment : BaseFragment_TabLayout() { } PersonalFragment.LOGIN_TAG -> { - mAskFollowFragment.onRefresh() + mAskFollowFragment?.onRefresh() } PersonalFragment.LOGOUT_TAG -> { - mAskFollowFragment.onRefresh() + mAskFollowFragment?.onRefresh() mFollowHint.visibility = View.GONE } } @@ -323,10 +327,10 @@ class CommunityFragment : BaseFragment_TabLayout() { if (MainWrapperFragment.EB_MAIN_SCROLL_TOP == busNine.from && MainWrapperFragment.INDEX_ASK == busNine.position) { when (mViewPager.currentItem) { - INDEX_FOLLOW -> mAskFollowFragment.scrollToTop(false) - INDEX_RECOMMEND -> mRecommendsFragment.scrollToTop(false) - INDEX_COLUMN -> mColumnFragment.scrollToTop(false) - INDEX_ALL -> mAskAllFragment.scrollToTop(false) + INDEX_FOLLOW -> mAskFollowFragment?.scrollToTop(false) + INDEX_RECOMMEND -> mRecommendsFragment?.scrollToTop(false) + INDEX_COLUMN -> mColumnFragment?.scrollToTop(false) + INDEX_ALL -> mAskAllFragment?.scrollToTop(false) } } } diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java index 0dd162e972..07d657aa65 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java @@ -2302,4 +2302,10 @@ public interface ApiService { */ @GET("games/device_dialogs") Single> deviceDialogs(); + + /** + * 获取游戏详情数据(4.0.0) + */ + @GET("games/{gameId}?view=new_detail") + Single getGameDetailNew(@Path("gameId") String gameId); } \ No newline at end of file diff --git a/app/src/main/java/com/halo/assistant/HaloApp.java b/app/src/main/java/com/halo/assistant/HaloApp.java index 49c1f13e0c..1e5de2a1d5 100644 --- a/app/src/main/java/com/halo/assistant/HaloApp.java +++ b/app/src/main/java/com/halo/assistant/HaloApp.java @@ -141,17 +141,15 @@ public class HaloApp extends TinkerAppLike { //初始化Fresco(BigImageViewer 已包含Fresco) BigImageViewer.initialize(FrescoImageLoader.with(getApplication())); - AppExecutor.getUiExecutor().executeWithDelay(() -> { - initReceiver(); - initLocalBroadcast(); + initReceiver(); + initLocalBroadcast(); - initConnectivityChangesReceiver(); - initPackageChangesReceiver(); + initConnectivityChangesReceiver(); + initPackageChangesReceiver(); - // 注册回调以用于做各种统计 - registerActivityLifecycleCallbacks(new GHActivityLifecycleCallbacksImpl()); - ProcessLifecycleOwner.get().getLifecycle().addObserver(new ProcessorLifeCycleOwner()); - }, 500); + // 注册回调以用于做各种统计 + registerActivityLifecycleCallbacks(new GHActivityLifecycleCallbacksImpl()); + ProcessLifecycleOwner.get().getLifecycle().addObserver(new ProcessorLifeCycleOwner()); // 耗时操作 AppExecutor.getIoExecutor().execute(() -> { diff --git a/app/src/main/res/drawable-xxhdpi/ic_open_service_tips.png b/app/src/main/res/drawable-xxhdpi/ic_open_service_tips.png new file mode 100644 index 0000000000..31608db5e4 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_open_service_tips.png differ diff --git a/app/src/main/res/layout/fragment_personal_copy.xml b/app/src/main/res/layout/fragment_personal_copy.xml deleted file mode 100644 index 07281c2dc6..0000000000 --- a/app/src/main/res/layout/fragment_personal_copy.xml +++ /dev/null @@ -1,539 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_personal_stub.xml b/app/src/main/res/layout/fragment_personal_stub.xml new file mode 100644 index 0000000000..0be2c48211 --- /dev/null +++ b/app/src/main/res/layout/fragment_personal_stub.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/layout/gallery_video_item.xml b/app/src/main/res/layout/gallery_video_item.xml index 368cfc1fff..efccc745db 100644 --- a/app/src/main/res/layout/gallery_video_item.xml +++ b/app/src/main/res/layout/gallery_video_item.xml @@ -3,39 +3,71 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> - + - - - - - + android:layout_height="146dp"> + + + + + + + + + + + + - - + android:layout_marginTop="12dp" + android:textColor="@color/text_333333" + android:textSize="14sp" + android:lineSpacingExtra="4dp" + android:maxLines="2" + android:ellipsize="end"/> + \ No newline at end of file diff --git a/app/src/main/res/layout/game_gallery_list.xml b/app/src/main/res/layout/game_gallery_list.xml new file mode 100644 index 0000000000..58c53eef88 --- /dev/null +++ b/app/src/main/res/layout/game_gallery_list.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/game_latest_service_list.xml b/app/src/main/res/layout/game_latest_service_list.xml new file mode 100644 index 0000000000..48c6dfb7a8 --- /dev/null +++ b/app/src/main/res/layout/game_latest_service_list.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/game_update_content.xml b/app/src/main/res/layout/game_update_content.xml new file mode 100644 index 0000000000..1b12fc6551 --- /dev/null +++ b/app/src/main/res/layout/game_update_content.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/gamedetail_item_image.xml b/app/src/main/res/layout/gamedetail_item_image.xml index c09fd50cf4..719ab1c6a7 100644 --- a/app/src/main/res/layout/gamedetail_item_image.xml +++ b/app/src/main/res/layout/gamedetail_item_image.xml @@ -35,7 +35,7 @@ imageUrl="@{link.image}" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="20dp" + android:layout_marginBottom="16dp" app:placeholderImage="@drawable/occupy" /> diff --git a/app/src/main/res/layout/item_game_detail_latest_service.xml b/app/src/main/res/layout/item_game_detail_latest_service.xml new file mode 100644 index 0000000000..bcb1e133b6 --- /dev/null +++ b/app/src/main/res/layout/item_game_detail_latest_service.xml @@ -0,0 +1,30 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index f7b02d44ec..f4d5040f71 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -101,4 +101,8 @@ + + + + \ No newline at end of file