MainFragment.java 11.8 KB
/*
 * Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
 */

package com.wd.capability.layout.fragment;


import android.content.res.Configuration;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;

import com.wd.base.log.Logger;
import com.wd.capability.layout.page.ItemMenuTopLayoutManager;
import com.wd.capability.layout.ui.channel.vm.ChannelViewModel;
import com.wd.capability.layout.ui.channel.vm.INavChannelDataListener;
import com.wd.foundation.wdkit.base.fragment.BaseFragment;
import com.wd.foundation.wdkit.base.fragment.BaseLazyFragment;
import com.wd.foundation.wdkit.constant.DefaultViewConstant;
import com.wd.foundation.wdkit.constant.EventConstants;
import com.wd.foundation.wdkit.constant.IntentConstants;
import com.wd.foundation.bean.custom.MenuBean;
import com.wd.foundation.bean.custom.SimpleTabBean;
import com.wd.foundation.bean.livedate.EventMessage;
import com.wd.foundation.bean.response.ChannelBean;
import com.wd.foundation.wdkit.utils.SafeBundleUtil;
import com.wd.foundation.wdkit.utils.SpUtils;
import com.wd.foundation.wdkitcore.livedata.LiveDataBus;
import com.wd.foundation.wdkitcore.tools.ArrayUtils;
import com.wd.foundation.wdkitcore.tools.CastUtils;


/**
 * 页面fragment<BR>
 * 带有菜单导航的页面
 *
 * @version 1.0.0
 * @description:
 * @author: liyubing
 * @date :2023/2/3 15:07
 */
public class MainFragment extends BaseLazyFragment {

    private static final String TAG = "MainFragment";

    private FrameLayout mRootView;

    private View mNavBarView;

    private SimpleTabBean mTabBean;

    private ItemMenuTopLayoutManager mTabManager;

    private ChannelViewModel mViewModel;

    /**
     * 顶部菜单导航栏标识(频道id)
     */
    private String mId;

    private MenuBean menuData;

    private boolean haveDataLoadInPage = false;

    /**
     * @param menuData 底部导航栏目对象
     * @return
     */
    public static MainFragment newInstance(MenuBean menuData) {
        MainFragment fragment = new MainFragment();
        Bundle bundle = new Bundle();
        bundle.putSerializable(IntentConstants.PARAM_PAGE_OBJ, menuData);
        fragment.setArguments(bundle);
        return fragment;
    }

    @Override
    protected String getLogTag() {
        return TAG;
    }

    @Deprecated
    @Override
    protected int getLayout() {
        return 0;
    }

    @Override
    protected View getJavaLayout() {
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        mRootView = new FrameLayout(activity);
        mRootView.setLayoutParams(params);
        return mRootView;
    }

    @Override
    protected void perCreate() {
        super.perCreate();
        //首页启动速度用户,使用java布局
        setIsjava(true);
    }

    @Override
    protected void initView(View view) {
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        menuData = (MenuBean) SafeBundleUtil.getSerializable(getArguments(), IntentConstants.PARAM_PAGE_OBJ);
        if (menuData != null) {
            mId = menuData.getNavId();
            initNavBar(mRootView);
            initViewModel();
            if (menuData.isSearchTab()) {
                receiveLiveDataMsg();
            }

        }

    }

    @Override
    protected void lazyLoadData() {
        request();

    }

    /**
     * 请求顶部导航栏接口
     */
    public void request() {
        if (menuData.isTemplate()) {
            haveDataLoadInPage = true;
            SimpleTabBean tabBean = new SimpleTabBean();
            tabBean.setTopNavChannelList(menuData.getTopNavChannelList());
            initData(tabBean);
        } else {
            //其他底部导航栏tab不在请求接口,使用bottomNavGroup的数据,bottomNavGroup缓存起来
            mViewModel.getNavData(mId, false);
        }
    }

    private void initViewModel() {
        mViewModel = getViewModelThis(ChannelViewModel.class);
        mViewModel.observePageDataListener(this, new INavChannelDataListener() {

            @Override
            public void onPageDataSuccess(SimpleTabBean tabBean) {
                if (tabBean == null) {
                    Logger.t(TAG).e("onPageDataSuccess, data is null");
                    return;
                }

                if (tabBean.getTopNavChannelList() != null && tabBean.getTopNavChannelList().size() > 0) {
                    haveDataLoadInPage = true;
                    initData(tabBean);
                } else {
                    if (!haveDataLoadInPage) {
                        SimpleTabBean bean = new SimpleTabBean();
                        bean.errorCode = DefaultViewConstant.TYPE_NO_CONTENT;
                        initData(bean);
                    }
                }

            }

            @Override
            public void onPageDataFailed(String error) {
                Logger.t(TAG).e("onPageDataFailed");
                if (!haveDataLoadInPage) {
                    SimpleTabBean bean = new SimpleTabBean();
                    bean.errorCode = DefaultViewConstant.TYPE_GET_CONTENT_ERROR;
                    initData(bean);
                }
            }
        });
        // 更换背景图
        initLiveData();
    }

    private void initNavBar(@NonNull ViewGroup rootView) {
        Logger.t(TAG).i("initNavBar");

        mTabManager = new ItemMenuTopLayoutManager(menuData);
        mTabManager.setFragmentActivity(getActivity());
        mNavBarView = LayoutInflater.from(getContext()).inflate(mTabManager.getItemViewType(), rootView, false);
        rootView.removeView(mNavBarView);
        rootView.addView(mNavBarView);
    }

