Files
assistant-android/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java
2019-12-31 18:19:30 +08:00

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;
}
}