444 lines
18 KiB
Java
444 lines
18 KiB
Java
package com.gh.gamecenter.fragment;
|
|
|
|
import android.graphics.PorterDuff;
|
|
import android.os.Bundle;
|
|
import android.view.View;
|
|
import android.widget.CheckedTextView;
|
|
import android.widget.ImageView;
|
|
|
|
import com.airbnb.lottie.LottieAnimationView;
|
|
import com.gh.base.OnDoubleTapListener;
|
|
import com.gh.base.fragment.BaseFragment_ViewPager_Checkable;
|
|
import com.gh.common.constant.Config;
|
|
import com.gh.common.util.DataUtils;
|
|
import com.gh.common.util.EntranceUtils;
|
|
import com.gh.common.util.ExtensionsKt;
|
|
import com.gh.download.DownloadManager;
|
|
import com.gh.gamecenter.MainActivity;
|
|
import com.gh.gamecenter.R;
|
|
import com.gh.gamecenter.db.GameTrendsDao;
|
|
import com.gh.gamecenter.db.info.GameTrendsInfo;
|
|
import com.gh.gamecenter.discover.DiscoverFragment;
|
|
import com.gh.gamecenter.entity.ConcernEntity;
|
|
import com.gh.gamecenter.entity.SettingsEntity;
|
|
import com.gh.gamecenter.entity.SubjectRecommendEntity;
|
|
import com.gh.gamecenter.eventbus.EBConcernChanged;
|
|
import com.gh.gamecenter.eventbus.EBReuse;
|
|
import com.gh.gamecenter.eventbus.EBSkip;
|
|
import com.gh.gamecenter.eventbus.EBUISwitch;
|
|
import com.gh.gamecenter.game.GameFragment;
|
|
import com.gh.gamecenter.home.HomeFragment;
|
|
import com.gh.gamecenter.manager.UserManager;
|
|
import com.gh.gamecenter.personal.PersonalFragment;
|
|
import com.gh.gamecenter.qa.CommunityFragment;
|
|
import com.gh.gamecenter.video.detail.VideoDetailContainerFragment;
|
|
import com.gh.gamecenter.video.detail.VideoDetailContainerViewModel;
|
|
import com.lightgame.listeners.OnBackPressedListener;
|
|
import com.lightgame.view.CheckableImageView;
|
|
import com.lightgame.view.CheckableLinearLayout;
|
|
import com.lightgame.view.NoScrollableViewPager;
|
|
import com.squareup.picasso.Picasso;
|
|
|
|
import org.greenrobot.eventbus.EventBus;
|
|
import org.greenrobot.eventbus.Subscribe;
|
|
import org.greenrobot.eventbus.ThreadMode;
|
|
|
|
import java.util.List;
|
|
|
|
import androidx.annotation.ColorRes;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.core.content.ContextCompat;
|
|
import androidx.fragment.app.Fragment;
|
|
import androidx.fragment.app.FragmentManager;
|
|
import androidx.lifecycle.ViewModelProviders;
|
|
import butterknife.BindView;
|
|
|
|
import static com.gh.gamecenter.MainActivity.EB_SKIP_MAIN;
|
|
|
|
/**
|
|
* @author CsHeng
|
|
* @Date 05/05/2017
|
|
* @Time 3:26 PM
|
|
*/
|
|
|
|
public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implements OnBackPressedListener {
|
|
|
|
@BindView(R.id.main_tab_game)
|
|
View mMainTab;
|
|
@BindView(R.id.main_iv_message_hint)
|
|
View mMessageHintIv;
|
|
@BindView(R.id.main_tab_community)
|
|
View mTabCommunity;
|
|
@BindView(R.id.main_tab_game_icon)
|
|
CheckableImageView mTabGameIcon;
|
|
@BindView(R.id.lottieHome)
|
|
LottieAnimationView mLottieHome;
|
|
@BindView(R.id.lottieGame)
|
|
LottieAnimationView mLottieGame;
|
|
@BindView(R.id.lottieVideo)
|
|
LottieAnimationView mLottieVideo;
|
|
@BindView(R.id.lottieCommunity)
|
|
LottieAnimationView mLottieCommunity;
|
|
@BindView(R.id.lottieMine)
|
|
LottieAnimationView mLottieMine;
|
|
|
|
// @BindView(R.id.iv_discovery_hint_dot)
|
|
// protected View mDiscoveryHintIv;
|
|
|
|
public static final int INDEX_HOME = 0;
|
|
public static final int INDEX_GAME = 1;
|
|
public static final int INDEX_VIDEO = 2;
|
|
public static final int INDEX_ASK = 3;
|
|
public static final int INDEX_PERSONAL = 4;
|
|
|
|
public static final String EB_MAIN_SCROLL_TOP = "main_scroll_top";
|
|
|
|
|
|
private SearchToolWrapperFragment mGameWrapperFragment;
|
|
|
|
private MainWrapperViewModel mViewModel;
|
|
private GameTrendsDao mGameTrendsDao;
|
|
private VideoDetailContainerFragment videoDetailContainerFragment;
|
|
private String[] lottieAssets = {"lottie/tab_index.json", "lottie/tab_game.json", "lottie/tab_video.json", "lottie/tab_community.json", "lottie/tab_mine.json"};
|
|
|
|
@Override
|
|
protected int getLayoutId() {
|
|
return R.layout.fragment_main;
|
|
}
|
|
|
|
@Override
|
|
protected int getCheckableGroupId() {
|
|
return R.id.lightgame_tab_container;
|
|
}
|
|
|
|
@Override
|
|
protected int getViewPagerId() {
|
|
return R.id.lightgame_tab_viewpager;
|
|
}
|
|
|
|
@Override
|
|
protected void initFragmentList(List<Fragment> fragments) {
|
|
SearchToolWrapperFragment homeFragment = new SearchToolWrapperFragment();
|
|
Bundle gameArgs = new Bundle();
|
|
gameArgs.putString(SearchToolWrapperFragment.WRAPPER_FRAGMENT_NAME, HomeFragment.class.getName());
|
|
homeFragment.setArguments(gameArgs);
|
|
fragments.add(homeFragment);
|
|
|
|
mGameWrapperFragment = new SearchToolWrapperFragment();
|
|
Bundle homeArgs = new Bundle();
|
|
homeArgs.putString(SearchToolWrapperFragment.WRAPPER_FRAGMENT_NAME, GameFragment.class.getName());
|
|
mGameWrapperFragment.setArguments(homeArgs);
|
|
fragments.add(mGameWrapperFragment);
|
|
|
|
videoDetailContainerFragment = new VideoDetailContainerFragment();
|
|
Bundle videoArgs = new Bundle();
|
|
videoArgs.putString(EntranceUtils.KEY_LOCATION, VideoDetailContainerViewModel.Location.VIDEO_CHOICENESS.getValue());
|
|
videoArgs.putString(EntranceUtils.KEY_PATH, "视频总入口");
|
|
videoArgs.putString(EntranceUtils.KEY_UUID, ((MainActivity) requireContext()).uuid);
|
|
videoArgs.putBoolean(EntranceUtils.KEY_IS_HOME_VIDEO, true);
|
|
videoDetailContainerFragment.setArguments(videoArgs);
|
|
fragments.add(videoDetailContainerFragment);
|
|
|
|
fragments.add(new CommunityFragment());
|
|
//fragments.add(new DiscoverFragment());
|
|
fragments.add(new PersonalFragment());
|
|
}
|
|
|
|
@Override
|
|
public void onCreate(Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
mGameTrendsDao = new GameTrendsDao(getContext());
|
|
|
|
mViewModel = ViewModelProviders.of(this).get(MainWrapperViewModel.class);
|
|
|
|
mViewModel.getNavBar().observe(this, navBarEntity -> {
|
|
if (!isAdded()) return;
|
|
FragmentManager fragmentManager = mGameWrapperFragment.getChildFragmentManager();
|
|
List<Fragment> fragments = fragmentManager.getFragments();
|
|
for (Fragment fragment : fragments) {
|
|
if (fragment instanceof GameFragment) {
|
|
((GameFragment) fragment).initPage(navBarEntity);
|
|
mMainTab.setVisibility(View.VISIBLE);
|
|
// ImageUtils.display(mTabGameIcon, navBarEntity.getIconUnselect());
|
|
Picasso.with(requireContext()).load(navBarEntity.getIconUnselect()).into(mTabGameIcon);
|
|
if (navBarEntity.getDefault()) setCurrentItem(INDEX_GAME);
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
|
|
mViewModel.getConcernData().observe(this, concernData -> {
|
|
if (concernData != null && concernData.size() > 0) {
|
|
ConcernEntity entity = concernData.get(0);
|
|
long internetPostTime = entity.getTime();
|
|
long readPostTime = mGameTrendsDao.findReadPostTime(UserManager.getInstance().getUserId());
|
|
// 当上一个条产生小红点的条目不存在或者有新的条目时更新数据库
|
|
if (readPostTime == 0 || readPostTime < internetPostTime) {
|
|
mGameTrendsDao.add(new GameTrendsInfo(UserManager.getInstance().getUserId(), internetPostTime, readPostTime, entity.getGameIcon()));
|
|
EventBus.getDefault().post(new EBReuse(DiscoverFragment.SHOW_DISCOVERY_DOT));
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
@Override
|
|
public void onResume() {
|
|
super.onResume();
|
|
mViewModel.getDiscoveryData(false);
|
|
}
|
|
|
|
@Override
|
|
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
|
|
super.onViewCreated(view, savedInstanceState);
|
|
if (mViewPager instanceof NoScrollableViewPager) {
|
|
((NoScrollableViewPager) mViewPager).setScrollable(false);
|
|
}
|
|
|
|
for (int i = 0; i < mCheckableGroup.getChildCount(); i++) {
|
|
View child = mCheckableGroup.getChildAt(i);
|
|
int finalI = i;
|
|
child.setOnTouchListener(new OnDoubleTapListener(getContext()) {
|
|
@Override
|
|
public void onDoubleTap() {
|
|
EventBus.getDefault().post(new EBUISwitch(EB_MAIN_SCROLL_TOP, finalI));
|
|
switch (finalI) {
|
|
case INDEX_HOME:
|
|
DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar_双击", "首页");
|
|
break;
|
|
case INDEX_GAME:
|
|
DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar_双击", "游戏库");
|
|
break;
|
|
case INDEX_VIDEO:
|
|
DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar_双击", "视频");
|
|
break;
|
|
case INDEX_ASK:
|
|
DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar_双击", "问答");
|
|
break;
|
|
case INDEX_PERSONAL:
|
|
DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar_双击", "我的光环");
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected boolean handleOnClick(View view) {
|
|
final int toCheck = mCheckableGroup.indexOfChild(view);
|
|
if (toCheck == INDEX_VIDEO) {
|
|
mCheckableGroup.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.transparent));
|
|
changeTabImageColor(R.color.text_A1A5B7, PorterDuff.Mode.SRC_ATOP);
|
|
changeTabTextColor(R.color.text_A1A5B7,false);
|
|
} else {
|
|
mCheckableGroup.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.white));
|
|
changeTabImageColor(R.color.text_50556B, PorterDuff.Mode.DST);
|
|
changeTabTextColor(R.color.tab_selector,true);
|
|
}
|
|
playTabAnimation(toCheck);
|
|
return super.handleOnClick(view);
|
|
}
|
|
|
|
private void playTabAnimation(int toCheck) {
|
|
switch (toCheck) {
|
|
case 0:
|
|
stopAnimation(mLottieGame);
|
|
stopAnimation(mLottieVideo);
|
|
stopAnimation(mLottieCommunity);
|
|
stopAnimation(mLottieMine);
|
|
playAnimation(mLottieHome, toCheck);
|
|
break;
|
|
case 1:
|
|
if (mViewModel.getNavBar().getValue() == null || mViewModel.getNavBar().getValue().getIconSelect().isEmpty()) {
|
|
stopAnimation(mLottieHome);
|
|
stopAnimation(mLottieVideo);
|
|
stopAnimation(mLottieCommunity);
|
|
stopAnimation(mLottieMine);
|
|
playAnimation(mLottieGame, toCheck);
|
|
}
|
|
break;
|
|
case 2:
|
|
stopAnimation(mLottieHome);
|
|
stopAnimation(mLottieGame);
|
|
stopAnimation(mLottieCommunity);
|
|
stopAnimation(mLottieMine);
|
|
playAnimation(mLottieVideo, toCheck);
|
|
break;
|
|
case 3:
|
|
stopAnimation(mLottieHome);
|
|
stopAnimation(mLottieGame);
|
|
stopAnimation(mLottieVideo);
|
|
stopAnimation(mLottieMine);
|
|
playAnimation(mLottieCommunity, toCheck);
|
|
break;
|
|
case 4:
|
|
stopAnimation(mLottieHome);
|
|
stopAnimation(mLottieGame);
|
|
stopAnimation(mLottieVideo);
|
|
stopAnimation(mLottieCommunity);
|
|
playAnimation(mLottieMine, toCheck);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void changeTabImageColor(@ColorRes int colorRes, PorterDuff.Mode mode) {
|
|
for (int i = 0; i < mCheckableGroup.getChildCount(); i++) {
|
|
if (i != INDEX_VIDEO) {
|
|
CheckableLinearLayout checkableGroupChild = (CheckableLinearLayout) mCheckableGroup.getChildAt(i);
|
|
ImageView checkableView = (ImageView) checkableGroupChild.findCheckableImageView(checkableGroupChild);
|
|
if (checkableView != null) {
|
|
checkableView.setColorFilter(ContextCompat.getColor(requireContext(), colorRes), mode);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void changeTabTextColor(@ColorRes int colorRes,boolean isSelector) {
|
|
for (int i = 0; i < mCheckableGroup.getChildCount(); i++) {
|
|
if (i != INDEX_VIDEO) {
|
|
CheckableLinearLayout checkableGroupChild = (CheckableLinearLayout) mCheckableGroup.getChildAt(i);
|
|
CheckedTextView checkableView = (CheckedTextView) checkableGroupChild.findCheckableTextView(checkableGroupChild);
|
|
if (checkableView != null) {
|
|
if (isSelector){
|
|
checkableView.setTextColor(ContextCompat.getColorStateList(requireContext(), colorRes));
|
|
}else {
|
|
checkableView.setTextColor(ContextCompat.getColor(requireContext(), colorRes));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void playAnimation(LottieAnimationView lottieView, int position) {
|
|
CheckableLinearLayout checkableGroupChild = (CheckableLinearLayout) mCheckableGroup.getChildAt(position);
|
|
View checkableView = checkableGroupChild.findCheckableImageView(checkableGroupChild);
|
|
if (checkableView != null) checkableView.setVisibility(View.INVISIBLE);
|
|
lottieView.setVisibility(View.VISIBLE);
|
|
lottieView.setAnimation(lottieAssets[position]);
|
|
lottieView.playAnimation();
|
|
ExtensionsKt.doOnAnimationEnd(lottieView, () -> {
|
|
lottieView.setVisibility(View.GONE);
|
|
if (checkableView != null) checkableView.setVisibility(View.VISIBLE);
|
|
return null;
|
|
});
|
|
}
|
|
|
|
private void stopAnimation(LottieAnimationView lottieView) {
|
|
if (lottieView.isAnimating()) {
|
|
lottieView.cancelAnimation();
|
|
int currentItem = mViewPager.getCurrentItem();
|
|
CheckableLinearLayout checkableGroupChild = (CheckableLinearLayout) mCheckableGroup.getChildAt(currentItem);
|
|
View checkableView = checkableGroupChild.findCheckableImageView(checkableGroupChild);
|
|
if (checkableView != null) checkableView.setVisibility(View.VISIBLE);
|
|
lottieView.setVisibility(View.GONE);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onPageChanged(int index) {
|
|
super.onPageChanged(index);
|
|
|
|
switch (index) {
|
|
case INDEX_HOME:
|
|
DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar", "首页");
|
|
break;
|
|
case INDEX_GAME:
|
|
DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar", "游戏库");
|
|
break;
|
|
case INDEX_ASK:
|
|
DownloadManager.getInstance(requireContext()).disableDownloadSpeedLimit();
|
|
DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar", "问答");
|
|
break;
|
|
case INDEX_VIDEO:
|
|
DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar", "视频");
|
|
break;
|
|
case INDEX_PERSONAL:
|
|
DownloadManager.getInstance(requireContext()).disableDownloadSpeedLimit();
|
|
DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar", "我的光环");
|
|
break;
|
|
}
|
|
|
|
SubjectRecommendEntity navBarEntity = mViewModel.getNavBar().getValue();
|
|
if (navBarEntity != null) {
|
|
if (index == INDEX_GAME) {
|
|
// ImageUtils.display(mTabGameIcon, navBarEntity.getIconSelect());
|
|
Picasso.with(requireContext()).load(navBarEntity.getIconSelect()).into(mTabGameIcon);
|
|
} else {
|
|
// ImageUtils.display(mTabGameIcon, navBarEntity.getIconUnselect());
|
|
Picasso.with(requireContext()).load(navBarEntity.getIconUnselect()).into(mTabGameIcon);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Subscribe(threadMode = ThreadMode.MAIN)
|
|
public void onEventMainThread(EBSkip skip) {
|
|
if (EB_SKIP_MAIN.equals(skip.getType())) {
|
|
checkIndex(skip.getCurrentItem());
|
|
mViewPager.setCurrentItem(skip.getCurrentItem(), false);
|
|
}
|
|
}
|
|
|
|
// 控制 我的光环消息未读红点
|
|
@Subscribe(threadMode = ThreadMode.MAIN)
|
|
public void onEventMainThread(EBReuse reuse) {
|
|
if (PersonalFragment.MESSAGE_READ_OVER.equals(reuse.getType())) { // 消息阅读完成
|
|
if (mMessageHintIv != null) {
|
|
mMessageHintIv.setVisibility(View.GONE);
|
|
}
|
|
} else if (PersonalFragment.MESSAGE_UNREAD_TAG.equals(reuse.getType())) {
|
|
if (mMessageHintIv != null) {
|
|
mMessageHintIv.setVisibility(View.VISIBLE);
|
|
}
|
|
}/* else if (DiscoverFragment.SHOW_DISCOVERY_DOT.equals(reuse.getType())) {
|
|
if (mDiscoveryHintIv != null) {
|
|
mDiscoveryHintIv.setVisibility(View.VISIBLE);
|
|
}
|
|
} else if (DiscoverFragment.HIDE_DISCOVERY_DOT.equals(reuse.getType())) {
|
|
if (mDiscoveryHintIv != null) {
|
|
mDiscoveryHintIv.setVisibility(View.GONE);
|
|
}
|
|
} else if (PersonalFragment.LOGOUT_TAG.equals(reuse.getType())) {
|
|
if (mDiscoveryHintIv != null) {
|
|
mDiscoveryHintIv.setVisibility(View.GONE);
|
|
}
|
|
} else if (PersonalFragment.LOGIN_TAG.equals(reuse.getType())) {
|
|
if (mDiscoveryHintIv != null) {
|
|
mViewModel.getDiscoveryData(true);
|
|
}
|
|
} */ else if ("Refresh".equals(reuse.getType())) {
|
|
SettingsEntity settings = Config.getSettings();
|
|
if (settings != null && !settings.showCommunityEntrance()) {
|
|
mTabCommunity.setVisibility(View.GONE);
|
|
} else {
|
|
mTabCommunity.setVisibility(View.VISIBLE);
|
|
}
|
|
}
|
|
}
|
|
|
|
// 关注事件
|
|
@Subscribe(threadMode = ThreadMode.MAIN)
|
|
public void onEventMainThread(EBConcernChanged changed) {
|
|
/*if (mDiscoveryHintIv != null) {
|
|
mViewModel.getDiscoveryData(true);
|
|
}*/
|
|
}
|
|
|
|
public void setCurrentItem(int page) {
|
|
mViewPager.setCurrentItem(page, false);
|
|
}
|
|
|
|
public int getCurrentItem() {
|
|
return mViewPager.getCurrentItem();
|
|
}
|
|
|
|
@Override
|
|
public boolean onHandleBackPressed() {
|
|
if (videoDetailContainerFragment != null) {
|
|
return videoDetailContainerFragment.onHandleBackPressed();
|
|
}
|
|
return false;
|
|
}
|
|
}
|