package com.hjx.parent; import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.LinearLayout; import android.widget.PopupWindow; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.MutableLiveData; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.BaseViewHolder; import com.google.android.material.tabs.TabLayout; import com.google.gson.Gson; import com.hjx.parent.adapter.HomeworkListAdapter; import com.hjx.parent.databinding.ActivityStudentHomeworkBinding; import com.hjx.parent.databinding.PopupFilterFeedbackBinding; import com.hjx.parent.databinding.PopupFilterGradeBinding; import com.hjx.parent.databinding.PopupFilterSubjectBinding; import com.hjx.parent.databinding.PopupFilterTermBinding; import com.hjx.parent.dialog.MsgConfirmDialog; import com.hjx.parent.dialog.StageHuyouDialog; import com.hjx.parent.function.Function1; import com.hjx.parent.rx.BaseRxActivity; import com.prws.common.bean.ResponseResult; import com.prws.common.bean.Student; import com.prws.common.bean.homework.HomeworkList; import com.prws.common.bean.homework.StDetail; import com.prws.common.net.NetWorks; import com.prws.common.utils.SharedPreferencesUtil; import com.trello.rxlifecycle2.android.RxLifecycleAndroid; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; public class StuHomeworkActivity extends BaseRxActivity { private final HomeworkListAdapter homeworkAdapter = new HomeworkListAdapter(); private final List mWeekList = new ArrayList<>(); private final List mStageList = new ArrayList<>(); private final HuyouAdapter weekAdapter = new HuyouAdapter(mWeekList); private final HuyouAdapter stageAdapter = new HuyouAdapter(mStageList); PopupWindow subjectFilter, gradeFilter, termFilter, feedbackFilter; MsgConfirmDialog deleteDialog; StageHuyouDialog stageHuyouDialog; State state = new State(); private void handlerIntent() { String json = getIntent().getStringExtra("studentJson"); if (json == null) json = (String) SharedPreferencesUtil.getData("student", ""); try { state.student = new Gson().fromJson(json, Student.class); } catch (Throwable t) { t.printStackTrace(); } } @SuppressLint("SetTextI18n") @Override public void initView(Bundle savedInstanceState) { handlerIntent(); if (state.student == null) { finish(); return; } binding.toolbar.setNavigationOnClickListener(v -> onBackPressed()); binding.tvTitle.setText(state.student.stuName + "的全部作业"); setupTab(); binding.recyclerView.setAdapter(homeworkAdapter); deleteDialog = new MsgConfirmDialog.Builder(this) .setMessage("确认要删除吗?一旦删除不可恢复") .setPositive("暂不删除") .setNegative("确定删除") .build(); binding.ftSubject.setOnClickListener(v -> showSubjectFilter()); binding.ftGrade.setOnClickListener(v -> showGradeFilter()); binding.ftTerm.setOnClickListener(v -> showTermFilter()); binding.ftFeedback.setOnClickListener(v -> showFeedbackFilter()); homeworkAdapter.deleteCall = data -> { deleteDialog.show(null, () -> { deleteHomework(data); return true; }); }; homeworkAdapter.detailCall = data -> { if (data.getRight() == null) { Intent intent = new Intent(this, HomeworkDetailActivity.class); intent.putExtra("data", data); intent.putExtra("student", state.student); startActivity(intent); } else { Intent intent = new Intent(this, HomeworkShareActivity.class); intent.putExtra("student", state.student); intent.putExtra("id", data.getId()); intent.putExtra("grade", data.getGrade()); intent.putExtra("subject", data.getSubject()); startActivity(intent); } }; binding.btnChangeStudent.setOnClickListener(v -> { Intent intent = new Intent(this, TeacherChooseActivity.class); intent.putExtra("needBack", true); startActivityForResult(intent, 0xA01); }); binding.btnGeneralHuyou.setOnClickListener(v -> generalWeek()); binding.btnStageHuyou.setOnClickListener(v -> { if (stageHuyouDialog == null) stageHuyouDialog = new StageHuyouDialog(this); stageHuyouDialog.show(this::generalStage); }); weekAdapter.detailCall = data -> goHuyou(data, 0); stageAdapter.detailCall = data -> goHuyou(data, 1); weekAdapter.deleteCall = data -> { deleteDialog.show(null, () -> { deleteHuyou(data); return true; }); }; stageAdapter.deleteCall = weekAdapter.deleteCall; getWeekHuyou(); getStageHuyou(); } private void goHuyou(StDetail data, int type) { Intent intent = new Intent(this, HuyouDetailActivity.class); intent.putExtra("id", data.id); intent.putExtra("type", type); intent.putExtra("student", state.student); startActivity(intent); } @Override protected void onStart() { super.onStart(); getHomework(); } @SuppressLint("SetTextI18n") @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 0xA01 && resultCode == RESULT_OK) { String json = (String) SharedPreferencesUtil.getData("student", ""); try { state.student = new Gson().fromJson(json, Student.class); binding.tvTitle.setText(state.student.stuName + "的全部作业"); getHomework(); getWeekHuyou(); getStageHuyou(); } catch (Throwable t) { t.printStackTrace(); } } } private void setupTab() { binding.tabLayout.addTab(binding.tabLayout.newTab().setText("每日作业")); binding.tabLayout.addTab(binding.tabLayout.newTab().setText("每周总结")); binding.tabLayout.addTab(binding.tabLayout.newTab().setText("阶段性总结")); binding.tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { binding.filterBar.setVisibility(View.GONE); binding.weekBar.setVisibility(View.GONE); binding.stageBar.setVisibility(View.GONE); if (tab.getPosition() == 0) { //每日 binding.filterBar.setVisibility(View.VISIBLE); binding.recyclerView.setAdapter(homeworkAdapter); } else if (tab.getPosition() == 1) { //每周 binding.weekBar.setVisibility(View.VISIBLE); binding.recyclerView.setAdapter(weekAdapter); } else if (tab.getPosition() == 2) { //阶段 binding.stageBar.setVisibility(View.VISIBLE); binding.recyclerView.setAdapter(stageAdapter); } } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); } @SuppressLint("CheckResult") protected void deleteHomework(HomeworkList data) { NetWorks.service_url.deleteHomework(NetWorks.getHeader(), data.getId()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .compose(RxLifecycleAndroid.bindActivity(getRxLifecycle())) .subscribe((response, th) -> { if (th != null) th.printStackTrace(); if (response != null && response.getSuccess()) { getHomework(); } }); } @SuppressLint("CheckResult") protected void getHomework() { NetWorks.service_url.getStudentHomework(NetWorks.getHeader(), state.student.stuId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .compose(RxLifecycleAndroid.bindActivity(getRxLifecycle())) .toObservable() .concatMap(response -> Observable.fromIterable(response.getData())) // 过滤 .filter(data -> { // 学科 String subject = state.subject.getValue(); if (subject == null || subject.isEmpty()) return true; else return subject.equals(data.getSubject()); }) .filter(data -> { // 年级 String grade = state.grade.getValue(); if (grade == null || grade.isEmpty()) return true; else return grade.equals(data.getGrade()); }) .filter(data -> { // 学期 String term = state.term.getValue(); if (term == null || term.isEmpty()) return true; else return term.equals(data.getTerm()); }) .filter(data -> { // 反馈 Integer feedback = state.feedback.getValue(); if (feedback == null || feedback == 0) return true; else return (feedback == 1 && data.getRight() != null) || (feedback == 2 && data.getRight() == null); }) // 过滤完成, 收集 .toList() .subscribe((data, th) -> { if (th != null) th.printStackTrace(); if (data != null) { Collections.sort(data); } homeworkAdapter.setNewData(data); }); } @SuppressLint({"CheckResult", "NotifyDataSetChanged"}) private void getWeekHuyou() { NetWorks.service_url.getHuyouList(NetWorks.getHeader(), state.student.stuId, 0) .compose(transformSingle()) .map(ResponseResult::getData) .subscribe((list, throwable) -> { if (throwable != null) { throwable.printStackTrace(); return; } if (list != null) { mWeekList.clear(); mWeekList.addAll(list); weekAdapter.notifyDataSetChanged(); boolean exist = false; int thisWeek = Calendar.getInstance().get(Calendar.WEEK_OF_YEAR); for (StDetail bean: mWeekList) { Calendar other = Calendar.getInstance(); other.setTime(bean.endTime); if (other.get(Calendar.WEEK_OF_YEAR) == thisWeek) { exist = true; break; } } binding.btnGeneralHuyou.setVisibility(exist ? View.GONE : View.VISIBLE); } }); } @SuppressLint({"CheckResult", "NotifyDataSetChanged"}) private void getStageHuyou() { NetWorks.service_url.getHuyouList(NetWorks.getHeader(), state.student.stuId, 1) .compose(transformSingle()) .map(ResponseResult::getData) .subscribe((list, throwable) -> { if (throwable != null) { throwable.printStackTrace(); return; } if (list != null) { mStageList.clear(); mStageList.addAll(list); stageAdapter.notifyDataSetChanged(); } }); } @SuppressLint("CheckResult") private void generalWeek() { showLoadingDialog("稍等..."); NetWorks.service_url.generalHuyou() .compose(transformSingle()) .subscribe((response, throwable) -> { cancelLoadingDialog(); if (throwable != null) { loadFail("失败"); throwable.printStackTrace(); return; } if (response != null && response.getSuccess()) { binding.btnGeneralHuyou.setVisibility(View.GONE); getWeekHuyou(); } }); } @SuppressLint("CheckResult") private void generalStage(Date startDate, Date endDate, String subject) { SimpleDateFormat format = new SimpleDateFormat("yyy-MM-dd HH:mm:ss", Locale.CHINA); Map body = new HashMap<>(); body.put("stuId", state.student.stuId); body.put("startTime", format.format(startDate)); body.put("endTime", format.format(endDate)); body.put("subject", subject); showLoadingDialog("稍等..."); NetWorks.service_url.generalStageHuyou(NetWorks.getHeader(), body) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .compose(RxLifecycleAndroid.bindActivity(getRxLifecycle())) .subscribe((response, throwable) -> { if (throwable != null) { loadFail("失败"); throwable.printStackTrace(); return; } if (response.getSuccess()) { getStageHuyou(); cancelLoadingDialog(); } else { loadFail(response.getMsg()); } }); } @SuppressLint("CheckResult") private void deleteHuyou(StDetail detail) { showLoadingDialog("稍等..."); NetWorks.service_url.deleteHuyou(NetWorks.getHeader(), detail.id) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .compose(RxLifecycleAndroid.bindActivity(getRxLifecycle())) .subscribe((response, throwable) -> { cancelLoadingDialog(); if (throwable != null) { loadFail("失败"); throwable.printStackTrace(); return; } if (detail.type == 0) { getWeekHuyou(); } else { getStageHuyou(); } }); } private void showSubjectFilter() { if (subjectFilter == null) { PopupFilterSubjectBinding db = PopupFilterSubjectBinding.inflate(getLayoutInflater()); db.setLifecycleOwner(this); db.setState(state); db.bg.setOnClickListener(v -> subjectFilter.dismiss()); subjectFilter = new PopupWindow(db.getRoot(), LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); subjectFilter.setOutsideTouchable(true); } subjectFilter.showAsDropDown(binding.anchorView); state.onFilter = i -> { subjectFilter.dismiss(); String subject = state.subject.getValue(); binding.ftSubject.setActivated(subject != null && !subject.isEmpty()); binding.ftSubject.setText(subject == null || subject.isEmpty() ? "学科" : subject); getHomework(); }; } private void showGradeFilter() { if (gradeFilter == null) { PopupFilterGradeBinding db = PopupFilterGradeBinding.inflate(getLayoutInflater()); db.setLifecycleOwner(this); db.setState(state); db.bg.setOnClickListener(v -> gradeFilter.dismiss()); gradeFilter = new PopupWindow(db.getRoot(), LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); gradeFilter.setOutsideTouchable(true); } gradeFilter.showAsDropDown(binding.anchorView); state.onFilter = i -> { gradeFilter.dismiss(); String grade = state.grade.getValue(); binding.ftGrade.setActivated(grade != null && !grade.isEmpty()); binding.ftGrade.setText(grade == null || grade.isEmpty() ? "年级" : grade); getHomework(); }; } private void showTermFilter() { if (termFilter == null) { PopupFilterTermBinding db = PopupFilterTermBinding.inflate(getLayoutInflater()); db.setLifecycleOwner(this); db.setState(state); db.bg.setOnClickListener(v -> termFilter.dismiss()); termFilter = new PopupWindow(db.getRoot(), LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); termFilter.setOutsideTouchable(true); } termFilter.showAsDropDown(binding.anchorView); state.onFilter = i -> { termFilter.dismiss(); String term = state.term.getValue(); binding.ftTerm.setActivated(term != null && !term.isEmpty()); binding.ftTerm.setText(term == null || term.isEmpty() ? "学期" : term); getHomework(); }; } private void showFeedbackFilter() { if (feedbackFilter == null) { PopupFilterFeedbackBinding db = PopupFilterFeedbackBinding.inflate(getLayoutInflater()); db.setLifecycleOwner(this); db.setState(state); db.bg.setOnClickListener(v -> feedbackFilter.dismiss()); feedbackFilter = new PopupWindow(db.getRoot(), LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); feedbackFilter.setOutsideTouchable(true); } feedbackFilter.showAsDropDown(binding.anchorView); state.onFilter = i -> { feedbackFilter.dismiss(); int feedback = state.feedback.getValue().intValue(); binding.ftFeedback.setActivated(feedback != 0); binding.ftFeedback.setText(feedback == 0 ? "反馈状态" : feedback == 1 ? "已反馈" : "未反馈"); getHomework(); }; } @Override protected ActivityStudentHomeworkBinding getViewBinding() { return ActivityStudentHomeworkBinding.inflate(getLayoutInflater()); } public static class State { public Student student; public Function1 onFilter = i -> { }; public MutableLiveData subject = new MutableLiveData<>(""); public void setSubject(String value) { subject.setValue(value); onFilter.invoke(1); } public MutableLiveData grade = new MutableLiveData<>(""); public void setGrade(String value) { grade.setValue(value); onFilter.invoke(2); } public MutableLiveData term = new MutableLiveData<>(""); public void setTerm(String value) { term.setValue(value); onFilter.invoke(3); } //0:全部, 1: 已反馈, 2:未反馈 public MutableLiveData feedback = new MutableLiveData<>(0); public void setFeedback(int value) { feedback.setValue(value); onFilter.invoke(4); } } static class HuyouAdapter extends BaseQuickAdapter { public Function1 deleteCall; public Function1 detailCall; public Student student; public HuyouAdapter(@Nullable List data) { super(R.layout.item_homework_list, data); } @SuppressLint("SetTextI18n,SimpleDateFormat") @Override protected void convert(@NonNull BaseViewHolder holder, StDetail data) { holder.setGone(R.id.tvFlag, false); int subjectImg; switch (data.homeworkSubject) { case "语文": subjectImg = R.drawable.ic_chinese; break; case "英语": subjectImg = R.drawable.ic_english; break; case "物理": subjectImg = R.drawable.ic_physics; break; case "化学": subjectImg = R.drawable.ic_chemistry; break; case "数学": default: subjectImg = R.drawable.ic_math; } holder.setImageResource(R.id.ivSubject, subjectImg); Date endDate = new Date(data.endTime.getTime() - 1000); String startStr = new SimpleDateFormat("yyyy.M.d").format(data.startTime); String endStr = new SimpleDateFormat("-M.d").format(endDate); String typeStr = data.type == 0 ? "作业周总结" : "作业阶段性总结"; String title = startStr + endStr + data.homeworkSubject + typeStr; holder.setText(R.id.tvName, title); holder.setText(R.id.tvGrade, data.grade); View btnDelete = holder.getView(R.id.btnDelete); View btnDetail = holder.getView(R.id.btnDetail); btnDelete.setOnClickListener(v -> { if (deleteCall != null) deleteCall.invoke(data); }); btnDetail.setOnClickListener(v -> { if (detailCall != null) detailCall.invoke(data); }); } private SimpleDateFormat getFormatWithGmt8(String pattern) { SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.CHINA); //format.setTimeZone(TimeZone.getTimeZone("GMT+16")); return format; } } }