ErrorFragment.java 16.8 KB
package com.hjx.parent.fragment;

import static android.app.Activity.RESULT_OK;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.FileProvider;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
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.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
import com.hjx.parent.ErrorListActivity;
import com.hjx.parent.ImageActivity;
import com.hjx.parent.R;
import com.hjx.parent.TeacherChooseActivity;
import com.hjx.parent.adapter.ErrorAdapter;
import com.hjx.parent.adapter.HomeworkAdapter;
import com.hjx.parent.bean.StudentBean;
import com.hjx.parent.databinding.FragmentErrorBookBinding;
import com.hjx.parent.rx.BaseRxFragment;
import com.prws.common.bean.PageInfo;
import com.prws.common.bean.ResponseResult;
import com.prws.common.bean.TopicBean;
import com.prws.common.net.NetWorks;
import com.prws.common.utils.BitmapUtils;
import com.prws.common.utils.CommonUtil;
import com.prws.common.utils.ScreenUtils;
import com.prws.common.utils.SharedPreferencesUtil;
import com.prws.common.utils.dialog.MyButtomDialog;
import com.trello.rxlifecycle2.android.RxLifecycleAndroid;
import com.zhangteng.imagepicker.bean.ImageInfo;
import com.zhangteng.imagepicker.config.ImagePickerConfig;
import com.zhangteng.imagepicker.config.ImagePickerEnum;
import com.zhangteng.imagepicker.config.ImagePickerOpen;
import com.zhangteng.imagepicker.imageloader.GlideImageLoader;
import com.zhangteng.utils.IHandlerCallBack;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;

public class ErrorFragment extends BaseRxFragment<FragmentErrorBookBinding> {
    StudentBean studentBean;
    private int subject;
    private ErrorAdapter errorAdapter;
    private HomeworkAdapter homeworkAdapter;
    private int REQUEST_CODE_IMAGE = 123;
    private String filePath;

