package com.hjx.parent.dialog; import android.annotation.SuppressLint; import android.content.Context; import android.util.Pair; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Toast; import androidx.annotation.NonNull; import com.bigkoo.pickerview.builder.TimePickerBuilder; import com.google.gson.Gson; import com.hjx.parent.R; import com.hjx.parent.bean.StudentBean; import com.hjx.parent.databinding.DialogAddHomeworkBinding; import com.hjx.parent.function.Function0; import com.hjx.parent.function.Function1; import com.hjx.parent.rx.BaseRxActivity; import com.prws.common.bean.GradeAndSubject; import com.prws.common.bean.ResponseResult; import com.prws.common.bean.Student; import com.prws.common.bean.Subject; import com.prws.common.bean.baidu.BaiduInput; import com.prws.common.net.NetWorks; import com.prws.common.utils.SharedPreferencesUtil; import com.trello.rxlifecycle2.android.RxLifecycleAndroid; import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; 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 AddHomeworkDialog extends BaseDialog{ private final BaseRxActivity activity; private Function1 callback; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日", Locale.CHINA); List studentList; List gradeAndSubjectList; List images; Student student; String grade; String term; String subject; Date uploadTime = new Date(); public AddHomeworkDialog(BaseRxActivity context) { super((Context) context); activity = context; } public void show(List paths, Function1 callback) { images = paths; this.callback = callback; super.show(); } @SuppressLint("SetTextI18n") @Override public void initView() { binding.btnClose.setOnClickListener(v -> dismiss()); binding.spStudent.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { student = studentList.get(position); if (gradeAndSubjectList == null) return; int p = 0; for (GradeAndSubject it: gradeAndSubjectList) { if (it.getGrade().getGrade().equals(student.grade)) { p = gradeAndSubjectList.indexOf(it); break; } } binding.spGrade.setSelection(p); } @Override public void onNothingSelected(AdapterView parent) { } }); binding.spTerm.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { term = getContext().getResources().getStringArray(R.array.grade_array)[position]; } @Override public void onNothingSelected(AdapterView parent) { } }); binding.spGrade.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { grade = gradeAndSubjectList.get(position).getGrade().getGrade(); refreshSubjects(position); } @Override public void onNothingSelected(AdapterView parent) { } }); binding.tvDate.setText(dateFormat.format(uploadTime)); binding.tvDate.setOnClickListener(v -> { new TimePickerBuilder(getContext(), (date, v1) -> { uploadTime = date; binding.tvDate.setText(dateFormat.format(uploadTime)); binding.etName.setText(dateFormat.format(uploadTime) + subject + "作业"); }).setType(new boolean[]{true, true, true, false, false, false}).isDialog(true).build().show(); }); binding.btnConfirm.setOnClickListener(v -> { String name = binding.etName.getText().toString().trim(); if (name.isEmpty()) { Toast.makeText(getContext(), "请输入作业名称", Toast.LENGTH_SHORT).show(); return; } uploadImage(name); }); getGrade(); } private String getCurrentStuId() { String student = (String) SharedPreferencesUtil.getData("student", ""); StudentBean studentBean = new Gson().fromJson(student, StudentBean.class); return studentBean.getStuId(); } @SuppressLint("CheckResult") private void getStudents() { NetWorks.listStudent() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .compose(RxLifecycleAndroid.bindActivity(activity.getRxLifecycle())) .map(ResponseResult::getData) .subscribe((data, th) -> { if (th != null) th.printStackTrace(); if (data != null && data.size() > 0) { studentList = data; int position = 0; String stuId = getCurrentStuId(); for (int i = 0; i < data.size(); i++) { if (data.get(i).stuId.equals(stuId)) { position = i; break; } } binding.spStudent.setAdapter(new ArrayAdapter<>(getContext(), R.layout.item_spinner, data)); binding.spStudent.setSelection(position); } }); } @SuppressLint("CheckResult") private void getGrade() { NetWorks.service_url.listGradeAndSubject(NetWorks.getHeader()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .compose(RxLifecycleAndroid.bindActivity(activity.getRxLifecycle())) .map(ResponseResult::getData) .firstOrError() .subscribe((data, th) -> { if (th != null) th.printStackTrace(); if (data != null && data.size() > 0) { gradeAndSubjectList = data; List grades = new ArrayList<>(); for (GradeAndSubject it: data) { grades.add(it.getGrade().getGrade()); } binding.spGrade.setAdapter(new ArrayAdapter<>(getContext(), R.layout.item_spinner, grades)); } getStudents(); }); } private void refreshSubjects(int gradePosition) { if (gradeAndSubjectList == null) return; List subjectList = gradeAndSubjectList.get(gradePosition).getSubjects(); List subjects = new ArrayList<>(); for (Subject s: subjectList) { subjects.add(s.getSubject()); } binding.spSubject.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @SuppressLint("SetTextI18n") @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { subject = subjects.get(position); binding.etName.setText(dateFormat.format(uploadTime) + subject + "作业"); } @Override public void onNothingSelected(AdapterView parent) { } }); binding.spSubject.setAdapter(new ArrayAdapter<>(getContext(), R.layout.item_spinner, subjects)); } @SuppressLint("CheckResult") public void uploadImage(String name) { activity.showLoadingDialog("上传作业中..."); Observable.fromIterable(images) .map(path -> { int index = images.indexOf(path); return new Pair<>(index, path); }) .subscribeOn(Schedulers.io()) .flatMap(pair -> { int index = pair.first; String path = pair.second; File file = new File(path); String id = file.getName().substring(0, file.getName().lastIndexOf(".")); return Observable.just(file) .map(var -> { BaiduInput baiduInput = NetWorks.inputImage(path, id).blockingGet(); if (baiduInput.getError_code() != null) { throw new RuntimeException("图片入库失败"); } else { return baiduInput; } }) .map(var -> NetWorks.uploadImage(path, id).blockingGet()) .map(var -> { Map map = new HashMap<>(); map.put("brief", id); map.put("sort", index); return map; }); }, 2) .toList() .map(list -> { List stuIds = new ArrayList<>(); stuIds.add(student.stuId); String userId = NetWorks.getUserId(); Map map = new HashMap<>(); map.put("name", name); map.put("grade", grade); map.put("term", term); map.put("subject", subject); map.put("userId", userId); map.put("stuIds", stuIds); map.put("briefList", list); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); map.put("uploadTime", format.format(uploadTime)); return map; }) .flatMap(body -> { return NetWorks.service_url.uploadHomework(NetWorks.getHeader(), body); }) .observeOn(AndroidSchedulers.mainThread()) .compose(RxLifecycleAndroid.bindActivity(activity.getRxLifecycle())) .subscribe((response, th) -> { if (th != null) th.printStackTrace(); if (response != null && response.getSuccess()) { activity.cancelLoadingDialog(); dismiss(); if (callback != null) callback.invoke(student); } else { activity.loadFail("上传作业失败"); } }) ; } @NonNull @Override public DialogAddHomeworkBinding getBinding() { return DialogAddHomeworkBinding.inflate(getLayoutInflater()); } }