UserFragment.java 12.7 KB
package com.studymachine.www.ui.fragment;

import android.text.TextUtils;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import androidx.appcompat.widget.AppCompatButton;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.constraintlayout.widget.ConstraintLayout;

import com.haibin.calendarview.Calendar;
import com.haibin.calendarview.CalendarView;
import com.hjq.base.BaseDialog;
import com.hjq.http.EasyHttp;
import com.hjq.http.listener.OnHttpListener;
import com.studymachine.www.R;
import com.studymachine.www.aop.SingleClick;
import com.studymachine.www.app.AppFragment;
import com.studymachine.www.enumtype.AppEnum;
import com.studymachine.www.event.UserInfoEvent;
import com.studymachine.www.http.api.BannerListApi;
import com.studymachine.www.http.api.SignApi;
import com.studymachine.www.http.api.SignDateApi;
import com.studymachine.www.http.api.UserInfoApi;
import com.studymachine.www.http.glide.GlideApp;
import com.studymachine.www.http.model.HttpData;
import com.studymachine.www.manager.CacheDataManager;
import com.studymachine.www.manager.ThreadPoolManager;
import com.studymachine.www.manager.UserManager;
import com.studymachine.www.other.Tool;
import com.studymachine.www.ui.activity.AgreementActivity;
import com.studymachine.www.ui.activity.CommonProblemActivity;
import com.studymachine.www.ui.activity.ExternalBrowserActivity;
import com.studymachine.www.ui.activity.PersonalCenterActivity;
import com.studymachine.www.ui.dialog.ConfirmDialog;
import com.studymachine.www.ui.dialog.EditPasswordDialog;
import com.youth.banner.Banner;
import com.youth.banner.adapter.BannerImageAdapter;
import com.youth.banner.holder.BannerImageHolder;
import com.youth.banner.listener.OnBannerListener;

import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;


/**
 * desc   : 个人中心  角色和设置
 */
public final class UserFragment extends AppFragment<PersonalCenterActivity> implements CalendarView.OnMonthChangeListener {

    public static final int SETTINGS = 1;//设置
    public static final int INFO = 0;//用户信息

    private CalendarView mCalendarView;//日历
    private Banner mBannerContent;//banner图
    private ConstraintLayout mPersonView;
    private RelativeLayout mTitleView;
    private LinearLayout mSettingView, mLLCalendarTitle, mLlCalendar, mLlQd;
    private AppCompatTextView mTvNikeName, mTvNowTime;
    private AppCompatButton mBtExit;
    private AppCompatImageView mIvSex, mIvPerson, mIvSign, mIVCalendarRight, mIVCalendarLeft;

    private BannerImageAdapter<BannerListApi.Bean> mBannerImageAdapter;
    private List<BannerListApi.Bean> mBannerList;

    public static UserFragment newInstance() {
        return new UserFragment();
    }

    @Override
    protected int getLayoutId() {
        return R.layout.user_fragment;
    }