    @Override
    protected FragmentErrorBookBinding onCreateViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent) {
        return FragmentErrorBookBinding.inflate(inflater, parent, false);
    }

    public void refreshStudent() {
        String student = (String) SharedPreferencesUtil.getData("student", "");
        try {
            studentBean = new Gson().fromJson(student, StudentBean.class);
            getBinding().tvChoose.setText(studentBean.getStuName());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        String photo = (String) SharedPreferencesUtil.getData("photo", "");
        if (!TextUtils.isEmpty(photo)) {
            RoundedCorners roundedCorners = new RoundedCorners(ScreenUtils.dpToPx(getContext(), 45));
            RequestOptions options = RequestOptions.bitmapTransform(roundedCorners);
            Glide.with(getContext()).load(photo).apply(options).into(getBinding().ivStudent);
        }
        String name = (String) SharedPreferencesUtil.getData("name", "");
        getBinding().tvName.setText(name);
        refreshStudent();
        getBinding().tvChoose.setOnClickListener(v -> startActivity(new Intent(getContext(), TeacherChooseActivity.class)));
        getBinding().rlTakePhoto.setOnClickListener(v -> {
            if (!XXPermissions.isGranted(getContext(), Permission.CAMERA, Permission.WRITE_EXTERNAL_STORAGE)) {
                XXPermissions.with(getContext())
                        // 申请多个权限
                        .permission(Permission.CAMERA).request(new OnPermissionCallback() {
                            @Override
                            public void onGranted(List<String> permissions, boolean all) {
                                if (all) {
                                    //开启扫码界面
                                    showButtonDialog();
                                } else {
                                    Toast.makeText(getContext(), "需要权限", Toast.LENGTH_SHORT).show();
                                }
                            }

                            @Override
                            public void onDenied(List<String> permissions, boolean never) {
                                XXPermissions.startPermissionActivity(getContext(), permissions);
                            }
                        });
            } else {
                showButtonDialog();
            }

        });
        BaseQuickAdapter adapter = new BaseQuickAdapter(R.layout.item_subject, Arrays.asList(getResources().getStringArray(R.array.filter_subject))) {
            @Override
            public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

            }

            @Override
            protected void convert(@NonNull BaseViewHolder item, Object o) {
                item.setText(R.id.tv_subject, getResources().getStringArray(R.array.filter_subject)[item.getAdapterPosition()]);
                switch (item.getAdapterPosition()) {
                    case 0:
                        item.setImageResource(R.id.iv_subject, R.mipmap.ic_chinese);
                        break;
                    case 1:
                        item.setImageResource(R.id.iv_subject, R.mipmap.ic_math);
                        break;
                    case 2:
                        item.setImageResource(R.id.iv_subject, R.mipmap.ic_english);
                        break;
                    case 3:
                        item.setImageResource(R.id.iv_subject, R.mipmap.ic_physics);
                        break;
                    case 4:
                        item.setImageResource(R.id.iv_subject, R.mipmap.ic_chemistry);
                        break;
                }
                ViewGroup.LayoutParams layoutParams = item.getView(R.id.rl_subject).getLayoutParams();
                layoutParams.width = (CommonUtil.getScreenWidth(getContext()) - CommonUtil.dpToPx(getContext(), 30)) / 4;
                item.getView(R.id.rl_subject).setLayoutParams(layoutParams);
                item.getConvertView().setOnClickListener(v -> {
                    if (subject != item.getAdapterPosition()) {
                        subject = item.getAdapterPosition();
                        String subStr = getResources().getStringArray(R.array.filter_subject)[subject];
                        if (binding.tabLayout.getSelectedTabPosition() == 0) {
                            getError(subStr);
                        } else {
                            // nothing can do
                        }
                    }
                });
            }
        };
        getBinding().rvSubject.setAdapter(adapter);
        subject = 0;
        getError(getResources().getStringArray(R.array.filter_subject)[subject]);
        getBinding().llAll.setOnClickListener(v -> {
            Intent intent = new Intent(getContext(), ErrorListActivity.class);
            startActivity(intent);
        });

        errorAdapter = new ErrorAdapter(getActivity(), new ArrayList<>(), false);
        homeworkAdapter = new HomeworkAdapter();
        binding.rvMain.setAdapter(errorAdapter);
        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) {
                if (tab.getPosition() == 0) {
                    binding.rvMain.setAdapter(errorAdapter);
                    binding.rvMain.setVisibility(errorAdapter.list.isEmpty() ? View.GONE : View.VISIBLE);
                    binding.llEmpty.setVisibility(errorAdapter.list.isEmpty() ? View.VISIBLE : View.GONE);
                } else {
                    binding.rvMain.setAdapter(homeworkAdapter);
                    binding.rvMain.setVisibility(View.VISIBLE);
                    binding.llEmpty.setVisibility(View.GONE);
                }
            }
            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
            }
            @Override
            public void onTabReselected(TabLayout.Tab tab) {
            }
        });
    }

    private void showButtonDialog() {
        MyButtomDialog dialog = new MyButtomDialog(getActivity(), R.style.BottomSheetDialog);
        View bottomView = LayoutInflater.from(getActivity()).inflate(R.layout.bottom_sheet_layout, null);
        dialog.setContentView(bottomView);
        bottomView.findViewById(R.id.take_photo).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
                Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                //确保有相机来处理Intent
                filePath = getActivity().getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
                File photoFile = new File(filePath);
                if (photoFile != null) {
                    //适配Android 7.0文件权限,通过FileProvider创建一个content类型的Uri
                    Uri photoUri = FileProvider.getUriForFile(getActivity(), "com.hjx.parent.fileprovider", photoFile);
                    takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
                    startActivityForResult(takePictureIntent, REQUEST_CODE_IMAGE);
                }
            }
        });
        bottomView.findViewById(R.id.choose_photo).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
                ImagePickerConfig imagePickerConfig = new ImagePickerConfig.Builder().provider(getActivity().getPackageName() + ".fileprovider").imageLoader(new GlideImageLoader()) //图片加载器
                        .iHandlerCallBack(new HandlerCallBack())    //图片选择器生命周期监听(直接打开摄像头时无效)
                        .multiSelect(true)                 //是否多选
                        .isShowCamera(false).isVideoPicker(false)              //是否选择视频 默认false
                        .isImagePicker(true).imagePickerType(ImagePickerEnum.PHOTO_PICKER) //选择器打开类型
                        .maxImageSelectable(5)                        //图片可选择数
                        .maxHeight(1920)                              //图片最大高度
                        .maxWidth(1920)                               //图片最大宽度
                        .maxImageSize(3)                             //图片最大大小Mb
                        .isCrop(false).pathList(new ArrayList<>()).pickerThemeColorRes(R.color.image_picker_white).pickerTitleColorRes(R.color.image_picker_text_black).cropThemeColorRes(R.color.image_picker_white).cropTitleColorRes(R.color.image_picker_text_black).pickerBackRes(R.mipmap.image_picker_back_black).pickerFolderRes(R.mipmap.image_picker_folder_black).build();
                ImagePickerOpen.getInstance().setImagePickerConfig(imagePickerConfig).pathList(new ArrayList<>()).open(getActivity());

            }
        });
        bottomView.findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
            }
        });
        dialog.show();
    }

    @SuppressLint("CheckResult")
    protected void getHomework() {
        if (studentBean == null) return;
        NetWorks.service_url.getStudentHomework(NetWorks.getHeader(), studentBean.getStuId())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .compose(RxLifecycleAndroid.bindFragment(getRxLifecycle()))
                .map(ResponseResult::getData)
                .subscribe((data, th) -> {
                    if (th != null) th.printStackTrace();
                    homeworkAdapter.setNewData(data);
                });
    }

    private void getError(String subject) {
        if (studentBean == null) {
            return;
        }
        Map<String, Object> map = new HashMap<>();
        map.put("subject", subject);
        map.put("stuId", studentBean.getStuId());
        map.put("pageSize", 5);
        map.put("pageNum", 1);
        NetWorks.getError(map, new Observer<ResponseResult<PageInfo<TopicBean>>>() {
            @Override
            public void onSubscribe(Disposable d) {
            }
            @Override
            public void onNext(ResponseResult<PageInfo<TopicBean>> result) {
                if (result.getData() != null && result.getCode() == 200) {
                    List<TopicBean> topicBeans = result.getData().getList();
                    errorAdapter.refresh(topicBeans);
                    if (binding.tabLayout.getSelectedTabPosition() == 0) {
                        if (topicBeans.size() > 0) {
                            getBinding().rvMain.setVisibility(View.VISIBLE);
                            getBinding().llEmpty.setVisibility(View.GONE);
                        } else {
                            getBinding().rvMain.setVisibility(View.GONE);
                            getBinding().llEmpty.setVisibility(View.VISIBLE);
                        }
                    }
                }
            }
            @Override
            public void onError(Throwable e) {
                e.printStackTrace();
            }
            @Override
            public void onComplete() {
            }
        });
    }

    @Override
    public void onResume() {
        super.onResume();
        getError(getResources().getStringArray(R.array.filter_subject)[subject]);
        getHomework();
    }

    public class HandlerCallBack implements IHandlerCallBack<ImageInfo> {
        private String TAG = "---ImagePicker---";
        List<ImageInfo> photoList = new ArrayList<>();

        @Override
        public void onStart() {
            Log.i(TAG, "onStart: 开启");
        }

        @Override
        public void onSuccess(List<ImageInfo> photoList) {
            this.photoList = photoList;
            Log.i(TAG, "onSuccess: 返回数据");
        }

        @Override
        public void onCancel() {
            Log.i(TAG, "onCancel: 取消");
        }

        @Override
        public void onFinish(List<ImageInfo> selectImage) {
            if (selectImage.size() == photoList.size()) {
                List<String> strings = new ArrayList<>();
                Intent intent = new Intent(getActivity(), ImageActivity.class);
                for (ImageInfo imageInfo : selectImage) {
                    strings.add(imageInfo.getPath());
                }
                intent.putStringArrayListExtra("images", (ArrayList<String>) strings);
                startActivity(intent);
            }
        }

        @Override
        public void onError() {
            Log.i(TAG, "onError: 出错");
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_IMAGE && resultCode == RESULT_OK && !TextUtils.isEmpty(filePath)) {
            Bitmap b = BitmapUtils.compress(BitmapFactory.decodeFile(filePath));
            String path = getContext().getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
            CommonUtil.saveBitmapToUri(b, path);
            List<String> strings = new ArrayList<>();
            Intent intent = new Intent(getContext(), ImageActivity.class);
            strings.add(path);
            intent.putStringArrayListExtra("images", (ArrayList<String>) strings);
            startActivity(intent);
        }
    }
}