    private void initData(@NonNull SimpleTabBean tabBean) {
        Logger.t(TAG).d("initData pageId:" + mId);
        // 参数写死,主要是走section.initData进行排序,其他数据都在homePageBean里
        // SectionTabLayoutNews section = new SectionTabLayoutNews(null, new CompBean());
        tabBean.parentImmerseColor = menuData.parentImmerseColor;
        mTabManager.setFragment(this);
        tabBean.setTabChannleId(mId);
        //  section.initData(tabBean);
        mTabManager.prepareItem(mNavBarView, 0);
        mTabManager.bindItem(mNavBarView, 0, tabBean);
        mTabBean = tabBean;

    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        Logger.t(TAG).i("onDestroy.");
        if (menuData != null && menuData.isSearchTab()) {
            LiveDataBus.getInstance().with(EventConstants.SEARCH_POST_KEYWORD_TAB, EventMessage.class).removeObservers(this);
        }
    }

    /**
     * 初始化LiveData监听
     */
    private void initLiveData() {
        LiveDataBus.getInstance().with(EventConstants.SHORT_VIDEO_SWITCH_FULL, String.class).observe(getViewLifecycleOwner(), result -> {
            if ("1".equals(result)) {
                // 横屏
                mTabManager.changeOrientation(true);
            } else {
                mTabManager.changeOrientation(false);
            }
        });
        // 接收画中画,处理首页view事件
        LiveDataBus.getInstance().with(EventConstants.HOME_PICTURE_IN_PICTURE, Boolean.class).observe(getViewLifecycleOwner(), result -> {
            if (result) {
                // 横屏
                mTabManager.changeOrientation(true);
            } else {
                // 竖屏
                mTabManager.changeOrientation(false);
            }
        });
    }


    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // 屏幕方向
        int orientation = newConfig.orientation;
        // 竖屏 && 新闻首页
        if (orientation == Configuration.ORIENTATION_PORTRAIT && menuData.isTabNew()) {
            // 折叠屏展开-折叠时候调用
            if (mTabManager != null) {
                mTabManager.setTopViewForFold();
            }
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        Logger.t(TAG).i("onKeyDown " + keyCode);
        // 主要是物理返回键
        if (mNavBarView != null) {
            // 菜单导航栏,找当前fragment。
            BaseFragment fragment = getCurrentFragment();
            if (fragment != null && fragment.onKeyDown(keyCode, event)) {
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    private BaseFragment getCurrentFragment() {
        if (mTabManager == null) {
            Logger.t(TAG).e("getCurrentFragment, no ItemTabLayoutManager found");
            return null;
        }
        return CastUtils.cast(mTabManager.getCurFragment(), BaseFragment.class);
    }

    @Override
    public void onResume() {
        super.onResume();

        if (mTabManager != null) {

            if (menuData != null) {
                if (menuData.isTabVideo() && mTabManager.getInitRedMark()) {
                    mTabManager.checkLiveRedMark();
                }
            }
        }

        if (menuData != null) {
            Integer statusBarColor = menuData.getStatusBarColor();
            if (statusBarColor == null) {
                statusBarColor = 1;
            }
            if (TextUtils.isEmpty(menuData.getBackgroundUrl())) {
                boolean isNightMode = SpUtils.isNightMode();
                if (isNightMode) {
                    statusBarColor = 0;
                }
            }
            changePhoneStatusBarWhiteOrBlack(statusBarColor == 0);

        }

    }

    /**
     * 顶部导航栏的tab 对应的page页面是否是沉浸式页面
     *
     * @return true:是;false:不是
     */
    public boolean tabToFragmentIsImmPage() {
        boolean isImmFlag = false;
        // 视频频道
        if (menuData.isTabVideo()) {
            if (mTabManager != null) {

                if (mTabManager.haveTabBeanObject()) {
                    isImmFlag = mTabManager.isFullScreenVideoFragment();
                } else {
                    if (menuData.getTopNavChannelList() != null && menuData.getTopNavChannelList().size() > 0) {
                        ChannelBean channelBean = ArrayUtils.getListElement(menuData.getTopNavChannelList(), 0);
                        if (channelBean != null) {
                            isImmFlag = channelBean.isImmersePage();
                        }
                    }
                }
            }
        }
        return isImmFlag;
    }


    /**
     * 切换频道
     */
    public void switchChannelAction() {

        if (mTabManager != null) {
            // 点击跳转频道后才使用
            mTabManager.setDefaultTab();
        }
    }


    public void grayUiPage() {

        if (mTabManager != null) {
            mTabManager.grayUiPage(true);
        }

    }

    @Override
    public void onUserLeaveHint() {
        Logger.t(getClass().getName()).d("onUserLeaveHint");
        if (mTabManager != null) {
            mTabManager.callAllFragmentLeaveHint();
        }
    }

    /**
     * 根据传递过来的关键字执行搜索
     */
    private void receiveLiveDataMsg() {
        LiveDataBus.getInstance()
                .with(EventConstants.SEARCH_POST_KEYWORD_TAB, EventMessage.class)
                .observe(getViewLifecycleOwner(), new Observer<EventMessage>() {
                    @Override
                    public void onChanged(EventMessage mEventMessage) {
                        menuData = (MenuBean) mEventMessage.getSerializableExtra(IntentConstants.PAGE_INFOR_DATA);
                        request();
                    }
                });
    }
}