    @Override
    protected void initView() {
        mIvSign = findViewById(R.id.iv_sign);
        mBannerContent = findViewById(R.id.banner_content);
        mPersonView = findViewById(R.id.person_view);
        mTitleView = findViewById(R.id.title_view);
        mBtExit = findViewById(R.id.bt_exit);

        mSettingView = findViewById(R.id.setting_view);
        mTvNikeName = findViewById(R.id.tv_nike_name);
        mIvSex = findViewById(R.id.iv_sex);
        mIvPerson = findViewById(R.id.iv_person);

        mLlCalendar = findViewById(R.id.ll_calendar);
        mLLCalendarTitle = findViewById(R.id.ll_calendar_title);
        mLlQd = findViewById(R.id.ll_qd);

        mCalendarView = findViewById(R.id.calendar_view);
        mTvNowTime = findViewById(R.id.tv_now_time);
        mIVCalendarRight = findViewById(R.id.iv_calendar_right);
        mIVCalendarLeft = findViewById(R.id.iv_calendar_left);

        //监听日历月的变化
        mCalendarView.setOnMonthChangeListener(this);
        mTvNowTime.setText(String.format(Locale.getDefault(),"%d-%d", mCalendarView.getCurYear(), mCalendarView.getCurMonth()));

        mBannerImageAdapter = new BannerImageAdapter<BannerListApi.Bean>(mBannerList) {
            @Override
            public void onBindView(BannerImageHolder holder, BannerListApi.Bean data, int position, int size) {
                GlideApp.with(holder.itemView)
                        .load(Tool.jointOSSPath(mBannerList.get(position).getImage()))
                        .into(holder.imageView);
            }
        };
        mBannerImageAdapter.setOnBannerListener(new OnBannerListener<BannerListApi.Bean>() {
            @Override
            public void OnBannerClick(BannerListApi.Bean data, int position) {
                if (mBannerList == null) return;
                BannerListApi.Bean bean = mBannerList.get(position);
                if (TextUtils.isEmpty(bean.getLink())) return;
                ExternalBrowserActivity.start(getContext(), bean.getLink());
            }
        });
        mBannerContent.setAdapter(mBannerImageAdapter,true);

        setOnClickListener(mBtExit, mIvSign, mIVCalendarRight, mIVCalendarLeft);
        setOnClickListener(R.id.tv_setting_cache, R.id.tv_policy, R.id.tv_edit_psd, R.id.tv_common_problem, R.id.iv_calendar, R.id.ll_calendar_title);

    }

    public void setSelectBtn(int index) {
        if (index == INFO) {
            mTitleView.setVisibility(View.VISIBLE);
            mPersonView.setVisibility(View.VISIBLE);
            mSettingView.setVisibility(View.INVISIBLE);
        } else if (index == SETTINGS) {
            mTitleView.setVisibility(View.INVISIBLE);
            mPersonView.setVisibility(View.INVISIBLE);
            mSettingView.setVisibility(View.VISIBLE);
        }
    }

    @Override
    protected void initData() {
        getBanner();
        initUserInfo();
        getSignData();
    }

    @SingleClick
    @Override
    public void onClick(View view) {
        int viewId = view.getId();
        if (view == mBtExit) {
            showConfirmEdit();
        } else if (view == mIvSign) {
            //签到
            userSign();
        } else if (view == mIVCalendarRight) {
            //切换到下一月
            mCalendarView.scrollToNext();
        } else if (view == mIVCalendarLeft) {
            //切换到上一月
            mCalendarView.scrollToPre();
        } else if (viewId == R.id.iv_calendar) {
            //显示日历
            mLLCalendarTitle.setVisibility(View.VISIBLE);
            mLlCalendar.setVisibility(View.VISIBLE);
            mLlQd.setVisibility(View.INVISIBLE);
            mCalendarView.scrollToCurrent();
        } else if (viewId == R.id.ll_calendar_title) {
            //隐藏日历
            mLLCalendarTitle.setVisibility(View.INVISIBLE);
            mLlCalendar.setVisibility(View.INVISIBLE);
            mLlQd.setVisibility(View.VISIBLE);
        } else if (viewId == R.id.tv_edit_psd) {
            //展示密码修改框
            new EditPasswordDialog.Builder(getContext())
                    .show();
        } else if (viewId == R.id.tv_common_problem) {
            //常见问题
            CommonProblemActivity.start(getContext());
        } else if (viewId == R.id.tv_setting_cache) {
            showDialog();
            // 清除内存缓存(必须在主线程)
            GlideApp.get(getActivity()).clearMemory();
            ThreadPoolManager.getInstance().execute(() -> {
                CacheDataManager.clearAllCache(getContext());
                // 清除本地缓存(必须在子线程)
                GlideApp.get(getActivity()).clearDiskCache();
            });
            postDelayed(() -> {
                hideDialog();
                toast("已清除");
            }, 1000);

        } else if (viewId == R.id.tv_policy) {
            AgreementActivity.start(getContext(), AgreementActivity.AGREEMENT_TYPE_DEFAULT);
        }
    }

