package com.hjx.parent; import android.annotation.SuppressLint; import android.app.Dialog; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Rect; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.provider.MediaStore; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.View; import androidx.annotation.Nullable; import androidx.core.content.FileProvider; import androidx.viewpager2.widget.ViewPager2; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.hjx.parent.adapter.ImageAdapter; import com.hjx.parent.databinding.ActivityImageBinding; import com.hjx.parent.dialog.AddHomeworkDialog; import com.hjx.parent.dialog.ErrorInputDialog; import com.hjx.parent.dialog.PhotoViewDialog; import com.hjx.parent.dialog.TipDialog; import com.hjx.parent.rx.BaseRxActivity; import com.prws.common.bean.CutPicBean; import com.prws.common.bean.ImageBean; 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.xiasuhuei321.loadingdialog.view.LoadingDialog; import java.io.File; import java.util.ArrayList; import java.util.List; import io.reactivex.Observer; import io.reactivex.disposables.Disposable; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; public class ImageActivity extends BaseRxActivity implements View.OnClickListener { private List images = new ArrayList<>(); private ImageAdapter imageAdapter; private List list = new ArrayList<>(); private String filePath; private int type = 0; private AddHomeworkDialog addHomeworkDialog; @Override public void initView(Bundle savedInstanceState) { type = getIntent().getIntExtra("type", 0); binding.tvSave.setText(type == 0 ? "保存错题" : "录入题目"); images = getIntent().getStringArrayListExtra("images"); if (images == null || images.size() <= 1) { binding.rlPrevious.setVisibility(View.GONE); binding.rlNext.setVisibility(View.GONE); } for (String s : images) { String filepath = context.getExternalFilesDir("images").getPath() + "/" + System.currentTimeMillis() + CommonUtil.getStr() + ".jpg"; ImageBean imageBean = new ImageBean(); Bitmap bitmap = BitmapUtils.getimage(s); CommonUtil.saveBitmapToUri(bitmap, filepath); imageBean.setPath(filepath); imageBean.source = filepath; list.add(imageBean); } imageAdapter = new ImageAdapter(this, list); binding.viewPager.setAdapter(imageAdapter); binding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { @Override public void onPageSelected(int position) { if (list.get(position).getCuts() == null) { // binding.ivPrevious.setEnabled(false); // binding.ivNext.setEnabled(false); clearText(); } binding.tvTitle.setText((binding.viewPager.getCurrentItem() + 1) + "/" + list.size()); if (position == 0) { binding.ivPrevious.setImageResource(R.mipmap.ic_previous_gray); // binding.ivPrevious.setEnabled(true); } else { binding.ivPrevious.setImageResource(R.mipmap.ic_previous); // binding.ivPrevious.setEnabled(false); } if (position == list.size() - 1) { binding.ivNext.setImageResource(R.mipmap.ic_next_gray); // binding.ivNext.setEnabled(true); } else { binding.ivNext.setImageResource(R.mipmap.ic_next); // binding.ivNext.setEnabled(false); } super.onPageSelected(position); } }); binding.rlNext.setOnClickListener(this); binding.rlPrevious.setOnClickListener(this); binding.ivBack.setOnClickListener(this); binding.tvPhoto.setOnClickListener(this); binding.tvAdd.setOnClickListener(this); binding.llEdit.setOnClickListener(this); binding.tvSave.setOnClickListener(this); binding.btnShowSource.setOnClickListener(v -> { if (list.isEmpty()) return; ImageBean data = list.get(binding.viewPager.getCurrentItem()); new PhotoViewDialog(this).show(data.source); }); } public void clearText() { int index = binding.viewPager.getCurrentItem(); showLoadingDialog(getString(R.string.loading_text), new LoadingDialog.DismissListener() { @Override public void dimiss() { // binding.ivPrevious.setEnabled(index != 0); // binding.ivNext.setEnabled(index != list.size() - 1); } }); Log.i("clearText", list.get(index).getPath()); String base64 = BitmapUtils.imageToBase64(list.get(index).getPath()); NetWorks.removeWriting(base64, new Observer() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(JsonObject jsonObject) { if (jsonObject != null && jsonObject.get("image_processed") != null) { String image = jsonObject.get("image_processed").getAsString(); if (image != null) { String filepath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg"; CommonUtil.saveBitmapToUri(BitmapUtils.stringToBitmap(image), filepath); list.get(index).setPath(filepath); if (list.get(index).getCuts() == null) { list.get(index).setCuts(new ArrayList<>()); } imageAdapter.notifyItemChanged(index); cut(filepath); } else { loadFail("去除字迹失败"); } } else { loadFail("去除字迹失败"); } } @Override public void onError(Throwable e) { loadFail("去除字迹失败"); } @Override public void onComplete() { } }); } public void cut(String path) { String base64 = BitmapUtils.imageToBase64(path); Log.i("figLoaction", path); NetWorks.cut(base64, new Observer() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(CutPicBean cutPicBean) { if (cutPicBean != null) { if (cutPicBean.getDirection() != 0) { rotatingImage(cutPicBean); } else { if (cutPicBean.getQus_figure() != null && cutPicBean.getQus_figure().size() > 0) { List figLoactions = new ArrayList<>(); for (CutPicBean.CutLocation cutLocation : cutPicBean.getQus_figure()) { figLoactions.add(cutLocation.getFig_location()); } new Handler().postDelayed(new Runnable() { @Override public void run() { getRects(figLoactions); } }, 1000); } else { cancelLoadingDialog(); } } } else { loadFail("自动切题失败"); } } @Override public void onError(Throwable e) { loadFail("自动切题失败"); } @Override public void onComplete() { } }); } private void getRects(List figLoactions) { Log.i("figLoaction", new Gson().toJson(figLoactions)); int index = binding.viewPager.getCurrentItem(); List cuts = new ArrayList<>(); for (CutPicBean.FigLoaction figLoaction : figLoactions) { ImageBean.Cut cut = new ImageBean.Cut(); cut.setRect(figLoaction); cut.setSelect(false); cuts.add(cut); } list.get(index).setCuts(cuts); imageAdapter.notifyItemChanged(index); cancelLoadingDialog(); } private void rotatingImage(CutPicBean cutPicBean) { int index = binding.viewPager.getCurrentItem(); Bitmap bitmap = BitmapFactory.decodeFile(list.get(index).getPath()); int angle = 0; switch (cutPicBean.getDirection()) { case 1: angle = 90; break; case 2: angle = 180; break; case 3: angle = 270; break; } if (cutPicBean.getQus_figure() != null && cutPicBean.getQus_figure().size() > 0) { List figLoactions = new ArrayList<>(); for (CutPicBean.CutLocation cutLocation : cutPicBean.getQus_figure()) { figLoactions.add(cutLocation.getFig_location()); } figLoactions = CommonUtil.rotaingLocation(angle, figLoactions, bitmap.getWidth(), bitmap.getHeight()); bitmap = CommonUtil.rotaingImageView(angle, bitmap); String filepath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg"; CommonUtil.saveBitmapToUri(bitmap, filepath); list.get(index).setPath(filepath); imageAdapter.notifyItemChanged(index); List finalFigLoactions = figLoactions; new Handler().postDelayed(new Runnable() { @Override public void run() { getRects(finalFigLoactions); } }, 500); } else { cancelLoadingDialog(); } } @Override protected ActivityImageBinding getViewBinding() { return ActivityImageBinding.inflate(getLayoutInflater()); } @SuppressLint("SetTextI18n") public void refreshNum() { int num = 0; for (ImageBean imageBean : list) { if (imageBean.getCuts() != null && imageBean.getCuts().size() > 0) { for (ImageBean.Cut cut : imageBean.getCuts()) { if (cut.isSelect()) { num++; } } } } String btnText = type == 0 ? "保存错题" : "录入题目"; if (num > 0) { binding.tvSave.setEnabled(true); binding.tvSave.setBackgroundResource(R.drawable.bg_soild_blue_5); binding.tvSave.setText(btnText + "(" + num + ")"); } else { binding.tvSave.setEnabled(false); binding.tvSave.setBackgroundResource(R.drawable.bg_soild_blue_light_5); binding.tvSave.setText(btnText); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.iv_back: back(); break; case R.id.rl_next: if (binding.viewPager.getCurrentItem() + 1 < list.size()) { binding.viewPager.setCurrentItem(binding.viewPager.getCurrentItem() + 1); } break; case R.id.rl_previous: if (binding.viewPager.getCurrentItem() != 0) { binding.viewPager.setCurrentItem(binding.viewPager.getCurrentItem() - 1); } break; case R.id.ll_edit: Intent intent = new Intent(context, ImageEditActivity.class); intent.putExtra("path", list.get(binding.viewPager.getCurrentItem()).getPath()); startActivityForResult(intent, 1001); break; case R.id.tv_photo: Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //确保有相机来处理Intent filePath = context.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(activity, "com.hjx.parent.fileprovider", photoFile); takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); activity.startActivityForResult(takePictureIntent, 1002); } break; case R.id.tv_add: Intent intent1 = new Intent(context, ImageSelectActivity.class); intent1.putExtra("path", list.get(binding.viewPager.getCurrentItem()).getPath()); intent1.putExtra("source", list.get(binding.viewPager.getCurrentItem()).source); startActivityForResult(intent1, 1001); break; case R.id.tv_save: List topicBeans = new ArrayList<>(); for (ImageBean imageBean : list) { if (imageBean.getCuts() != null && imageBean.getCuts().size() > 0) { for (ImageBean.Cut cut : imageBean.getCuts()) { if (cut.isSelect()) { TopicBean bean = new TopicBean(); String path = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg"; BitmapUtils.saveBitmap(cut.getBitmap(), path); bean.setPath(path); topicBeans.add(bean); } } } } save(topicBeans); break; } } private void save(List topicBeans) { if (type == 0) { ErrorInputDialog dialog = new ErrorInputDialog(this, topicBeans); dialog.show(); } else { List paths = new ArrayList<>(); for (TopicBean it: topicBeans) { paths.add(it.getPath()); } if (addHomeworkDialog == null) { addHomeworkDialog = new AddHomeworkDialog(this); } addHomeworkDialog.show(paths, student -> { Intent intent = new Intent(context, AddSuccessActivity.class); intent.putExtra("type", type); intent.putExtra("studentJson", new Gson().toJson(student)); startActivity(intent); finish(); }); } } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1001) { if (resultCode == 1002) { if (list.size() > 1) { list.remove(binding.viewPager.getCurrentItem()); if (list.size() <= 1) { binding.rlPrevious.setVisibility(View.GONE); binding.rlNext.setVisibility(View.GONE); } imageAdapter.notifyItemRemoved(binding.viewPager.getCurrentItem()); binding.tvTitle.setText((binding.viewPager.getCurrentItem() + 1) + "/" + list.size()); refreshNum(); } else { finish(); } } else if (resultCode == 1003) { int position = binding.viewPager.getCurrentItem(); String src = list.get(position).source; list.remove(position); String path = data.getStringExtra("path"); ImageBean imageBean = new ImageBean(); imageBean.setPath(path); imageBean.source = src; list.add(position, imageBean); imageAdapter.notifyItemChanged(position); clearText(); refreshNum(); } else if (resultCode == 1004) { Rect rect = data.getParcelableExtra("cut"); if (rect != null) { int position = binding.viewPager.getCurrentItem(); ImageBean.Cut cut = new ImageBean.Cut(); cut.setRect1(rect); cut.setSelect(false); if (list.get(position).getCuts() != null) { list.get(position).getCuts().add(cut); } else { List cuts =new ArrayList<>(); cuts.add(cut); list.get(position).setCuts(cuts); } imageAdapter.notifyItemChanged(position); refreshNum(); } } else if (resultCode == 1005) { int i = data.getIntExtra("position", 0); int position = binding.viewPager.getCurrentItem(); Rect rect = data.getParcelableExtra("cut"); if (rect != null) { ImageBean.Cut cut = new ImageBean.Cut(); cut.setRect1(rect); cut.setSelect(false); list.get(position).getCuts().remove(i); list.get(position).getCuts().add(i, cut); imageAdapter.notifyItemChanged(position); refreshNum(); } else { list.get(position).getCuts().remove(i); imageAdapter.notifyItemChanged(position); refreshNum(); } } } else if (requestCode == 1002 && resultCode == RESULT_OK && !TextUtils.isEmpty(filePath)) { Bitmap b = BitmapUtils.compress(BitmapFactory.decodeFile(filePath)); String path = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg"; CommonUtil.saveBitmapToUri(b, path); int position = binding.viewPager.getCurrentItem(); list.remove(position); ImageBean imageBean = new ImageBean(); imageBean.setPath(path); imageBean.source = path; list.add(position, imageBean); imageAdapter.notifyItemChanged(position); clearText(); refreshNum(); } } private void back() { showTipDialog("温馨提示", "是否确认退出?", "取消", "确定", new TipDialog.TipDialogInterface() { @Override public void onConfirm(Dialog dialog) { dialog.dismiss(); finish(); } @Override public void onCancel(Dialog dialog) { dialog.dismiss(); } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { back(); return true; } return super.onKeyDown(keyCode, event); } }