HomeworkShareActivity.java 12.4 KB
package com.hjx.parent;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.text.Html;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.bumptech.glide.Glide;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.google.gson.Gson;
import com.gyf.immersionbar.ImmersionBar;
import com.hjx.parent.databinding.ActivityHomeworkShareBinding;
import com.hjx.parent.dialog.PhotoViewDialog;
import com.hjx.parent.rx.BaseRxActivity;
import com.prws.common.bean.ResponseResult;
import com.prws.common.bean.Student;
import com.prws.common.bean.homework.HomeWork;
import com.prws.common.bean.homework.HomeworkDetail;
import com.prws.common.bean.homework.KeyValue;
import com.prws.common.net.NetWorks;
import com.prws.common.utils.BitmapUtils;
import com.prws.common.utils.CommonUtil;
import com.prws.common.utils.ContentUtil;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;

import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;

public class HomeworkShareActivity extends BaseRxActivity<ActivityHomeworkShareBinding> {
    private String id;

    String indent = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";

    private String title;
    private Student student;
    private ErrorAdapter mAdapter = new ErrorAdapter();

    private Uri shareUri;

    @SuppressLint("SetTextI18n")
    @Override
    public void initView(Bundle savedInstanceState) {
        ImmersionBar.with(this).init();
        binding.btnBack.setOnClickListener(v -> onBackPressed());
        binding.rvWrong.setAdapter(mAdapter);
        mAdapter.setEmptyView(R.layout.empty_statistical_no_error, binding.rvWrong);

        id = getIntent().getStringExtra("id");
        title = getIntent().getStringExtra("name");
        binding.tvTitle.setText(title);
        student = (Student) getIntent().getSerializableExtra("student");
        assert student != null;
        binding.tvStuName.setText(student.stuName);
        Glide.with(this).load(student.photo).centerCrop().error(R.mipmap.ic_avatar_male).into(binding.ivAvatar);
        binding.tvGrade.setText(getIntent().getStringExtra("grade"));
        binding.tvSubject.setText(getIntent().getStringExtra("subject"));

        binding.btnShare.setOnClickListener(v -> {
            if (shareUri == null) shareUri = saveBitmap();
            if (shareUri != null) {
                Intent shareIntent = new Intent(Intent.ACTION_SEND);
                shareIntent.setType("image/jpeg");
                shareIntent.putExtra(Intent.EXTRA_STREAM, shareUri);
                shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

                startActivity(shareIntent);
            }
        });

        loadHomework();
    }

    @SuppressLint("CheckResult")
    private void loadHomework() {
        NetWorks.service_url.getHomeworkCompleteDetail(NetWorks.getHeader(), student.stuId, id, true)
                .compose(transformSingle())
                .map(ResponseResult::getData)
                .map(data -> {
                    if (data.getHomeworkList() == null) return data;
                    for (HomeWork homeWork: data.getHomeworkList()){
                        homeWork.formatPoints(new Gson());
                    }
                    return data;
                })
                .subscribe((data, th) -> {
                    if (th != null) th.printStackTrace();
                    if (data != null) showHomework(data);
                });
    }
    @SuppressLint({"SetTextI18n", "DefaultLocale"})
    private void showHomework(HomeworkDetail detail) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy.M.d", Locale.CHINA);
        binding.tvDate.setText(format.format(detail.getDate()));
        binding.flComment.setVisibility(detail.getComment() == null || detail.getComment().isEmpty() ? View.INVISIBLE : View.VISIBLE);
        binding.tvComment.setText(ifEmpty(detail.getComment(), "-"));
        binding.tvRating.setText("-");

        String temp = indent + "在本次作业中,答对题目有 %s 道,%s掌握的很好;答错题目有 %s 道,错题涵盖的知识点主要有%s,这部分还要再加强学习。错题老师已经帮你收录到错题本中,要记得复习整理错题,及时消灭薄弱知识点。";
        List<HomeWork> errorList = new ArrayList<>();
        List<HomeWork> blankList = new ArrayList<>();
        if (detail.getHomeworkList() != null && detail.getHomeworkList().size() != 0) {
            int total = detail.getHomeworkList().size();
            int correctNum = 0, blankNumber = 0;
            Set<KeyValue> correctSet = new HashSet<>();
            Set<KeyValue> errorSet = new HashSet<>();
            for (HomeWork homeWork: detail.getHomeworkList()) {
                if (homeWork.correction == 0) {
                    correctNum ++;
                    correctSet.addAll(homeWork.pointsObj);
                } else if (homeWork.correction == 1){
                    errorList.add(homeWork);
                    errorSet.addAll(homeWork.pointsObj);
                } else if (homeWork.correction == 2) {
                    blankList.add(homeWork);
                    blankNumber ++;
                }
            }
            StringBuilder correctPoint = new StringBuilder();
            StringBuilder errorPoint = new StringBuilder();
            for (KeyValue point: correctSet) {
                correctPoint.append("、").append(point.Value);
            }
            for (KeyValue point: errorSet) {
                errorPoint.append("、").append(point.Value);
            }
            float rate = 100f * correctNum / Math.max(total - blankNumber, 1);
            int errorNum = errorList.size();
            binding.tvPercent.setText(new DecimalFormat("0").format(rate));
            binding.tvCorrect.setText(String.valueOf(correctNum));
            binding.tvWrong.setText(String.valueOf(errorNum));
            binding.tvBlank.setText(String.valueOf(blankNumber));

            String correct = "-", error = "-";
            if (correctPoint.length() != 0) correct = correctPoint.substring(1);
            if (errorPoint.length() != 0) error = errorPoint.substring(1);
            if (errorNum == 0) {
                temp = indent + "在本次作业中,答对题目有 %s 道,%s掌握的很好。";
                String s = String.format(temp,
                        fromColor(String.valueOf(correctNum), "#489afa"),
                        fromColor(correct, "#489afa")
                );
                binding.tvRating.setText(Html.fromHtml(s, Html.FROM_HTML_MODE_COMPACT));
            } else {
                String s = String.format(temp,
                        fromColor(String.valueOf(correctNum), "#489afa"),
                        fromColor(correct, "#489afa"),
                        fromColor(String.valueOf(errorNum), "#ff4134"),
                        fromColor(error, "#ff4134")
                );
                binding.tvRating.setText(Html.fromHtml(s, Html.FROM_HTML_MODE_COMPACT));
            }
        }