    /**
     * 初始化用户信息
     */
    private void initUserInfo() {
        UserInfoApi.Bean userInfo = UserManager.getInstance().getUserBean();
        if (userInfo != null) {
            String gender = userInfo.getGender().trim();

            if (AppEnum.MALE.getKey().equals(gender)) {
                mIvSex.setImageResource(R.drawable.person_nan);
            } else {
                mIvSex.setImageResource(R.drawable.person_nv);
            }
            mTvNikeName.setText(userInfo.getNickName());
            mIvSign.setImageResource(userInfo.isSignFlg() ? R.drawable.person_qd_ed : R.drawable.person_qd);

            GlideApp.with(this)
                    .load(Tool.jointOSSPath(userInfo.getModel()))
                    .into(mIvPerson);
        }
    }

    /**
     * 获取签到日期
     */
    private void getSignData() {
        EasyHttp.get(this)
                .api(new SignDateApi()
                        .setDate(mCalendarView.getCurYear() + "-" + mCalendarView.getCurMonth()))
                .request(new OnHttpListener<HttpData<List<String>>>() {
                    @Override
                    public void onSucceed(HttpData<List<String>> result) {
                        if (result.getData() == null) return;
                        List<String> list = result.getData();
                        Map<String, Calendar> map = new HashMap<>();
                        for (String item : list) {
                            String[] strings = item.split("-");
                            Calendar calendar = getSchemeCalendar(Integer.parseInt(strings[0]), Integer.parseInt(strings[1]), Integer.parseInt(strings[2]));
                            map.put(calendar.toString(), calendar);
                        }
                        mCalendarView.setSchemeDate(map);
                    }

                    @Override
                    public void onFail(Exception e) {
                    }
                });
    }

    /**
     * 构建类
     */
    private Calendar getSchemeCalendar(int year, int month, int day) {
        Calendar calendar = new Calendar();
        calendar.setYear(year);
        calendar.setMonth(month);
        calendar.setDay(day);
        return calendar;
    }

    /**
     * 获取banner图
     */
    public void getBanner() {
        EasyHttp.post(this)
                .api(new BannerListApi())
                .request(new OnHttpListener<HttpData<List<BannerListApi.Bean>>>() {
                    @Override
                    public void onSucceed(HttpData<List<BannerListApi.Bean>> result) {
                        mBannerList = result.getRows();
                        mBannerImageAdapter.setDatas(mBannerList);
                        mBannerImageAdapter.notifyDataSetChanged();
                    }
                    @Override
                    public void onFail(Exception e) {

                    }
                });
    }

    /**
     * 退出登录
     */
    public void showConfirmEdit() {
        new ConfirmDialog.Builder(getContext())
                .setTitle("确定要退出吗?")
                .setCancelText("确定退出")
                .setConfirmText("我再想想")
                .setListener(new ConfirmDialog.OnListener() {
                    @Override
                    public void onConfirm(BaseDialog dialog) {
                    }

                    @Override
                    public void onCancel(BaseDialog dialog) {
                        UserManager.getInstance().logOut();
                    }
                })
                .show();
    }

    /**
     * 签到
     */
    private void userSign() {
        if (UserManager.getInstance().getUserBean().isSignFlg()) {
            return;
        }
        showDialog();
        EasyHttp.post(this)
                .api(new SignApi())
                .request(new OnHttpListener<HttpData<Void>>() {
                    @Override
                    public void onSucceed(HttpData result) {
                        hideDialog();
                        toast(result.getMessage());
                        //更新用户信息
                        UserManager.getInstance().getUserInfo();
                        //更新签到日期
                        getSignData();
                    }

                    @Override
                    public void onFail(Exception e) {
                        hideDialog();
                        toast(e.getMessage());
                    }
                });
    }

    /**
     * 监听用户信息变化
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEventBus(UserInfoEvent userInfoEvent) {
        initUserInfo();
    }


    /**
     * {@link com.haibin.calendarview.CalendarView.OnMonthChangeListener}
     */
    @Override
    public void onMonthChange(int year, int month) {
        mTvNowTime.setText(String.format(Locale.getDefault(),"%d-%d", year, month));
    }
}