Files
assistant-android/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java

561 lines
23 KiB
Java

package com.gh.gamecenter.fragment;
import android.graphics.Bitmap;
import android.graphics.PorterDuff;
import android.graphics.drawable.Animatable;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.CheckedTextView;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.ColorRes;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProviders;
import com.airbnb.lottie.LottieAnimationView;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.controller.BaseControllerListener;
import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.fresco.animation.drawable.AnimatedDrawable2;
import com.facebook.fresco.animation.drawable.BaseAnimationListener;
import com.facebook.imagepipeline.image.ImageInfo;
import com.gh.base.OnDoubleTapListener;
import com.gh.base.fragment.BaseFragment_ViewPager_Checkable;
import com.gh.common.constant.Config;
import com.gh.common.syncpage.SyncPageRepository;
import com.gh.common.tracker.Tracker;
import com.gh.common.tracker.TrackerLogger;
import com.gh.common.util.BiCallback;
import com.gh.common.util.DataUtils;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.EntranceUtils;
import com.gh.common.util.ExtensionsKt;
import com.gh.common.util.HomeBottomBarHelper;
import com.gh.common.util.ImageUtils;
import com.gh.common.util.IntegralLogHelper;
import com.gh.common.util.LogUtils;
import com.gh.common.view.ReserveDialog;
import com.gh.common.view.WelcomeDialog;
import com.gh.gamecenter.MainActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.entity.SettingsEntity;
import com.gh.gamecenter.entity.SubjectRecommendEntity;
import com.gh.gamecenter.eventbus.EBReuse;
import com.gh.gamecenter.eventbus.EBSkip;
import com.gh.gamecenter.eventbus.EBUISwitch;
import com.gh.gamecenter.forum.home.ForumHomeFragment;
import com.gh.gamecenter.forum.home.NewForumHomeFragment;
import com.gh.gamecenter.game.GameFragment;
import com.gh.gamecenter.message.MessageUnreadRepository;
import com.gh.gamecenter.message.MessageUnreadViewModel;
import com.gh.gamecenter.personal.PersonalFragment;
import com.gh.gamecenter.video.detail.HomeVideoFragment;
import com.halo.assistant.HaloApp;
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.ArrayList;
import java.util.List;
import butterknife.BindView;
import static com.gh.gamecenter.MainActivity.EB_SKIP_MAIN;
public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implements OnBackPressedListener {
@BindView(R.id.view_shadow)
View mShadowView;
@BindView(R.id.main_tab_game)
View mGameTab;
@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.main_tab_video)
View mTabVideo;
@BindView(R.id.lottieHome)
LottieAnimationView mLottieHome;
@BindView(R.id.lottieGame)
LottieAnimationView mLottieGame;
@BindView(R.id.lottieVideo)
LottieAnimationView mLottieVideo;
@BindView(R.id.lottieCommunity)
LottieAnimationView mLottieBBS;
@BindView(R.id.lottieMine)
SimpleDraweeView mLottieMine;
@BindView(R.id.main_tab_game_name)
TextView mTabGameName;
public static final int INDEX_HOME = 0;
public static final int INDEX_GAME = 1;
public static final int INDEX_BBS = 2;
public static final int INDEX_VIDEO = 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 MessageUnreadViewModel mMessageUnreadViewModel;
private HomeVideoFragment homeVideoFragment;
private String[] resAssets = {"lottie/tab_home.json", "lottie/tab_game.json", "lottie/tab_video.json", "lottie/tab_forum.json", "tab_mine.gif"};
@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 HomeSearchToolWrapperFragment();
fragments.add(homeFragment);
mGameWrapperFragment = new SearchToolWrapperFragment();
Bundle homeArgs = new Bundle();
homeArgs.putBoolean(EntranceUtils.KEY_IS_HOME, true);
homeArgs.putString(SearchToolWrapperFragment.WRAPPER_FRAGMENT_NAME, GameFragment.class.getName());
mGameWrapperFragment.setArguments(homeArgs);
fragments.add(mGameWrapperFragment);
homeVideoFragment = new HomeVideoFragment();
Bundle videoArgs = new Bundle();
videoArgs.putBoolean(EntranceUtils.KEY_IS_HOME_VIDEO, true);
homeVideoFragment.setArguments(videoArgs);
fragments.add(new NewForumHomeFragment());
fragments.add(homeVideoFragment);
if (mViewModel.shouldHideVideoTab()) {
mTabVideo.setVisibility(View.GONE);
}
fragments.add(new PersonalFragment());
}
@Override
public ArrayList<Fragment> restoreFragments() {
ArrayList<Fragment> restoreFragments = super.restoreFragments();
for (Fragment fragment : restoreFragments) {
if (fragment instanceof SearchToolWrapperFragment && !(fragment instanceof HomeSearchToolWrapperFragment)) {
mGameWrapperFragment = (SearchToolWrapperFragment) fragment;
} else if (fragment instanceof HomeVideoFragment) {
homeVideoFragment = (HomeVideoFragment) fragment;
}
}
return restoreFragments;
}
@Override
public void onCreate(Bundle savedInstanceState) {
mViewModel = ViewModelProviders.of(this).get(MainWrapperViewModel.class);
super.onCreate(savedInstanceState);
SubjectRecommendEntity defaultGameBarData = HomeBottomBarHelper.getDefaultGameBarData();
if (TextUtils.isEmpty(defaultGameBarData.getLink())) {
mGameTab.setVisibility(View.GONE);
} else {
mGameTab.setVisibility(View.VISIBLE);
mTabGameName.setText(defaultGameBarData.getName());
Picasso.with(getContext())
.load(Uri.parse(defaultGameBarData.getIconUnselect()))
.placeholder(R.drawable.ic_game_unselect)
.into(mTabGameIcon);
}
mMessageUnreadViewModel = ViewModelProviders.of(this).get(MessageUnreadViewModel.class);
mViewModel.getNavBar().observe(this, this::updateGameBarContent);
mViewModel.getReserveDialog().observe(this, reserveData -> {
if (reserveData != null && !reserveData.isEmpty()) {
ReserveDialog reserveDialog = ReserveDialog.getInstance(reserveData);
reserveDialog.setOnDismissListener(() -> {
MessageUnreadRepository.INSTANCE.loadMessageUnreadData();
return null;
});
reserveDialog.show(getChildFragmentManager(), "reserveDialog");
} else {
MessageUnreadRepository.INSTANCE.loadMessageUnreadData();
}
});
mMessageUnreadViewModel.getUnreadMessageTotalLiveData().observe(this, isShow -> {
mMessageHintIv.setVisibility(isShow ? View.VISIBLE : View.GONE);
});
if ((getActivity() instanceof MainActivity)
&& !((MainActivity) getActivity()).showAd) {
getWelcomeDialog();
}
}
public void getWelcomeDialog() {
// 判断是否是第一次启动应用,不是的话不弹启动弹窗
if (HaloApp.get(MainWrapperViewModel.SHOULD_SHOW_OPENING_DIALOG, false) == null) {
HaloApp.put(MainWrapperViewModel.SHOULD_SHOW_OPENING_DIALOG, false);
mViewModel.requestOpeningData();
mViewModel.getOpeningDialog().observe(this, it -> {
if (it != null) {
ImageUtils.getBitmap(it.getIcon(), new BiCallback<Bitmap, Boolean>() {
@Override
public void onFirst(Bitmap bitmap) {
// 网络速度追不上用户操作的时候可能会出现要弹启动弹窗但用户已经不停留在 MainActivity 的情况
if (isStateSaved()) return;
WelcomeDialog welcomeDialog = WelcomeDialog.getInstance(it);
welcomeDialog.setOnDismissListener(() -> {
mViewModel.requestReserveDialog();
return null;
});
welcomeDialog.show(getChildFragmentManager(), "openingDialog");
}
@Override
public void onSecond(Boolean aBoolean) {
mViewModel.requestReserveDialog();
}
});
} else {
mViewModel.requestReserveDialog();
}
});
}
}
private void updateGameBarContent(SubjectRecommendEntity navBarEntity) {
if (navBarEntity != null) {
mGameTab.setVisibility(View.VISIBLE);
mTabGameName.setText(navBarEntity.getName());
Picasso.with(getContext())
.load(Uri.parse(navBarEntity.getIconUnselect()))
.placeholder(R.drawable.ic_game_unselect)
.into(mTabGameIcon);
if (navBarEntity.getDefault()) setCurrentItem(INDEX_GAME);
} else {
mGameTab.setVisibility(View.GONE);
}
}
@Override
public void onPause() {
super.onPause();
SyncPageRepository.clearSyncData();
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (mViewPager instanceof NoScrollableViewPager) {
((NoScrollableViewPager) mViewPager).setScrollable(false);
}
// 启动时即当选中第一个 tab
onPageChanged(INDEX_HOME);
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_BBS:
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);
playTabAnimation(toCheck);
changeColor(toCheck);
return super.handleOnClick(view);
}
private void changeColor(int toCheck) {
if (toCheck == INDEX_VIDEO) {
mShadowView.setVisibility(View.GONE);
mCheckableGroup.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.transparent));
changeTabImageColor(R.color.text_A1A5B7, PorterDuff.Mode.SRC_ATOP);
changeTabTextColor(R.color.text_A1A5B7, false);
} else {
mShadowView.setVisibility(View.VISIBLE);
mCheckableGroup.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.white));
changeTabImageColor(R.color.text_50556B, PorterDuff.Mode.DST);
changeTabTextColor(R.color.tab_selector, true);
}
}
private void playTabAnimation(int toCheck) {
switch (toCheck) {
case INDEX_HOME:
stopAnimation(mLottieGame, INDEX_GAME);
stopAnimation(mLottieVideo, INDEX_VIDEO);
stopAnimation(mLottieBBS, INDEX_BBS);
stopAnimation(mLottieMine, INDEX_PERSONAL);
playAnimation(mLottieHome, toCheck);
break;
case INDEX_GAME:
SubjectRecommendEntity value = mViewModel.getNavBar().getValue();
if (value != null && !TextUtils.isEmpty(value.getAnimationCode())) {
stopAnimation(mLottieHome, INDEX_HOME);
stopAnimation(mLottieVideo, INDEX_VIDEO);
stopAnimation(mLottieBBS, INDEX_BBS);
stopAnimation(mLottieMine, INDEX_PERSONAL);
playGameAnimation(value, toCheck);
}
break;
case INDEX_BBS:
stopAnimation(mLottieHome, INDEX_HOME);
stopAnimation(mLottieGame, INDEX_GAME);
stopAnimation(mLottieVideo, INDEX_VIDEO);
stopAnimation(mLottieMine, INDEX_PERSONAL);
playAnimation(mLottieBBS, toCheck);
break;
case INDEX_VIDEO:
stopAnimation(mLottieHome, INDEX_HOME);
stopAnimation(mLottieGame, INDEX_GAME);
stopAnimation(mLottieBBS, INDEX_BBS);
stopAnimation(mLottieMine, INDEX_PERSONAL);
playAnimation(mLottieVideo, toCheck);
break;
case INDEX_PERSONAL:
stopAnimation(mLottieHome, INDEX_HOME);
stopAnimation(mLottieGame, INDEX_GAME);
stopAnimation(mLottieVideo, INDEX_VIDEO);
stopAnimation(mLottieBBS, INDEX_BBS);
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 playGameAnimation(SubjectRecommendEntity entity, int position) {
CheckableLinearLayout checkableGroupChild = (CheckableLinearLayout) mCheckableGroup.getChildAt(position);
View checkableView = checkableGroupChild.findCheckableImageView(checkableGroupChild);
if (checkableView != null) checkableView.setVisibility(View.INVISIBLE);
mLottieGame.setVisibility(View.VISIBLE);
mLottieGame.setAnimationFromJson(entity.getAnimationCode(), entity.getIconSelect());
mLottieGame.playAnimation();
ExtensionsKt.doOnAnimationEnd(mLottieGame, () -> {
mLottieGame.setVisibility(View.GONE);
if (checkableView != null) checkableView.setVisibility(View.VISIBLE);
return null;
});
}
private void playAnimation(View view, int position) {
CheckableLinearLayout checkableGroupChild = (CheckableLinearLayout) mCheckableGroup.getChildAt(position);
View checkableView = checkableGroupChild.findCheckableImageView(checkableGroupChild);
if (checkableView != null) checkableView.setVisibility(View.INVISIBLE);
view.setVisibility(View.VISIBLE);
if (view instanceof LottieAnimationView) {
LottieAnimationView lottieView = (LottieAnimationView) view;
lottieView.setAnimation(resAssets[position]);
lottieView.playAnimation();
ExtensionsKt.doOnAnimationEnd(lottieView, () -> {
lottieView.setVisibility(View.GONE);
if (checkableView != null) checkableView.setVisibility(View.VISIBLE);
return null;
});
} else {
SimpleDraweeView lottieView = (SimpleDraweeView) view;
Uri uri = Uri.parse("asset:///" + resAssets[position]);
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.setAutoPlayAnimations(true)
.setControllerListener(new BaseControllerListener<ImageInfo>() {
@Override
public void onFinalImageSet(String id, @Nullable ImageInfo imageInfo, @Nullable Animatable animatable) {
super.onFinalImageSet(id, imageInfo, animatable);
if (animatable != null) {
AnimatedDrawable2 animatedDrawable = (AnimatedDrawable2) animatable;
animatedDrawable.setAnimationListener(new BaseAnimationListener() {
@Override
public void onAnimationStop(AnimatedDrawable2 drawable) {
super.onAnimationStop(drawable);
lottieView.setVisibility(View.GONE);
if (checkableView != null)
checkableView.setVisibility(View.VISIBLE);
}
});
}
}
}).build();
lottieView.setController(controller);
}
}
private void stopAnimation(View lottieView, int position) {
CheckableLinearLayout checkableGroupChild = (CheckableLinearLayout) mCheckableGroup.getChildAt(position);
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);
String tabText = "";
switch (index) {
case INDEX_HOME:
tabText = "首页";
break;
case INDEX_GAME:
tabText = "游戏库";
break;
case INDEX_BBS:
tabText = "论坛";
LogUtils.uploadAccessBbsTab();
break;
case INDEX_VIDEO:
tabText = "视频";
DisplayUtils.setLightStatusBar(requireActivity(), false);
break;
case INDEX_PERSONAL:
tabText = "我的光环";
IntegralLogHelper.INSTANCE.log("view_me", "我的光环");
break;
}
DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar", tabText);
TrackerLogger.logHomeTabSelected(
Tracker.INSTANCE.getLaunchId(),
Tracker.INSTANCE.getSessionId(),
index,
tabText);
SubjectRecommendEntity navBarEntity = mViewModel.getNavBar().getValue();
if (navBarEntity != null) {
if (index == INDEX_GAME) {
Picasso.with(getContext())
.load(Uri.parse(navBarEntity.getIconSelect()))
.placeholder(R.drawable.ic_game_select)
.into(mTabGameIcon);
} else {
Picasso.with(getContext())
.load(Uri.parse(navBarEntity.getIconUnselect()))
.placeholder(R.drawable.ic_game_unselect)
.into(mTabGameIcon);
}
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(EBSkip skip) {
if (EB_SKIP_MAIN.equals(skip.getType())) {
checkIndex(skip.getCurrentItem());
changeColor(skip.getCurrentItem());
mViewPager.setCurrentItem(skip.getCurrentItem(), false);
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(EBReuse reuse) {
if ("Refresh".equals(reuse.getType())) {
SettingsEntity settings = Config.getSettings();
if (settings != null && !settings.showCommunityEntrance()) {
mTabCommunity.setVisibility(View.GONE);
} else {
mTabCommunity.setVisibility(View.VISIBLE);
}
}
}
public void setCurrentItem(int page) {
mViewPager.setCurrentItem(page, false);
changeColor(page);
}
public int getCurrentItem() {
return mViewPager.getCurrentItem();
}
@Override
public boolean onHandleBackPressed() {
if (homeVideoFragment.getCurrentFragment() != null) {
return homeVideoFragment.getCurrentFragment().onHandleBackPressed();
}
return false;
}
@Override
public int getChildCount() {
return 5;
}
}