        mAdapter.setNewData(errorList);
        binding.rvBlank.setAdapter(new BlankAdapter(blankList));
        binding.viewBlank.setVisibility(blankList.isEmpty() ? View.GONE : View.VISIBLE);
    }

    private String fromColor(String str, String color) {
        return String.format("<font color='%s'>%s</font>", color, str);
    }

    @Override
    protected ActivityHomeworkShareBinding getViewBinding() {
        return ActivityHomeworkShareBinding.inflate(getLayoutInflater());
    }

    private Uri saveBitmap() {
        try {
            binding.btnShare.setVisibility(View.GONE);
            binding.btnBack.setVisibility(View.GONE);
            Bitmap bitmap = BitmapUtils.shotView(binding.viewRoot);
            binding.btnShare.setVisibility(View.VISIBLE);
            binding.btnBack.setVisibility(View.VISIBLE);

            String fileName = student.stuName + "_" + title;
            return ContentUtil.saveBitmapToGallery(this, bitmap, fileName);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private static String ifEmpty(String s, String placeholder) {
        if (s == null || s.isEmpty()) return placeholder;
        return s;
    }

    public static class BlankAdapter extends BaseQuickAdapter<HomeWork, BaseViewHolder> {

        public BlankAdapter(@Nullable List<HomeWork> data) {
            super(R.layout.item_huyou_daily_blank, data);
        }

        @Override
        protected void convert(@NonNull BaseViewHolder holder, HomeWork homeWork) {
            ImageView imageView = holder.getView(R.id.imageView);
            Glide.with(mContext).load(homeWork.url).into(imageView);
        }
    }

    public static class ErrorAdapter extends BaseQuickAdapter<HomeWork, BaseViewHolder> {

        public ErrorAdapter() {
            super(R.layout.item_homework_error);
        }

        @Override
        protected void convert(@NonNull BaseViewHolder holder, HomeWork homeWork) {
            ImageView ivTopic =  holder.getView(R.id.ivTopic);
            TextView tvPoints = holder.getView(R.id.tvPoints);
            ImageView ivAnalyze = holder.getView(R.id.ivAnalyze);

            showImage(ivTopic, homeWork.url);
            showImage(ivAnalyze, homeWork.analyseUrl);
            tvPoints.setText("-");
            if (homeWork.pointsObj == null || homeWork.pointsObj.isEmpty()) return;
            StringBuilder builder = new StringBuilder();
            for (KeyValue pair: homeWork.pointsObj) {
                builder.append(pair.Value).append("\n");
            }
            tvPoints.setText(ifEmpty(builder.toString().trim(), "-"));
        }

        @SuppressLint("CheckResult")
        private void showImage(ImageView view, String url) {
            view.setVisibility(View.GONE);
            view.setImageBitmap(null);
            if (url == null) {
                return;
            }
            view.setOnClickListener(v -> {
                new PhotoViewDialog(mContext).show(url);
            });
            Single.just(url)
                    .subscribeOn(Schedulers.io())
                    .map(u -> Glide.with(mContext).asBitmap().load(url).submit().get())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe((bitmap, th) -> {
                        if (bitmap == null) return;

                        float imageHeight = bitmap.getHeight();
                        float imageWidth = bitmap.getWidth();
                        int viewHeight = (int) (CommonUtil.getScreenHeight(mContext) * 0.75f);
                        int viewWidth = (int) (CommonUtil.getScreenWidth(mContext) * 0.75f);
                        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(view.getLayoutParams());
                        if (imageHeight > imageWidth) {
                            if (viewHeight > imageHeight) {
                                layoutParams.height = (int) imageHeight;
                                layoutParams.width = (int) imageWidth;
                            } else {
                                layoutParams.height = viewHeight;
                                layoutParams.width = (int) (imageWidth / imageHeight * viewHeight);
                            }
                        } else {
                            if (viewWidth > imageWidth) {
                                layoutParams.height = (int) imageHeight;
                                layoutParams.width = (int) imageWidth;
                            } else {
                                layoutParams.height = (int) (imageHeight / imageWidth * viewWidth);
                                layoutParams.width = viewWidth;
                            }
                        }

                        layoutParams.setMargins(CommonUtil.dpToPx(mContext, 5), CommonUtil.dpToPx(mContext, 5), CommonUtil.dpToPx(mContext, 5), CommonUtil.dpToPx(mContext, 5));
                        view.setLayoutParams(layoutParams);
                        view.setImageBitmap(bitmap);
                        view.setVisibility(View.VISIBLE);
                    });
        }
    }
}