Commit 25e17c06b185875e09fa06706129c6286f6a81f5

Authored by shixianjie
1 parent f536f83fe3
Exists in master

批改后录入错题

app/src/main/java/com/hjx/parent/ImageActivity.java
1 package com.hjx.parent; 1 package com.hjx.parent;
2 2
3 import android.annotation.SuppressLint; 3 import android.annotation.SuppressLint;
4 import android.app.Dialog; 4 import android.app.Dialog;
5 import android.content.Intent; 5 import android.content.Intent;
6 import android.graphics.Bitmap; 6 import android.graphics.Bitmap;
7 import android.graphics.BitmapFactory; 7 import android.graphics.BitmapFactory;
8 import android.graphics.Rect; 8 import android.graphics.Rect;
9 import android.net.Uri; 9 import android.net.Uri;
10 import android.os.Bundle; 10 import android.os.Bundle;
11 import android.os.Handler; 11 import android.os.Handler;
12 import android.provider.MediaStore; 12 import android.provider.MediaStore;
13 import android.text.TextUtils; 13 import android.text.TextUtils;
14 import android.util.Log; 14 import android.util.Log;
15 import android.view.KeyEvent; 15 import android.view.KeyEvent;
16 import android.view.View; 16 import android.view.View;
17 17
18 18
19 import androidx.annotation.Nullable; 19 import androidx.annotation.Nullable;
20 import androidx.core.content.FileProvider; 20 import androidx.core.content.FileProvider;
21 import androidx.viewpager2.widget.ViewPager2; 21 import androidx.viewpager2.widget.ViewPager2;
22 22
23 import com.google.gson.Gson; 23 import com.google.gson.Gson;
24 import com.google.gson.JsonObject; 24 import com.google.gson.JsonObject;
25 import com.hjx.parent.adapter.ImageAdapter; 25 import com.hjx.parent.adapter.ImageAdapter;
26 import com.hjx.parent.databinding.ActivityImageBinding; 26 import com.hjx.parent.databinding.ActivityImageBinding;
27 import com.hjx.parent.databinding.ItemImageBinding; 27 import com.hjx.parent.databinding.ItemImageBinding;
28 import com.hjx.parent.dialog.AddHomeworkDialog; 28 import com.hjx.parent.dialog.AddHomeworkDialog;
29 import com.hjx.parent.dialog.ErrorInputDialog; 29 import com.hjx.parent.dialog.ErrorInputDialog;
30 import com.hjx.parent.dialog.PhotoViewDialog; 30 import com.hjx.parent.dialog.PhotoViewDialog;
31 import com.hjx.parent.dialog.TipDialog; 31 import com.hjx.parent.dialog.TipDialog;
32 import com.hjx.parent.rx.BaseRxActivity; 32 import com.hjx.parent.rx.BaseRxActivity;
33 import com.hjx.parent.utils.CutUtil; 33 import com.hjx.parent.utils.CutUtil;
34 import com.prws.common.bean.CutPicBean; 34 import com.prws.common.bean.CutPicBean;
35 import com.prws.common.bean.ImageBean; 35 import com.prws.common.bean.ImageBean;
36 import com.prws.common.bean.TopicBean; 36 import com.prws.common.bean.TopicBean;
37 import com.prws.common.net.NetWorks; 37 import com.prws.common.net.NetWorks;
38 import com.prws.common.utils.BitmapUtils; 38 import com.prws.common.utils.BitmapUtils;
39 import com.prws.common.utils.CommonUtil; 39 import com.prws.common.utils.CommonUtil;
40 import com.xiasuhuei321.loadingdialog.view.LoadingDialog; 40 import com.xiasuhuei321.loadingdialog.view.LoadingDialog;
41 41
42 import java.io.File; 42 import java.io.File;
43 import java.util.ArrayList; 43 import java.util.ArrayList;
44 import java.util.List; 44 import java.util.List;
45 import java.util.stream.Collectors; 45 import java.util.stream.Collectors;
46 46
47 import io.reactivex.Observer; 47 import io.reactivex.Observer;
48 import io.reactivex.Single; 48 import io.reactivex.Single;
49 import io.reactivex.disposables.Disposable; 49 import io.reactivex.disposables.Disposable;
50 50
51 public class ImageActivity extends BaseRxActivity<ActivityImageBinding> implements View.OnClickListener { 51 public class ImageActivity extends BaseRxActivity<ActivityImageBinding> implements View.OnClickListener {
52 52
53 private final List<String> images = new ArrayList<>(); 53 private final List<String> images = new ArrayList<>();
54 private ImageAdapter imageAdapter; 54 private ImageAdapter imageAdapter;
55 private List<ImageBean> list = new ArrayList<>(); 55 private List<ImageBean> list = new ArrayList<>();
56 private String filePath; 56 private String filePath;
57 57
58 private int type = 0; 58 private int type = 0;
59 private AddHomeworkDialog addHomeworkDialog; 59 private AddHomeworkDialog addHomeworkDialog;
60 60
61 @SuppressLint("CheckResult") 61 @SuppressLint("CheckResult")
62 @Override 62 @Override
63 public void initView(Bundle savedInstanceState) { 63 public void initView(Bundle savedInstanceState) {
64 type = getIntent().getIntExtra("type", 0); 64 type = getIntent().getIntExtra("type", 0);
65 binding.tvSave.setText(type == 0 ? "保存错题" : "录入题目"); 65 binding.tvSave.setText(type == 0 ? "保存错题" : "录入题目");
66 66
67 List<String> originList = getIntent().getStringArrayListExtra("images"); 67 List<String> originList = getIntent().getStringArrayListExtra("images");
68 List<String> originListFinal = originList == null ? new ArrayList<>() : originList; 68 List<String> originListFinal = originList == null ? new ArrayList<>() : originList;
69 Single.fromCallable(() -> CutUtil.compressAllSync(this, originListFinal, 200)) 69 Single.fromCallable(() -> CutUtil.compressAllSync(this, originListFinal, 200))
70 .map(it -> it.stream().map(File::getAbsolutePath).collect(Collectors.toList())) 70 .map(it -> it.stream().map(File::getAbsolutePath).collect(Collectors.toList()))
71 .compose(transformSingle()) 71 .compose(transformSingle())
72 .subscribe((it, throwable) -> { 72 .subscribe((it, throwable) -> {
73 if (throwable != null) Log.e(getClass().getName(), "", throwable); 73 if (throwable != null) Log.e(getClass().getName(), "", throwable);
74 images.clear(); 74 images.clear();
75 if (it == null) { 75 if (it == null) {
76 images.addAll(originListFinal); 76 images.addAll(originListFinal);
77 } else { 77 } else {
78 images.addAll(it); 78 images.addAll(it);
79 } 79 }
80 start(); 80 start();
81 }); 81 });
82 } 82 }
83 83
84 private void start() { 84 private void start() {
85 if (images == null || images.size() <= 1) { 85 if (images == null || images.size() <= 1) {
86 binding.rlPrevious.setVisibility(View.GONE); 86 binding.rlPrevious.setVisibility(View.GONE);
87 binding.rlNext.setVisibility(View.GONE); 87 binding.rlNext.setVisibility(View.GONE);
88 } 88 }
89 for (String s : images) { 89 for (String s : images) {
90 String filepath = context.getExternalFilesDir("images").getPath() + "/" + System.currentTimeMillis() + CommonUtil.getStr() + ".jpg"; 90 String filepath = context.getExternalFilesDir("images").getPath() + "/" + System.currentTimeMillis() + CommonUtil.getStr() + ".jpg";
91 ImageBean imageBean = new ImageBean(); 91 ImageBean imageBean = new ImageBean();
92 Bitmap bitmap = BitmapUtils.getimage(s); 92 Bitmap bitmap = BitmapUtils.getimage(s);
93 CommonUtil.saveBitmapToUri(bitmap, filepath); 93 CommonUtil.saveBitmapToUri(bitmap, filepath);
94 imageBean.setPath(filepath); 94 imageBean.setPath(filepath);
95 imageBean.source = filepath; 95 imageBean.source = filepath;
96 list.add(imageBean); 96 list.add(imageBean);
97 } 97 }
98 imageAdapter = new ImageAdapter(this, list); 98 imageAdapter = new ImageAdapter(this, list);
99 binding.viewPager.setAdapter(imageAdapter); 99 binding.viewPager.setAdapter(imageAdapter);
100 binding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { 100 binding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
101 @Override 101 @Override
102 public void onPageSelected(int position) { 102 public void onPageSelected(int position) {
103 if (list.get(position).getCuts() == null) { 103 if (list.get(position).getCuts() == null) {
104 clearText(); 104 clearText();
105 } 105 }
106 binding.tvTitle.setText((binding.viewPager.getCurrentItem() + 1) + "/" + list.size()); 106 binding.tvTitle.setText((binding.viewPager.getCurrentItem() + 1) + "/" + list.size());
107 if (position == 0) { 107 if (position == 0) {
108 binding.ivPrevious.setImageResource(R.mipmap.ic_previous_gray); 108 binding.ivPrevious.setImageResource(R.mipmap.ic_previous_gray);
109 } else { 109 } else {
110 binding.ivPrevious.setImageResource(R.mipmap.ic_previous); 110 binding.ivPrevious.setImageResource(R.mipmap.ic_previous);
111 } 111 }
112 if (position == list.size() - 1) { 112 if (position == list.size() - 1) {
113 binding.ivNext.setImageResource(R.mipmap.ic_next_gray); 113 binding.ivNext.setImageResource(R.mipmap.ic_next_gray);
114 } else { 114 } else {
115 binding.ivNext.setImageResource(R.mipmap.ic_next); 115 binding.ivNext.setImageResource(R.mipmap.ic_next);
116 } 116 }
117 super.onPageSelected(position); 117 super.onPageSelected(position);
118 } 118 }
119 }); 119 });
120 binding.rlNext.setOnClickListener(this); 120 binding.rlNext.setOnClickListener(this);
121 binding.rlPrevious.setOnClickListener(this); 121 binding.rlPrevious.setOnClickListener(this);
122 binding.ivBack.setOnClickListener(this); 122 binding.ivBack.setOnClickListener(this);
123 binding.tvPhoto.setOnClickListener(this); 123 binding.tvPhoto.setOnClickListener(this);
124 binding.tvAdd.setOnClickListener(this); 124 binding.tvAdd.setOnClickListener(this);
125 binding.llEdit.setOnClickListener(this); 125 binding.llEdit.setOnClickListener(this);
126 binding.tvSave.setOnClickListener(this); 126 binding.tvSave.setOnClickListener(this);
127 binding.btnShowSource.setOnClickListener(v -> { 127 binding.btnShowSource.setOnClickListener(v -> {
128 if (list.isEmpty()) return; 128 if (list.isEmpty()) return;
129 ImageBean data = list.get(binding.viewPager.getCurrentItem()); 129 ImageBean data = list.get(binding.viewPager.getCurrentItem());
130 new PhotoViewDialog(this).show(data.source); 130 new PhotoViewDialog(this).show(data.source);
131 }); 131 });
132 132
133 binding.btnJudge.setVisibility(type == 0 ? View.VISIBLE : View.GONE); 133 binding.btnJudge.setVisibility(type == 0 ? View.VISIBLE : View.GONE);
134 binding.btnJudge.setOnClickListener(v -> { 134 binding.btnJudge.setOnClickListener(v -> {
135 goJudge(); 135 goJudge();
136 }); 136 });
137 } 137 }
138 138
139 private void goJudge() { 139 private void goJudge() {
140 if (list.isEmpty()) return; 140 if (list.isEmpty()) return;
141 int position = binding.viewPager.getCurrentItem(); 141 int position = binding.viewPager.getCurrentItem();
142 ImageBean imageBean = list.get(position); 142 ImageBean imageBean = list.get(position);
143 Bitmap bitmap = BitmapFactory.decodeFile(imageBean.getPath()); 143 Bitmap bitmap = BitmapFactory.decodeFile(imageBean.getPath());
144 if (bitmap == null || imageBean.getCuts() == null) { 144 if (bitmap == null || imageBean.getCuts() == null) {
145 showToast("请先框选题目"); 145 showToast("请先框选题目");
146 return; 146 return;
147 } 147 }
148 ItemImageBinding ib = imageAdapter.viewArray.get(position); 148 ItemImageBinding ib = imageAdapter.viewArray.get(position);
149 if (ib == null) { 149 if (ib == null) {
150 showToast("出错"); 150 showToast("出错");
151 return; 151 return;
152 } 152 }
153 View view = ib.ivPic; 153 View view = ib.ivPic;
154 float[] size = CutUtil.measureBitmap(view, bitmap); 154 float[] size = CutUtil.measureBitmap(view, bitmap);
155 155
156 ArrayList<Rect> rects = new ArrayList<>(); 156 ArrayList<Rect> rects = new ArrayList<>();
157 for (ImageBean.Cut cut: imageBean.getCuts()) { 157 for (ImageBean.Cut cut: imageBean.getCuts()) {
158 if (cut.getRect1() == null) continue; 158 if (cut.getRect1() == null) continue;
159 Rect rectV = cut.getRect1(); 159 Rect rectV = cut.getRect1();
160 rects.add(getRectB(rectV, bitmap, size)); 160 rects.add(getRectB(rectV, bitmap, size));
161 } 161 }
162 if (list.isEmpty()) { 162 if (list.isEmpty()) {
163 showToast("请先框选题目"); 163 showToast("请先框选题目");
164 return; 164 return;
165 } 165 }
166 166
167 Intent intent = new Intent(this, JudgeActivity.class); 167 Intent intent = new Intent(this, JudgeActivity.class);
168 intent.putExtra("path", imageBean.getPath()); 168 intent.putExtra("path", imageBean.getPath());
169 intent.putParcelableArrayListExtra("rects", rects); 169 intent.putParcelableArrayListExtra("rects", rects);
170 170
171 startActivity(intent); 171 startActivity(intent);
172 } 172 }
173 173
174 private Rect getRectB(Rect rectV, Bitmap bitmap, float[] measuredSize) { 174 private Rect getRectB(Rect rectV, Bitmap bitmap, float[] measuredSize) {
175 float realW = measuredSize[0]; 175 float realW = measuredSize[0];
176 float realH = measuredSize[1]; 176 float realH = measuredSize[1];
177 float offsetX = measuredSize[2]; 177 float offsetX = measuredSize[2];
178 float offsetY = measuredSize[3]; 178 float offsetY = measuredSize[3];
179 float percentX = bitmap.getWidth() / realW; 179 float percentX = bitmap.getWidth() / realW;
180 float percentY = bitmap.getHeight() / realH; 180 float percentY = bitmap.getHeight() / realH;
181 181
182 float left = (rectV.left - offsetX) * percentX; 182 float left = (rectV.left - offsetX) * percentX;
183 float right = (rectV.right - offsetX) * percentX; 183 float right = (rectV.right - offsetX) * percentX;
184 float top = (rectV.top - offsetY) * percentY; 184 float top = (rectV.top - offsetY) * percentY;
185 float bottom = (rectV.bottom - offsetY) * percentY; 185 float bottom = (rectV.bottom - offsetY) * percentY;
186 Rect rectB = new Rect((int) left, (int) top, (int) right, (int) bottom); 186 Rect rectB = new Rect((int) left, (int) top, (int) right, (int) bottom);
187 return rectB; 187 return rectB;
188 } 188 }
189 189
190 public void clearText() { 190 public void clearText() {
191 int index = binding.viewPager.getCurrentItem(); 191 int index = binding.viewPager.getCurrentItem();
192 showLoadingDialog(getString(R.string.loading_text), new LoadingDialog.DismissListener() { 192 showLoadingDialog(getString(R.string.loading_text), new LoadingDialog.DismissListener() {
193 @Override 193 @Override
194 public void dimiss() { 194 public void dimiss() {
195 // binding.ivPrevious.setEnabled(index != 0); 195 // binding.ivPrevious.setEnabled(index != 0);
196 // binding.ivNext.setEnabled(index != list.size() - 1); 196 // binding.ivNext.setEnabled(index != list.size() - 1);
197 } 197 }
198 }); 198 });
199 Log.i("clearText", list.get(index).getPath()); 199 Log.i("clearText", list.get(index).getPath());
200 String base64 = BitmapUtils.imageToBase64(list.get(index).getPath(), false); 200 String base64 = BitmapUtils.imageToBase64(list.get(index).getPath(), false);
201 NetWorks.baiduEnhance(base64, new Observer<JsonObject>() { 201 NetWorks.baiduEnhance(base64, new Observer<JsonObject>() {
202 @Override 202 @Override
203 public void onSubscribe(Disposable d) { 203 public void onSubscribe(Disposable d) {
204 204
205 } 205 }
206 206
207 @Override 207 @Override
208 public void onNext(JsonObject jsonObject) { 208 public void onNext(JsonObject jsonObject) {
209 if (jsonObject != null && jsonObject.get("image_processed") != null) { 209 if (jsonObject != null && jsonObject.get("image_processed") != null) {
210 String image = jsonObject.get("image_processed").getAsString(); 210 String image = jsonObject.get("image_processed").getAsString();
211 if (image != null) { 211 if (image != null) {
212 String filepath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg"; 212 String filepath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
213 CommonUtil.saveBitmapToUri(BitmapUtils.stringToBitmap(image), filepath); 213 CommonUtil.saveBitmapToUri(BitmapUtils.stringToBitmap(image), filepath);
214 list.get(index).setPath(filepath); 214 list.get(index).setPath(filepath);
215 if (list.get(index).getCuts() == null) { 215 if (list.get(index).getCuts() == null) {
216 list.get(index).setCuts(new ArrayList<>()); 216 list.get(index).setCuts(new ArrayList<>());
217 } 217 }
218 imageAdapter.notifyItemChanged(index); 218 imageAdapter.notifyItemChanged(index);
219 cut(filepath); 219 cut(filepath);
220 } else { 220 } else {
221 loadFail("去除字迹失败"); 221 loadFail("去除字迹失败");
222 } 222 }
223 } else { 223 } else {
224 loadFail("去除字迹失败"); 224 loadFail("去除字迹失败");
225 } 225 }
226 } 226 }
227 227
228 @Override 228 @Override
229 public void onError(Throwable e) { 229 public void onError(Throwable e) {
230 e.printStackTrace(); 230 e.printStackTrace();
231 loadFail("去除字迹失败"); 231 loadFail("去除字迹失败");
232 } 232 }
233 233
234 @Override 234 @Override
235 public void onComplete() { 235 public void onComplete() {
236 236
237 } 237 }
238 }); 238 });
239 } 239 }
240 240
241 public void cut(String path) { 241 public void cut(String path) {
242 String base64 = BitmapUtils.imageToBase64WithUrlEncode(path); 242 String base64 = BitmapUtils.imageToBase64WithUrlEncode(path);
243 Log.i("figLoaction", path); 243 Log.i("figLoaction", path);
244 NetWorks.cut(base64, new Observer<CutPicBean>() { 244 NetWorks.cut(base64, new Observer<CutPicBean>() {
245 @Override 245 @Override
246 public void onSubscribe(Disposable d) { 246 public void onSubscribe(Disposable d) {
247 247
248 } 248 }
249 249
250 @Override 250 @Override
251 public void onNext(CutPicBean cutPicBean) { 251 public void onNext(CutPicBean cutPicBean) {
252 if (cutPicBean != null) { 252 if (cutPicBean != null) {
253 if (cutPicBean.getDirection() != 0) { 253 if (cutPicBean.getDirection() != 0) {
254 rotatingImage(cutPicBean); 254 rotatingImage(cutPicBean);
255 } else { 255 } else {
256 if (cutPicBean.getQus_figure() != null && cutPicBean.getQus_figure().size() > 0) { 256 if (cutPicBean.getQus_figure() != null && cutPicBean.getQus_figure().size() > 0) {
257 List<CutPicBean.FigLoaction> figLoactions = new ArrayList<>(); 257 List<CutPicBean.FigLoaction> figLoactions = new ArrayList<>();
258 for (CutPicBean.CutLocation cutLocation : cutPicBean.getQus_figure()) { 258 for (CutPicBean.CutLocation cutLocation : cutPicBean.getQus_figure()) {
259 figLoactions.add(cutLocation.getFig_location()); 259 figLoactions.add(cutLocation.getFig_location());
260 } 260 }
261 new Handler().postDelayed(new Runnable() { 261 new Handler().postDelayed(new Runnable() {
262 @Override 262 @Override
263 public void run() { 263 public void run() {
264 getRects(figLoactions); 264 getRects(figLoactions);
265 } 265 }
266 }, 1000); 266 }, 1000);
267 } else { 267 } else {
268 cancelLoadingDialog(); 268 cancelLoadingDialog();
269 } 269 }
270 } 270 }
271 } else { 271 } else {
272 loadFail("自动切题失败"); 272 loadFail("自动切题失败");
273 } 273 }
274 } 274 }
275 275
276 @Override 276 @Override
277 public void onError(Throwable e) { 277 public void onError(Throwable e) {
278 loadFail("自动切题失败"); 278 loadFail("自动切题失败");
279 } 279 }
280 280
281 @Override 281 @Override
282 public void onComplete() { 282 public void onComplete() {
283 283
284 } 284 }
285 }); 285 });
286 } 286 }
287 287
288 private void getRects(List<CutPicBean.FigLoaction> figLoactions) { 288 private void getRects(List<CutPicBean.FigLoaction> figLoactions) {
289 Log.i("figLoaction", new Gson().toJson(figLoactions)); 289 Log.i("figLoaction", new Gson().toJson(figLoactions));
290 int index = binding.viewPager.getCurrentItem(); 290 int index = binding.viewPager.getCurrentItem();
291 List<ImageBean.Cut> cuts = new ArrayList<>(); 291 List<ImageBean.Cut> cuts = new ArrayList<>();
292 for (CutPicBean.FigLoaction figLoaction : figLoactions) { 292 for (CutPicBean.FigLoaction figLoaction : figLoactions) {
293 ImageBean.Cut cut = new ImageBean.Cut(); 293 ImageBean.Cut cut = new ImageBean.Cut();
294 cut.setRect(figLoaction); 294 cut.setRect(figLoaction);
295 cut.setSelect(false); 295 cut.setSelect(false);
296 cuts.add(cut); 296 cuts.add(cut);
297 } 297 }
298 list.get(index).setCuts(cuts); 298 list.get(index).setCuts(cuts);
299 imageAdapter.notifyItemChanged(index); 299 imageAdapter.notifyItemChanged(index);
300 cancelLoadingDialog(); 300 cancelLoadingDialog();
301 } 301 }
302 302
303 private void rotatingImage(CutPicBean cutPicBean) { 303 private void rotatingImage(CutPicBean cutPicBean) {
304 int index = binding.viewPager.getCurrentItem(); 304 int index = binding.viewPager.getCurrentItem();
305 Bitmap bitmap = BitmapFactory.decodeFile(list.get(index).getPath()); 305 Bitmap bitmap = BitmapFactory.decodeFile(list.get(index).getPath());
306 int angle = 0; 306 int angle = 0;
307 switch (cutPicBean.getDirection()) { 307 switch (cutPicBean.getDirection()) {
308 case 1: 308 case 1:
309 angle = 90; 309 angle = 90;
310 break; 310 break;
311 case 2: 311 case 2:
312 angle = 180; 312 angle = 180;
313 break; 313 break;
314 case 3: 314 case 3:
315 angle = 270; 315 angle = 270;
316 break; 316 break;
317 } 317 }
318 if (cutPicBean.getQus_figure() != null && cutPicBean.getQus_figure().size() > 0) { 318 if (cutPicBean.getQus_figure() != null && cutPicBean.getQus_figure().size() > 0) {
319 List<CutPicBean.FigLoaction> figLoactions = new ArrayList<>(); 319 List<CutPicBean.FigLoaction> figLoactions = new ArrayList<>();
320 for (CutPicBean.CutLocation cutLocation : cutPicBean.getQus_figure()) { 320 for (CutPicBean.CutLocation cutLocation : cutPicBean.getQus_figure()) {
321 figLoactions.add(cutLocation.getFig_location()); 321 figLoactions.add(cutLocation.getFig_location());
322 } 322 }
323 figLoactions = CommonUtil.rotaingLocation(angle, figLoactions, bitmap.getWidth(), bitmap.getHeight()); 323 figLoactions = CommonUtil.rotaingLocation(angle, figLoactions, bitmap.getWidth(), bitmap.getHeight());
324 bitmap = CommonUtil.rotaingImageView(angle, bitmap); 324 bitmap = CommonUtil.rotaingImageView(angle, bitmap);
325 String filepath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg"; 325 String filepath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
326 CommonUtil.saveBitmapToUri(bitmap, filepath); 326 CommonUtil.saveBitmapToUri(bitmap, filepath);
327 list.get(index).setPath(filepath); 327 list.get(index).setPath(filepath);
328 imageAdapter.notifyItemChanged(index); 328 imageAdapter.notifyItemChanged(index);
329 List<CutPicBean.FigLoaction> finalFigLoactions = figLoactions; 329 List<CutPicBean.FigLoaction> finalFigLoactions = figLoactions;
330 new Handler().postDelayed(new Runnable() { 330 new Handler().postDelayed(new Runnable() {
331 @Override 331 @Override
332 public void run() { 332 public void run() {
333 getRects(finalFigLoactions); 333 getRects(finalFigLoactions);
334 } 334 }
335 }, 500); 335 }, 500);
336 } else { 336 } else {
337 cancelLoadingDialog(); 337 cancelLoadingDialog();
338 } 338 }
339 } 339 }
340 340
341 @Override 341 @Override
342 protected ActivityImageBinding getViewBinding() { 342 protected ActivityImageBinding getViewBinding() {
343 return ActivityImageBinding.inflate(getLayoutInflater()); 343 return ActivityImageBinding.inflate(getLayoutInflater());
344 } 344 }
345 345
346 @SuppressLint("SetTextI18n") 346 @SuppressLint("SetTextI18n")
347 public void refreshNum() { 347 public void refreshNum() {
348 int num = 0; 348 int num = 0;
349 for (ImageBean imageBean : list) { 349 for (ImageBean imageBean : list) {
350 if (imageBean.getCuts() != null && imageBean.getCuts().size() > 0) { 350 if (imageBean.getCuts() != null && imageBean.getCuts().size() > 0) {
351 for (ImageBean.Cut cut : imageBean.getCuts()) { 351 for (ImageBean.Cut cut : imageBean.getCuts()) {
352 if (cut.isSelect()) { 352 if (cut.isSelect()) {
353 num++; 353 num++;
354 } 354 }
355 } 355 }
356 } 356 }
357 } 357 }
358 String btnText = type == 0 ? "保存错题" : "录入题目"; 358 String btnText = type == 0 ? "保存错题" : "录入题目";
359 if (num > 0) { 359 if (num > 0) {
360 binding.tvSave.setEnabled(true); 360 binding.tvSave.setEnabled(true);
361 binding.tvSave.setBackgroundResource(R.drawable.bg_soild_blue_5); 361 binding.tvSave.setBackgroundResource(R.drawable.bg_soild_blue_5);
362 binding.tvSave.setText(btnText + "(" + num + ")"); 362 binding.tvSave.setText(btnText + "(" + num + ")");
363 } else { 363 } else {
364 binding.tvSave.setEnabled(false); 364 binding.tvSave.setEnabled(false);
365 binding.tvSave.setBackgroundResource(R.drawable.bg_soild_blue_light_5); 365 binding.tvSave.setBackgroundResource(R.drawable.bg_soild_blue_light_5);
366 binding.tvSave.setText(btnText); 366 binding.tvSave.setText(btnText);
367 } 367 }
368 } 368 }
369 369
370 @Override 370 @Override
371 public void onClick(View v) { 371 public void onClick(View v) {
372 switch (v.getId()) { 372 switch (v.getId()) {
373 case R.id.iv_back: 373 case R.id.iv_back:
374 back(); 374 back();
375 break; 375 break;
376 case R.id.rl_next: 376 case R.id.rl_next:
377 if (binding.viewPager.getCurrentItem() + 1 < list.size()) { 377 if (binding.viewPager.getCurrentItem() + 1 < list.size()) {
378 binding.viewPager.setCurrentItem(binding.viewPager.getCurrentItem() + 1); 378 binding.viewPager.setCurrentItem(binding.viewPager.getCurrentItem() + 1);
379 } 379 }
380 break; 380 break;
381 case R.id.rl_previous: 381 case R.id.rl_previous:
382 if (binding.viewPager.getCurrentItem() != 0) { 382 if (binding.viewPager.getCurrentItem() != 0) {
383 binding.viewPager.setCurrentItem(binding.viewPager.getCurrentItem() - 1); 383 binding.viewPager.setCurrentItem(binding.viewPager.getCurrentItem() - 1);
384 } 384 }
385 break; 385 break;
386 case R.id.ll_edit: 386 case R.id.ll_edit:
387 Intent intent = new Intent(context, ImageEditActivity.class); 387 Intent intent = new Intent(context, ImageEditActivity.class);
388 intent.putExtra("path", list.get(binding.viewPager.getCurrentItem()).getPath()); 388 intent.putExtra("path", list.get(binding.viewPager.getCurrentItem()).getPath());
389 startActivityForResult(intent, 1001); 389 startActivityForResult(intent, 1001);
390 break; 390 break;
391 case R.id.tv_photo: 391 case R.id.tv_photo:
392 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 392 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
393 //确保有相机来处理Intent 393 //确保有相机来处理Intent
394 filePath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg"; 394 filePath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
395 File photoFile = new File(filePath); 395 File photoFile = new File(filePath);
396 if (photoFile != null) { 396 if (photoFile != null) {
397 //适配Android 7.0文件权限,通过FileProvider创建一个content类型的Uri 397 //适配Android 7.0文件权限,通过FileProvider创建一个content类型的Uri
398 Uri photoUri = FileProvider.getUriForFile(activity, "com.hjx.parent.fileprovider", photoFile); 398 Uri photoUri = FileProvider.getUriForFile(activity, "com.hjx.parent.fileprovider", photoFile);
399 takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 399 takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
400 takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); 400 takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
401 activity.startActivityForResult(takePictureIntent, 1002); 401 activity.startActivityForResult(takePictureIntent, 1002);
402 } 402 }
403 break; 403 break;
404 case R.id.tv_add: 404 case R.id.tv_add:
405 Intent intent1 = new Intent(context, ImageSelectActivity.class); 405 Intent intent1 = new Intent(context, ImageSelectActivity.class);
406 intent1.putExtra("path", list.get(binding.viewPager.getCurrentItem()).getPath()); 406 intent1.putExtra("path", list.get(binding.viewPager.getCurrentItem()).getPath());
407 intent1.putExtra("source", list.get(binding.viewPager.getCurrentItem()).source); 407 intent1.putExtra("source", list.get(binding.viewPager.getCurrentItem()).source);
408 startActivityForResult(intent1, 1001); 408 startActivityForResult(intent1, 1001);
409 break; 409 break;
410 case R.id.tv_save: 410 case R.id.tv_save:
411 List<TopicBean> topicBeans = new ArrayList<>(); 411 List<TopicBean> topicBeans = new ArrayList<>();
412 for (ImageBean imageBean : list) { 412 for (ImageBean imageBean : list) {
413 if (imageBean.getCuts() != null && imageBean.getCuts().size() > 0) { 413 if (imageBean.getCuts() != null && imageBean.getCuts().size() > 0) {
414 for (ImageBean.Cut cut : imageBean.getCuts()) { 414 for (ImageBean.Cut cut : imageBean.getCuts()) {
415 if (cut.isSelect()) { 415 if (cut.isSelect()) {
416 TopicBean bean = new TopicBean(); 416 TopicBean bean = new TopicBean();
417 String path = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg"; 417 String path = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
418 BitmapUtils.saveBitmap(cut.getBitmap(), path); 418 BitmapUtils.saveBitmap(cut.getBitmap(), path);
419 bean.setPath(path); 419 bean.setPath(path);
420 topicBeans.add(bean); 420 topicBeans.add(bean);
421 } 421 }
422 } 422 }
423 } 423 }
424 } 424 }
425 save(topicBeans); 425 save(topicBeans);
426 break; 426 break;
427 } 427 }
428 } 428 }
429 429
430 private void save(List<TopicBean> topicBeans) { 430 private void save(List<TopicBean> topicBeans) {
431 if (type == 0) { 431 if (type == 0) {
432 ErrorInputDialog dialog = new ErrorInputDialog(this, topicBeans); 432 ErrorInputDialog dialog = new ErrorInputDialog(this, topicBeans);
433 dialog.show(); 433 dialog.show(() -> {
434 Intent intent = new Intent(this, AddSuccessActivity.class);
435 startActivity(intent);
436 finish();
437 });
434 } else { 438 } else {
435 List<String> paths = new ArrayList<>(); 439 List<String> paths = new ArrayList<>();
436 for (TopicBean it: topicBeans) { 440 for (TopicBean it: topicBeans) {
437 paths.add(it.getPath()); 441 paths.add(it.getPath());
438 } 442 }
439 if (addHomeworkDialog == null) { 443 if (addHomeworkDialog == null) {
440 addHomeworkDialog = new AddHomeworkDialog(this); 444 addHomeworkDialog = new AddHomeworkDialog(this);
441 } 445 }
442 addHomeworkDialog.show(paths, student -> { 446 addHomeworkDialog.show(paths, student -> {
443 Intent intent = new Intent(context, AddSuccessActivity.class); 447 Intent intent = new Intent(context, AddSuccessActivity.class);
444 intent.putExtra("type", type); 448 intent.putExtra("type", type);
445 intent.putExtra("studentJson", new Gson().toJson(student)); 449 intent.putExtra("studentJson", new Gson().toJson(student));
446 startActivity(intent); 450 startActivity(intent);
447 finish(); 451 finish();
448 }); 452 });
449 } 453 }
450 } 454 }
451 455
452 @Override 456 @Override
453 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { 457 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
454 super.onActivityResult(requestCode, resultCode, data); 458 super.onActivityResult(requestCode, resultCode, data);
455 if (requestCode == 1001) { 459 if (requestCode == 1001) {
456 if (resultCode == 1002) { 460 if (resultCode == 1002) {
457 if (list.size() > 1) { 461 if (list.size() > 1) {
458 list.remove(binding.viewPager.getCurrentItem()); 462 list.remove(binding.viewPager.getCurrentItem());
459 if (list.size() <= 1) { 463 if (list.size() <= 1) {
460 binding.rlPrevious.setVisibility(View.GONE); 464 binding.rlPrevious.setVisibility(View.GONE);
461 binding.rlNext.setVisibility(View.GONE); 465 binding.rlNext.setVisibility(View.GONE);
462 } 466 }
463 imageAdapter.notifyItemRemoved(binding.viewPager.getCurrentItem()); 467 imageAdapter.notifyItemRemoved(binding.viewPager.getCurrentItem());
464 binding.tvTitle.setText((binding.viewPager.getCurrentItem() + 1) + "/" + list.size()); 468 binding.tvTitle.setText((binding.viewPager.getCurrentItem() + 1) + "/" + list.size());
465 refreshNum(); 469 refreshNum();
466 } else { 470 } else {
467 finish(); 471 finish();
468 } 472 }
469 } else if (resultCode == 1003) { 473 } else if (resultCode == 1003) {
470 int position = binding.viewPager.getCurrentItem(); 474 int position = binding.viewPager.getCurrentItem();
471 String src = list.get(position).source; 475 String src = list.get(position).source;
472 list.remove(position); 476 list.remove(position);
473 String path = data.getStringExtra("path"); 477 String path = data.getStringExtra("path");
474 ImageBean imageBean = new ImageBean(); 478 ImageBean imageBean = new ImageBean();
475 imageBean.setPath(path); 479 imageBean.setPath(path);
476 imageBean.source = src; 480 imageBean.source = src;
477 list.add(position, imageBean); 481 list.add(position, imageBean);
478 imageAdapter.notifyItemChanged(position); 482 imageAdapter.notifyItemChanged(position);
479 clearText(); 483 clearText();
480 refreshNum(); 484 refreshNum();
481 } else if (resultCode == 1004) { 485 } else if (resultCode == 1004) {
482 Rect rect = data.getParcelableExtra("cut"); 486 Rect rect = data.getParcelableExtra("cut");
483 if (rect != null) { 487 if (rect != null) {
484 int position = binding.viewPager.getCurrentItem(); 488 int position = binding.viewPager.getCurrentItem();
485 ImageBean.Cut cut = new ImageBean.Cut(); 489 ImageBean.Cut cut = new ImageBean.Cut();
486 cut.setRect1(rect); 490 cut.setRect1(rect);
487 cut.setSelect(false); 491 cut.setSelect(false);
488 if (list.get(position).getCuts() != null) { 492 if (list.get(position).getCuts() != null) {
489 list.get(position).getCuts().add(cut); 493 list.get(position).getCuts().add(cut);
490 } else { 494 } else {
491 List<ImageBean.Cut> cuts =new ArrayList<>(); 495 List<ImageBean.Cut> cuts =new ArrayList<>();
492 cuts.add(cut); 496 cuts.add(cut);
493 list.get(position).setCuts(cuts); 497 list.get(position).setCuts(cuts);
494 } 498 }
495 imageAdapter.notifyItemChanged(position); 499 imageAdapter.notifyItemChanged(position);
496 refreshNum(); 500 refreshNum();
497 } 501 }
498 } else if (resultCode == 1005) { 502 } else if (resultCode == 1005) {
499 int i = data.getIntExtra("position", 0); 503 int i = data.getIntExtra("position", 0);
500 int position = binding.viewPager.getCurrentItem(); 504 int position = binding.viewPager.getCurrentItem();
501 Rect rect = data.getParcelableExtra("cut"); 505 Rect rect = data.getParcelableExtra("cut");
502 if (rect != null) { 506 if (rect != null) {
503 ImageBean.Cut cut = new ImageBean.Cut(); 507 ImageBean.Cut cut = new ImageBean.Cut();
504 cut.setRect1(rect); 508 cut.setRect1(rect);
505 cut.setSelect(false); 509 cut.setSelect(false);
506 list.get(position).getCuts().remove(i); 510 list.get(position).getCuts().remove(i);
507 list.get(position).getCuts().add(i, cut); 511 list.get(position).getCuts().add(i, cut);
508 imageAdapter.notifyItemChanged(position); 512 imageAdapter.notifyItemChanged(position);
509 refreshNum(); 513 refreshNum();
510 } else { 514 } else {
511 list.get(position).getCuts().remove(i); 515 list.get(position).getCuts().remove(i);
512 imageAdapter.notifyItemChanged(position); 516 imageAdapter.notifyItemChanged(position);
513 refreshNum(); 517 refreshNum();
514 } 518 }
515 } 519 }
516 } else if (requestCode == 1002 && resultCode == RESULT_OK && !TextUtils.isEmpty(filePath)) { 520 } else if (requestCode == 1002 && resultCode == RESULT_OK && !TextUtils.isEmpty(filePath)) {
517 Bitmap b = BitmapUtils.compress(BitmapFactory.decodeFile(filePath)); 521 Bitmap b = BitmapUtils.compress(BitmapFactory.decodeFile(filePath));
518 String path = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg"; 522 String path = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
519 CommonUtil.saveBitmapToUri(b, path); 523 CommonUtil.saveBitmapToUri(b, path);
520 int position = binding.viewPager.getCurrentItem(); 524 int position = binding.viewPager.getCurrentItem();
521 list.remove(position); 525 list.remove(position);
522 ImageBean imageBean = new ImageBean(); 526 ImageBean imageBean = new ImageBean();
523 imageBean.setPath(path); 527 imageBean.setPath(path);
524 imageBean.source = path; 528 imageBean.source = path;
525 list.add(position, imageBean); 529 list.add(position, imageBean);
526 imageAdapter.notifyItemChanged(position); 530 imageAdapter.notifyItemChanged(position);
527 clearText(); 531 clearText();
528 refreshNum(); 532 refreshNum();
529 } 533 }
530 } 534 }
531 535
532 private void back() { 536 private void back() {
533 showTipDialog("温馨提示", "是否确认退出?", "取消", "确定", new TipDialog.TipDialogInterface() { 537 showTipDialog("温馨提示", "是否确认退出?", "取消", "确定", new TipDialog.TipDialogInterface() {
534 @Override 538 @Override
535 public void onConfirm(Dialog dialog) { 539 public void onConfirm(Dialog dialog) {
536 dialog.dismiss(); 540 dialog.dismiss();
537 finish(); 541 finish();
538 } 542 }
539 543
540 @Override 544 @Override
541 public void onCancel(Dialog dialog) { 545 public void onCancel(Dialog dialog) {
542 dialog.dismiss(); 546 dialog.dismiss();
543 } 547 }
544 }); 548 });
545 } 549 }
546 550
547 @Override 551 @Override
548 public boolean onKeyDown(int keyCode, KeyEvent event) { 552 public boolean onKeyDown(int keyCode, KeyEvent event) {
549 if (keyCode == KeyEvent.KEYCODE_BACK) { 553 if (keyCode == KeyEvent.KEYCODE_BACK) {
550 back(); 554 back();
551 return true; 555 return true;
552 } 556 }
553 return super.onKeyDown(keyCode, event); 557 return super.onKeyDown(keyCode, event);
554 } 558 }
555 } 559 }
556 560
app/src/main/java/com/hjx/parent/JudgeActivity.java
1 package com.hjx.parent; 1 package com.hjx.parent;
2 2
3 import android.annotation.SuppressLint; 3 import android.annotation.SuppressLint;
4 import android.content.Intent;
4 import android.graphics.Bitmap; 5 import android.graphics.Bitmap;
5 import android.graphics.Rect; 6 import android.graphics.Rect;
6 import android.os.Bundle; 7 import android.os.Bundle;
7 import android.util.Log; 8 import android.util.Log;
8 9
9 import com.bumptech.glide.Glide; 10 import com.bumptech.glide.Glide;
10 import com.hjx.parent.api.JudgeRepository; 11 import com.hjx.parent.api.JudgeRepository;
11 import com.hjx.parent.databinding.ActivityJudgeBinding; 12 import com.hjx.parent.databinding.ActivityJudgeBinding;
12 import com.hjx.parent.databinding.LayoutJudgeRectBinding; 13 import com.hjx.parent.databinding.LayoutJudgeRectBinding;
14 import com.hjx.parent.dialog.ErrorInputDialog;
13 import com.hjx.parent.rx.BaseRxActivity; 15 import com.hjx.parent.rx.BaseRxActivity;
14 import com.hjx.parent.utils.CutUtil; 16 import com.hjx.parent.utils.CutUtil;
17 import com.prws.common.bean.TopicBean;
15 18
16 import java.io.File; 19 import java.io.File;
17 import java.util.ArrayList; 20 import java.util.ArrayList;
18 import java.util.List; 21 import java.util.List;
22 import java.util.stream.Collectors;
19 23
20 import io.reactivex.Observable; 24 import io.reactivex.Observable;
21 import io.reactivex.Single; 25 import io.reactivex.Single;
22 import top.zibin.luban.Luban; 26 import top.zibin.luban.Luban;
23 27
24 public class JudgeActivity extends BaseRxActivity<ActivityJudgeBinding> { 28 public class JudgeActivity extends BaseRxActivity<ActivityJudgeBinding> {
25 29
26 private Bitmap bitmap; 30 private Bitmap bitmap;
27 31
28 private final List<JudgeCut> mList = new ArrayList<>(); 32 private final List<JudgeCut> mList = new ArrayList<>();
29 33
30 @SuppressLint("CheckResult") 34 @SuppressLint("CheckResult")
31 @Override 35 @Override
32 public void initView(Bundle savedInstanceState) { 36 public void initView(Bundle savedInstanceState) {
33 binding.ivBack.setOnClickListener(v -> { 37 binding.ivBack.setOnClickListener(v -> {
34 onBackPressed(); 38 onBackPressed();
35 }); 39 });
36 String path = getIntent().getStringExtra("path"); 40 String path = getIntent().getStringExtra("path");
37 if (path == null) return; 41 if (path == null) return;
38 final ArrayList<Rect> rects = getIntent().getParcelableArrayListExtra("rects"); 42 final ArrayList<Rect> rects = getIntent().getParcelableArrayListExtra("rects");
39 if (rects == null) return; 43 if (rects == null) return;
40 44
41 Single.just(path) 45 Single.just(path)
42 .map(origin -> Luban.with(this).load(origin).ignoreBy(300).get().get(0)) 46 .map(origin -> Luban.with(this).load(origin).ignoreBy(300).get().get(0))
43 .map(file -> Glide.with(this).asBitmap().load(file).submit().get()) 47 .map(file -> Glide.with(this).asBitmap().load(file).submit().get())
44 .compose(transformSingle()) 48 .compose(transformSingle())
45 .subscribe((bitmap, th) -> { 49 .subscribe((bitmap, th) -> {
46 if (th != null) th.printStackTrace(); 50 if (th != null) th.printStackTrace();
47 if (bitmap == null) return; 51 if (bitmap == null) return;
48 this.bitmap = bitmap; 52 this.bitmap = bitmap;
49 53
50 binding.ivPic.setImageBitmap(bitmap); 54 binding.ivPic.setImageBitmap(bitmap);
51 CutUtil.onLayoutReady(binding.ivPic, v -> { 55 CutUtil.onLayoutReady(binding.ivPic, v -> {
52 prepareRects(rects); 56 prepareRects(rects);
53 }); 57 });
54 }); 58 });
55 binding.btnSelectAll.setOnClickListener(v -> { 59 binding.btnSelectAll.setOnClickListener(v -> {
56 if (mList.isEmpty()) return; 60 if (mList.isEmpty()) return;
57 mList.forEach(it -> it.vb.getRoot().setSelected(true)); 61 mList.forEach(it -> it.vb.getRoot().setSelected(true));
58 checkCount(); 62 checkCount();
59 }); 63 });
64 binding.btnAdd.setOnClickListener(v -> {
65 if (mList.isEmpty()) return;
66 List<TopicBean> selected = mList.stream()
67 .filter(it -> it.vb.getRoot().isSelected())
68 .map(it -> {
69 TopicBean bean = new TopicBean();
70 bean.setPath(it.getPath());
71 return bean;
72 })
73 .collect(Collectors.toList());
74
75 ErrorInputDialog dialog = new ErrorInputDialog(this, selected);
76 dialog.show(() -> {
77 showToast("已加入错题本");
78 finish();
79 });
80 });
60 } 81 }
61 82
62 private void prepareRects(List<Rect> rects) { 83 private void prepareRects(List<Rect> rects) {
63 mList.clear(); 84 mList.clear();
64 binding.flRects.removeAllViews(); 85 binding.flRects.removeAllViews();
65 float[] measuredSize = CutUtil.measureBitmap(binding.ivPic, bitmap); 86 float[] measuredSize = CutUtil.measureBitmap(binding.ivPic, bitmap);
66 for (int i = 0; i < rects.size(); i++) { 87 for (int i = 0; i < rects.size(); i++) {
67 Rect it = rects.get(i); 88 Rect it = rects.get(i);
68 Bitmap bitmap = CutUtil.cut(this.bitmap, it.left, it.top, it.width(), it.height(), this); 89 Bitmap bitmap = CutUtil.cut(this.bitmap, it.left, it.top, it.width(), it.height(), this);
69 Rect rect = measureRect(it, measuredSize); 90 Rect rect = measureRect(it, measuredSize);
70 LayoutJudgeRectBinding vb = showRect(rect); 91 LayoutJudgeRectBinding vb = showRect(rect);
71 mList.add(new JudgeCut(i, bitmap, rect, vb)); 92 mList.add(new JudgeCut(i, bitmap, rect, vb));
72 } 93 }
73 94
74 judge(); 95 judge();
75 } 96 }
76 97
77 @SuppressLint("CheckResult") 98 @SuppressLint("CheckResult")
78 private void judge() { 99 private void judge() {
79 showLoadingDialog(""); 100 showLoadingDialog("");
80 Observable.fromIterable(mList) 101 Observable.fromIterable(mList)
81 .map(it -> { 102 .map(it -> {
82 if (it.url != null && !it.url.isEmpty()) return it; 103 if (it.url != null && !it.url.isEmpty()) return it;
83 String base64 = CutUtil.bitmapToBase64(it.bitmap, true); 104 String base64 = CutUtil.bitmapToBase64(it.bitmap, true);
84 it.url = base64; 105 it.url = base64;
85 return it; 106 return it;
86 }) 107 })
87 .flatMap(it -> JudgeRepository.singleJudge(it.url) 108 .flatMap(it -> JudgeRepository.singleJudge(it.url)
88 .map(result -> { 109 .map(result -> {
89 it.correctResult = result; 110 it.correctResult = result;
90 return it; 111 return it;
91 }) 112 })
92 .toObservable() 113 .toObservable()
93 ) 114 )
94 .compose(transform()) 115 .compose(transform())
95 .subscribe(it -> { 116 .subscribe(it -> {
96 if (it.correctResult == 1) { 117 if (it.correctResult == 1) {
97 it.vb.ivResult.setImageResource(R.drawable.png_ic_judge_correct); 118 it.vb.ivResult.setImageResource(R.drawable.png_ic_judge_correct);
98 } else if (it.correctResult == 2) { 119 } else if (it.correctResult == 2) {
99 it.vb.ivResult.setImageResource(R.drawable.png_ic_judge_wrong); 120 it.vb.ivResult.setImageResource(R.drawable.png_ic_judge_wrong);
100 } 121 }
101 it.vb.getRoot().setSelected(it.correctResult != 1); 122 it.vb.getRoot().setSelected(it.correctResult != 1);
102 checkCount(); 123 checkCount();
103 }, th -> { 124 }, th -> {
104 cancelLoadingDialog(); 125 cancelLoadingDialog();
105 Log.e(getClass().getName(), "", th); 126 Log.e(getClass().getName(), "", th);
106 }, this::cancelLoadingDialog) 127 }, this::cancelLoadingDialog)
107 ; 128 ;
108 } 129 }
109 130
110 private LayoutJudgeRectBinding showRect(Rect rect) { 131 private LayoutJudgeRectBinding showRect(Rect rect) {
111 LayoutJudgeRectBinding vb = LayoutJudgeRectBinding.inflate(getLayoutInflater(), binding.flRects, false); 132 LayoutJudgeRectBinding vb = LayoutJudgeRectBinding.inflate(getLayoutInflater(), binding.flRects, false);
112 133
113 vb.getRoot().setMinimumWidth(rect.width()); 134 vb.getRoot().setMinimumWidth(rect.width());
114 vb.getRoot().setMinimumHeight(rect.height()); 135 vb.getRoot().setMinimumHeight(rect.height());
115 vb.getRoot().setTranslationX((float) rect.left); 136 vb.getRoot().setTranslationX((float) rect.left);
116 vb.getRoot().setTranslationY((float) rect.top); 137 vb.getRoot().setTranslationY((float) rect.top);
117 vb.getRoot().setOnClickListener(v -> { 138 vb.getRoot().setOnClickListener(v -> {
118 v.setSelected(!v.isSelected()); 139 v.setSelected(!v.isSelected());
119 checkCount(); 140 checkCount();
120 }); 141 });
121 binding.flRects.addView(vb.getRoot()); 142 binding.flRects.addView(vb.getRoot());
122 143
123 return vb; 144 return vb;
124 } 145 }
125 146
126 @SuppressLint("SetTextI18n") 147 @SuppressLint("SetTextI18n")
127 private void checkCount() { 148 private void checkCount() {
128 int count = (int) mList.stream().filter(it -> it.vb.getRoot().isSelected()).count(); 149 int count = (int) mList.stream().filter(it -> it.vb.getRoot().isSelected()).count();
129 if (count == 0) binding.btnAdd.setText("加入错题"); 150 if (count == 0) binding.btnAdd.setText("加入错题");
130 else binding.btnAdd.setText("加入错题(" + count + ")"); 151 else binding.btnAdd.setText("加入错题(" + count + ")");
131 binding.btnAdd.setEnabled(count > 0); 152 binding.btnAdd.setEnabled(count > 0);
132 } 153 }
133 154
134 /** bitmapRect 转换为 viewRect */ 155 /** bitmapRect 转换为 viewRect */
135 private Rect measureRect(Rect rect, float[] measuredSize) { 156 private Rect measureRect(Rect rect, float[] measuredSize) {
136 float realW = measuredSize[0]; 157 float realW = measuredSize[0];
137 float realH = measuredSize[1]; 158 float realH = measuredSize[1];
138 float offsetX = measuredSize[2]; 159 float offsetX = measuredSize[2];
139 float offsetY = measuredSize[3]; 160 float offsetY = measuredSize[3];
140 float percentX = realW / bitmap.getWidth(); 161 float percentX = realW / bitmap.getWidth();
141 float percentY = realH / bitmap.getHeight(); 162 float percentY = realH / bitmap.getHeight();
142 163
143 float left = rect.left * percentX + offsetX; 164 float left = rect.left * percentX + offsetX;
144 float right = rect.right * percentX + offsetX; 165 float right = rect.right * percentX + offsetX;
145 float top = rect.top * percentY + offsetY; 166 float top = rect.top * percentY + offsetY;
146 float bottom = rect.bottom * percentY + offsetY; 167 float bottom = rect.bottom * percentY + offsetY;
147 return new Rect((int) left, (int) top, (int) right, (int) bottom); 168 return new Rect((int) left, (int) top, (int) right, (int) bottom);
148 } 169 }
149 170
150 @Override 171 @Override
151 protected ActivityJudgeBinding getViewBinding() { 172 protected ActivityJudgeBinding getViewBinding() {
152 return ActivityJudgeBinding.inflate(getLayoutInflater()); 173 return ActivityJudgeBinding.inflate(getLayoutInflater());
153 } 174 }
154 175
155 static class JudgeCut { 176 static class JudgeCut {
156 final int index; 177 final int index;
157 final Bitmap bitmap; 178 final Bitmap bitmap;
158 final Rect rect; 179 final Rect rect;
159 final LayoutJudgeRectBinding vb; 180 final LayoutJudgeRectBinding vb;
160 181
161 String url; 182 String url;
162 183
163 /** 0:未批改;1:正确;2:错误;3:未作答 */ 184 /** 0:未批改;1:正确;2:错误;3:未作答 */
164 int correctResult = 0; 185 int correctResult = 0;
165 186
166 public JudgeCut(int index, Bitmap bitmap, Rect rect, LayoutJudgeRectBinding vb) { 187 public JudgeCut(int index, Bitmap bitmap, Rect rect, LayoutJudgeRectBinding vb) {
167 this.index = index; 188 this.index = index;
168 this.bitmap = bitmap; 189 this.bitmap = bitmap;
169 this.rect = rect; 190 this.rect = rect;
170 this.vb = vb; 191 this.vb = vb;
171 } 192 }
193
194 private String path;
195
196 public String getPath() {
197 if (path != null) return path;
198 path = CutUtil.saveBitmapToCache(bitmap, App.getInstance());
199 return path;
200 }
172 } 201 }
173 } 202 }
174 203
app/src/main/java/com/hjx/parent/dialog/ErrorInputDialog.java
1 package com.hjx.parent.dialog; 1 package com.hjx.parent.dialog;
2 2
3 import android.app.Dialog; 3 import android.app.Dialog;
4 import android.content.Context; 4 import android.content.Context;
5 import android.content.Intent; 5 import android.content.Intent;
6 import android.graphics.Color; 6 import android.graphics.Color;
7 import android.graphics.drawable.Drawable; 7 import android.graphics.drawable.Drawable;
8 import android.os.Bundle; 8 import android.os.Bundle;
9 import android.view.Gravity; 9 import android.view.Gravity;
10 import android.view.View; 10 import android.view.View;
11 import android.view.Window; 11 import android.view.Window;
12 import android.view.WindowManager; 12 import android.view.WindowManager;
13 import android.widget.AdapterView; 13 import android.widget.AdapterView;
14 import android.widget.ArrayAdapter; 14 import android.widget.ArrayAdapter;
15 import android.widget.CompoundButton; 15 import android.widget.CompoundButton;
16 import android.widget.RadioButton; 16 import android.widget.RadioButton;
17 import android.widget.RadioGroup; 17 import android.widget.RadioGroup;
18 18
19 import androidx.annotation.NonNull; 19 import androidx.annotation.NonNull;
20 import androidx.fragment.app.FragmentActivity;
20 import androidx.recyclerview.widget.LinearLayoutManager; 21 import androidx.recyclerview.widget.LinearLayoutManager;
21 import androidx.recyclerview.widget.RecyclerView; 22 import androidx.recyclerview.widget.RecyclerView;
22 23
23 import com.bumptech.glide.Glide; 24 import com.bumptech.glide.Glide;
24 import com.chad.library.adapter.base.BaseQuickAdapter; 25 import com.chad.library.adapter.base.BaseQuickAdapter;
25 import com.chad.library.adapter.base.BaseViewHolder; 26 import com.chad.library.adapter.base.BaseViewHolder;
26 import com.google.gson.Gson; 27 import com.google.gson.Gson;
27 import com.hjx.parent.AddSuccessActivity; 28 import com.hjx.parent.AddSuccessActivity;
28 import com.hjx.parent.App; 29 import com.hjx.parent.App;
29 import com.hjx.parent.ImageActivity; 30 import com.hjx.parent.ImageActivity;
30 import com.hjx.parent.R; 31 import com.hjx.parent.R;
31 import com.hjx.parent.bean.StudentBean; 32 import com.hjx.parent.bean.StudentBean;
32 import com.hjx.parent.databinding.DialogAddErrorBinding; 33 import com.hjx.parent.databinding.DialogAddErrorBinding;
34 import com.hjx.parent.function.Function0;
33 import com.prws.common.bean.Grade; 35 import com.prws.common.bean.Grade;
34 import com.prws.common.bean.GradeAndSubject; 36 import com.prws.common.bean.GradeAndSubject;
35 import com.prws.common.bean.ResponseResult; 37 import com.prws.common.bean.ResponseResult;
36 import com.prws.common.bean.Subject; 38 import com.prws.common.bean.Subject;
37 import com.prws.common.bean.TopicBean; 39 import com.prws.common.bean.TopicBean;
38 import com.prws.common.net.NetWorks; 40 import com.prws.common.net.NetWorks;
39 import com.prws.common.utils.CommonUtil; 41 import com.prws.common.utils.CommonUtil;
40 import com.prws.common.utils.LogUtil; 42 import com.prws.common.utils.LogUtil;
41 import com.prws.common.utils.SharedPreferencesUtil; 43 import com.prws.common.utils.SharedPreferencesUtil;
42 import com.prws.common.utils.StringUtils; 44 import com.prws.common.utils.StringUtils;
43 45
44 import org.json.JSONArray; 46 import org.json.JSONArray;
45 import org.json.JSONObject; 47 import org.json.JSONObject;
46 48
47 import java.util.ArrayList; 49 import java.util.ArrayList;
48 import java.util.HashMap; 50 import java.util.HashMap;
49 import java.util.List; 51 import java.util.List;
50 import java.util.Map; 52 import java.util.Map;
51 53
52 import io.reactivex.Observer; 54 import io.reactivex.Observer;
53 import io.reactivex.disposables.Disposable; 55 import io.reactivex.disposables.Disposable;
54 import okhttp3.ResponseBody; 56 import okhttp3.ResponseBody;
55 57
56 public class ErrorInputDialog extends Dialog { 58 public class ErrorInputDialog extends Dialog {
57 private ImageActivity context; 59 private FragmentActivity context;
58 private DialogAddErrorBinding binding; 60 private DialogAddErrorBinding binding;
59 private List<TopicBean> list; 61 private List<TopicBean> list;
60 private int select = 0; 62 private int select = 0;
61 private Grade grade; 63 private Grade grade;
62 private String term; 64 private String term;
63 private Subject subject; 65 private Subject subject;
64 private int reason; 66 private int reason;
65 private int type = 0; 67 private int type = 0;
66 BaseQuickAdapter adapter; 68 BaseQuickAdapter adapter;
67 69
68 public ErrorInputDialog(@NonNull ImageActivity context, List<TopicBean> list) { 70 private Function0 function = () -> {};
71 public void show(Function0 callback) {
72 this.function = callback;
73 super.show();
74 }
75
76 public ErrorInputDialog(@NonNull FragmentActivity context, List<TopicBean> list) {
69 super(context, R.style.MyAlertDialog); 77 super(context, R.style.MyAlertDialog);
70 this.context = context; 78 this.context = context;
71 this.list = list; 79 this.list = list;
72 } 80 }
73 81
74 @Override 82 @Override
75 protected void onCreate(Bundle savedInstanceState) { 83 protected void onCreate(Bundle savedInstanceState) {
76 super.onCreate(savedInstanceState); 84 super.onCreate(savedInstanceState);
77 binding = DialogAddErrorBinding.inflate(getLayoutInflater()); 85 binding = DialogAddErrorBinding.inflate(getLayoutInflater());
78 setContentView(binding.getRoot()); 86 setContentView(binding.getRoot());
79 Window dialogWindow = getWindow(); 87 Window dialogWindow = getWindow();
80 WindowManager.LayoutParams lp = dialogWindow.getAttributes(); 88 WindowManager.LayoutParams lp = dialogWindow.getAttributes();
81 lp.width = CommonUtil.getScreenWidth(getContext()); 89 lp.width = CommonUtil.getScreenWidth(getContext());
82 dialogWindow.setGravity(Gravity.BOTTOM); 90 dialogWindow.setGravity(Gravity.BOTTOM);
83 dialogWindow.setAttributes(lp); 91 dialogWindow.setAttributes(lp);
84 adapter = new BaseQuickAdapter(R.layout.item_topic, list) { 92 adapter = new BaseQuickAdapter(R.layout.item_topic, list) {
85 @Override 93 @Override
86 protected void convert(@NonNull BaseViewHolder item, Object o) { 94 protected void convert(@NonNull BaseViewHolder item, Object o) {
87 int position = item.getAdapterPosition(); 95 int position = item.getAdapterPosition();
88 item.setText(R.id.tv_name, context.getString(R.string.num_topic, StringUtils.intToChinese(position + 1))); 96 item.setText(R.id.tv_name, context.getString(R.string.num_topic, StringUtils.intToChinese(position + 1)));
89 if (list.get(position).isFinish()) { 97 if (list.get(position).isFinish()) {
90 item.setGone(R.id.iv_click, true); 98 item.setGone(R.id.iv_click, true);
91 item.setBackgroundRes(R.id.tv_name, R.drawable.topic_finish_bg); 99 item.setBackgroundRes(R.id.tv_name, R.drawable.topic_finish_bg);
92 item.setTextColor(R.id.tv_name, Color.parseColor("#1C90F3")); 100 item.setTextColor(R.id.tv_name, Color.parseColor("#1C90F3"));
93 } else if (select == position) { 101 } else if (select == position) {
94 item.setGone(R.id.iv_click, false); 102 item.setGone(R.id.iv_click, false);
95 item.setBackgroundRes(R.id.tv_name, R.drawable.button_select_topic_bg); 103 item.setBackgroundRes(R.id.tv_name, R.drawable.button_select_topic_bg);
96 item.setTextColor(R.id.tv_name, Color.parseColor("#1C90F3")); 104 item.setTextColor(R.id.tv_name, Color.parseColor("#1C90F3"));
97 } else { 105 } else {
98 item.setGone(R.id.iv_click, false); 106 item.setGone(R.id.iv_click, false);
99 item.setBackgroundRes(R.id.tv_name, R.drawable.button_topic_bg); 107 item.setBackgroundRes(R.id.tv_name, R.drawable.button_topic_bg);
100 item.setTextColor(R.id.tv_name, Color.parseColor("#999999")); 108 item.setTextColor(R.id.tv_name, Color.parseColor("#999999"));
101 } 109 }
102 item.getConvertView().setOnClickListener(new View.OnClickListener() { 110 item.getConvertView().setOnClickListener(new View.OnClickListener() {
103 @Override 111 @Override
104 public void onClick(View v) { 112 public void onClick(View v) {
105 select = position; 113 select = position;
106 loadError(); 114 loadError();
107 notifyDataSetChanged(); 115 notifyDataSetChanged();
108 } 116 }
109 }); 117 });
110 } 118 }
111 119
112 @Override 120 @Override
113 public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { 121 public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
114 122
115 } 123 }
116 }; 124 };
117 binding.listItem.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)); 125 binding.listItem.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
118 binding.listItem.setAdapter(adapter); 126 binding.listItem.setAdapter(adapter);
119 List<String> grades = new ArrayList<>(); 127 List<String> grades = new ArrayList<>();
120 for (GradeAndSubject grade : App.getInstance().getGradeAndSubjects()) { 128 for (GradeAndSubject grade : App.getInstance().getGradeAndSubjects()) {
121 grades.add(grade.getGrade().getGrade()); 129 grades.add(grade.getGrade().getGrade());
122 } 130 }
123 ArrayAdapter<String> gradeAdapter = new ArrayAdapter<>(context, R.layout.item_for_custom_spinner, grades); 131 ArrayAdapter<String> gradeAdapter = new ArrayAdapter<>(context, R.layout.item_for_custom_spinner, grades);
124 binding.spinnerGrade.setAdapter(gradeAdapter); 132 binding.spinnerGrade.setAdapter(gradeAdapter);
125 binding.spinnerGrade.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 133 binding.spinnerGrade.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
126 @Override 134 @Override
127 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 135 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
128 grade = App.getInstance().getGradeAndSubjects().get(position).getGrade(); 136 grade = App.getInstance().getGradeAndSubjects().get(position).getGrade();
129 refreshSubject(App.getInstance().getGradeAndSubjects().get(position).getSubjects()); 137 refreshSubject(App.getInstance().getGradeAndSubjects().get(position).getSubjects());
130 } 138 }
131 139
132 @Override 140 @Override
133 public void onNothingSelected(AdapterView<?> parent) { 141 public void onNothingSelected(AdapterView<?> parent) {
134 142
135 } 143 }
136 }); 144 });
137 ArrayAdapter<String> gradeAdapter1 = new ArrayAdapter<>(context, R.layout.item_for_custom_spinner, getContext().getResources().getStringArray(R.array.grade_array)); 145 ArrayAdapter<String> gradeAdapter1 = new ArrayAdapter<>(context, R.layout.item_for_custom_spinner, getContext().getResources().getStringArray(R.array.grade_array));
138 binding.spinnerGrade1.setAdapter(gradeAdapter1); 146 binding.spinnerGrade1.setAdapter(gradeAdapter1);
139 binding.spinnerGrade1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 147 binding.spinnerGrade1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
140 @Override 148 @Override
141 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 149 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
142 term = getContext().getResources().getStringArray(R.array.grade_array)[position]; 150 term = getContext().getResources().getStringArray(R.array.grade_array)[position];
143 } 151 }
144 152
145 @Override 153 @Override
146 public void onNothingSelected(AdapterView<?> parent) { 154 public void onNothingSelected(AdapterView<?> parent) {
147 155
148 } 156 }
149 }); 157 });
150 ArrayAdapter<String> reasonAdapter = new ArrayAdapter<>(context, R.layout.item_for_custom_spinner, context.getResources().getStringArray(R.array.error_reason)); 158 ArrayAdapter<String> reasonAdapter = new ArrayAdapter<>(context, R.layout.item_for_custom_spinner, context.getResources().getStringArray(R.array.error_reason));
151 binding.spinnerReason.setAdapter(reasonAdapter); 159 binding.spinnerReason.setAdapter(reasonAdapter);
152 binding.spinnerReason.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 160 binding.spinnerReason.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
153 @Override 161 @Override
154 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 162 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
155 reason = position; 163 reason = position;
156 } 164 }
157 165
158 @Override 166 @Override
159 public void onNothingSelected(AdapterView<?> parent) { 167 public void onNothingSelected(AdapterView<?> parent) {
160 168
161 } 169 }
162 }); 170 });
163 RadioButton typeButton = (RadioButton) binding.typeRadio.getChildAt(type); 171 RadioButton typeButton = (RadioButton) binding.typeRadio.getChildAt(type);
164 typeButton.setChecked(true); 172 typeButton.setChecked(true);
165 binding.typeRadio.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 173 binding.typeRadio.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
166 @Override 174 @Override
167 public void onCheckedChanged(RadioGroup group, int checkedId) { 175 public void onCheckedChanged(RadioGroup group, int checkedId) {
168 RadioButton rcheck = (RadioButton) findViewById(checkedId); 176 RadioButton rcheck = (RadioButton) findViewById(checkedId);
169 type = getContext().getString(R.string.topic_type_in).equals(rcheck.getText().toString()) ? 0 : 1; 177 type = getContext().getString(R.string.topic_type_in).equals(rcheck.getText().toString()) ? 0 : 1;
170 list.get(select).setType(type); 178 list.get(select).setType(type);
171 } 179 }
172 }); 180 });
173 binding.ivBack.setOnClickListener(new View.OnClickListener() { 181 binding.ivBack.setOnClickListener(new View.OnClickListener() {
174 @Override 182 @Override
175 public void onClick(View v) { 183 public void onClick(View v) {
176 dismiss(); 184 dismiss();
177 } 185 }
178 }); 186 });
179 binding.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 187 binding.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
180 @Override 188 @Override
181 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 189 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
182 if (isChecked) { 190 if (isChecked) {
183 binding.addTopic.setText("全部加入错题本"); 191 binding.addTopic.setText("全部加入错题本");
184 } else { 192 } else {
185 binding.addTopic.setText("第" + StringUtils.intToChinese(select + 1) + "题加入错题本"); 193 binding.addTopic.setText("第" + StringUtils.intToChinese(select + 1) + "题加入错题本");
186 } 194 }
187 } 195 }
188 }); 196 });
189 binding.addTopic.setOnClickListener(new View.OnClickListener() { 197 binding.addTopic.setOnClickListener(new View.OnClickListener() {
190 @Override 198 @Override
191 public void onClick(View v) { 199 public void onClick(View v) {
192 if (binding.checkbox.isChecked()) { 200 if (binding.checkbox.isChecked()) {
193 for (TopicBean topicBean : list) { 201 for (TopicBean topicBean : list) {
194 addTopic(topicBean); 202 addTopic(topicBean);
195 } 203 }
196 } else { 204 } else {
197 addTopic(list.get(select)); 205 addTopic(list.get(select));
198 } 206 }
199 } 207 }
200 }); 208 });
201 loadError(); 209 loadError();
202 } 210 }
203 211
204 212
205 private void refreshSubject(List<Subject> subjects) { 213 private void refreshSubject(List<Subject> subjects) {
206 List<String> s = new ArrayList<>(); 214 List<String> s = new ArrayList<>();
207 for (Subject subject : subjects) { 215 for (Subject subject : subjects) {
208 s.add(subject.getSubject()); 216 s.add(subject.getSubject());
209 } 217 }
210 ArrayAdapter<String> subjectAdapter = new ArrayAdapter<>(context, R.layout.item_for_custom_spinner, s); 218 ArrayAdapter<String> subjectAdapter = new ArrayAdapter<>(context, R.layout.item_for_custom_spinner, s);
211 binding.spinnerSubject.setAdapter(subjectAdapter); 219 binding.spinnerSubject.setAdapter(subjectAdapter);
212 binding.spinnerSubject.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 220 binding.spinnerSubject.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
213 @Override 221 @Override
214 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 222 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
215 subject = subjects.get(position); 223 subject = subjects.get(position);
216 } 224 }
217 225
218 @Override 226 @Override
219 public void onNothingSelected(AdapterView<?> parent) { 227 public void onNothingSelected(AdapterView<?> parent) {
220 228
221 } 229 }
222 }); 230 });
223 } 231 }
224 232
225 private void loadError() { 233 private void loadError() {
226 TopicBean bean = list.get(select); 234 TopicBean bean = list.get(select);
227 Glide.with(getContext()).load(bean.getPath()).override(CommonUtil.getScreenWidth(context) - CommonUtil.dpToPx(getContext(), 40), CommonUtil.dpToPx(getContext(), 90)).fitCenter().into(binding.ivTopic); 235 Glide.with(getContext()).load(bean.getPath()).override(CommonUtil.getScreenWidth(context) - CommonUtil.dpToPx(getContext(), 40), CommonUtil.dpToPx(getContext(), 90)).fitCenter().into(binding.ivTopic);
228 if (!binding.checkbox.isChecked()) { 236 if (!binding.checkbox.isChecked()) {
229 binding.addTopic.setText("第" + StringUtils.intToChinese(select + 1) + "题加入错题本"); 237 binding.addTopic.setText("第" + StringUtils.intToChinese(select + 1) + "题加入错题本");
230 } 238 }
231 } 239 }
232 240
233 private void addTopic(TopicBean bean) { 241 private void addTopic(TopicBean bean) {
234 if (!bean.isFinish()) { 242 if (!bean.isFinish()) {
235 bean.setId(String.valueOf(System.currentTimeMillis())); 243 bean.setId(String.valueOf(System.currentTimeMillis()));
236 bean.setDate(String.valueOf(System.currentTimeMillis())); 244 bean.setDate(String.valueOf(System.currentTimeMillis()));
237 bean.setGrade(grade.getGrade()); 245 bean.setGrade(grade.getGrade());
238 bean.setType(type); 246 bean.setType(type);
239 bean.setSubject(subject.getSubject()); 247 bean.setSubject(subject.getSubject());
240 String student = (String) SharedPreferencesUtil.getData("student", ""); 248 String student = (String) SharedPreferencesUtil.getData("student", "");
241 StudentBean studentBean = new Gson().fromJson(student, StudentBean.class); 249 StudentBean studentBean = new Gson().fromJson(student, StudentBean.class);
242 Map<String, String> param = new HashMap<>(); 250 Map<String, String> param = new HashMap<>();
243 param.put("bookId", bean.getId()); 251 param.put("bookId", bean.getId());
244 param.put("stuId", studentBean.getStuId()); 252 param.put("stuId", studentBean.getStuId());
245 param.put("errorReason", String.valueOf(reason)); 253 param.put("errorReason", String.valueOf(reason));
246 param.put("title", grade.getGrade() + "-" + subject.getSubject() + "-" + (type == 0 ? "课内" : "课外") + "错题"); 254 param.put("title", grade.getGrade() + "-" + subject.getSubject() + "-" + (type == 0 ? "课内" : "课外") + "错题");
247 param.put("subject", bean.getSubject()); 255 param.put("subject", bean.getSubject());
248 param.put("grade", bean.getGrade() + term); 256 param.put("grade", bean.getGrade() + term);
249 param.put("type", String.valueOf(bean.getType())); 257 param.put("type", String.valueOf(bean.getType()));
250 param.put("teacherFlag", "0"); 258 param.put("teacherFlag", "0");
251 param.put("controlFlag", "1"); 259 param.put("controlFlag", "1");
252 NetWorks.addError(bean.getPath(), param, new Observer<ResponseResult>() { 260 NetWorks.addError(bean.getPath(), param, new Observer<ResponseResult>() {
253 @Override 261 @Override
254 public void onSubscribe(Disposable d) { 262 public void onSubscribe(Disposable d) {
255 263
256 } 264 }
257 265
258 @Override 266 @Override
259 public void onNext(ResponseResult responseResult) { 267 public void onNext(ResponseResult responseResult) {
260 if (responseResult.getCode() == 200) { 268 if (responseResult.getCode() == 200) {
261 bean.setFinish(true); 269 bean.setFinish(true);
262 boolean isAllAdd = true; 270 boolean isAllAdd = true;
263 for (int i = 0; i < list.size(); i++) { 271 for (int i = 0; i < list.size(); i++) {
264 if (!list.get(i).isFinish()) { 272 if (!list.get(i).isFinish()) {
265 select = i; 273 select = i;
266 adapter.notifyDataSetChanged(); 274 adapter.notifyDataSetChanged();
267 isAllAdd = false; 275 isAllAdd = false;
268 loadError(); 276 loadError();
269 break; 277 break;
270 } 278 }
271 } 279 }
272 if (isAllAdd) { 280 if (isAllAdd) {
273 dismiss(); 281 dismiss();
274 Intent intent = new Intent(context, AddSuccessActivity.class); 282 function.invoke();
275 context.startActivity(intent); 283 // Intent intent = new Intent(context, AddSuccessActivity.class);
276 context.finish(); 284 // context.startActivity(intent);
285 // context.finish();
277 } 286 }
278 } 287 }
279 } 288 }
280 289
281 @Override 290 @Override
282 public void onError(Throwable e) { 291 public void onError(Throwable e) {
283 292
284 } 293 }
285 294
286 @Override 295 @Override
287 public void onComplete() { 296 public void onComplete() {
288 297
289 } 298 }
290 }); 299 });
291 } 300 }
292 } 301 }
293 } 302 }
294 303
app/src/main/java/com/hjx/parent/utils/CutUtil.java
1 package com.hjx.parent.utils; 1 package com.hjx.parent.utils;
2 2
3 import android.content.Context; 3 import android.content.Context;
4 import android.graphics.Bitmap; 4 import android.graphics.Bitmap;
5 import android.graphics.Canvas; 5 import android.graphics.Canvas;
6 import android.graphics.Color; 6 import android.graphics.Color;
7 import android.graphics.Paint; 7 import android.graphics.Paint;
8 import android.util.Base64; 8 import android.util.Base64;
9 import android.view.View; 9 import android.view.View;
10 import android.view.ViewTreeObserver; 10 import android.view.ViewTreeObserver;
11 11
12 import com.bumptech.glide.Glide; 12 import com.bumptech.glide.Glide;
13 import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; 13 import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
14 import com.hjx.parent.function.Function1; 14 import com.hjx.parent.function.Function1;
15 import com.prws.common.utils.CommonUtil;
15 16
16 import java.io.ByteArrayOutputStream; 17 import java.io.ByteArrayOutputStream;
17 import java.io.File; 18 import java.io.File;
19 import java.io.FileOutputStream;
18 import java.io.IOException; 20 import java.io.IOException;
19 import java.util.List; 21 import java.util.List;
20 22
21 import top.zibin.luban.Luban; 23 import top.zibin.luban.Luban;
22 24
23 public class CutUtil { 25 public class CutUtil {
24 26
25 public static float[] measureBitmap(View view, Bitmap bitmap) { 27 public static float[] measureBitmap(View view, Bitmap bitmap) {
26 float realW; 28 float realW;
27 float realH; 29 float realH;
28 float offsetX; 30 float offsetX;
29 float offsetY; 31 float offsetY;
30 32
31 float vp = 1f * view.getWidth() / view.getHeight(); 33 float vp = 1f * view.getWidth() / view.getHeight();
32 float bp = 1f * bitmap.getWidth() / bitmap.getHeight(); 34 float bp = 1f * bitmap.getWidth() / bitmap.getHeight();
33 35
34 if (vp > bp) { 36 if (vp > bp) {
35 realW = view.getHeight() * bp; 37 realW = view.getHeight() * bp;
36 realH = (float) view.getHeight(); 38 realH = (float) view.getHeight();
37 offsetY = 0f; 39 offsetY = 0f;
38 offsetX = (view.getWidth() - realW) * 0.5f; 40 offsetX = (view.getWidth() - realW) * 0.5f;
39 } else if (vp < bp) { 41 } else if (vp < bp) {
40 realW = (float) view.getWidth(); 42 realW = (float) view.getWidth();
41 realH = view.getWidth() * (1f / bp); 43 realH = view.getWidth() * (1f / bp);
42 offsetX = 0f; 44 offsetX = 0f;
43 offsetY = (view.getHeight() - realH) * 0.5f; 45 offsetY = (view.getHeight() - realH) * 0.5f;
44 } else { 46 } else {
45 realW = (float) view.getWidth(); 47 realW = (float) view.getWidth();
46 realH = (float) view.getHeight(); 48 realH = (float) view.getHeight();
47 offsetX = 0f; 49 offsetX = 0f;
48 offsetY = 0f; 50 offsetY = 0f;
49 } 51 }
50 52
51 return new float[]{realW, realH, offsetX, offsetY}; 53 return new float[]{realW, realH, offsetX, offsetY};
52 } 54 }
53 55
54 public static Bitmap cut(Bitmap source, float x, float y, int w, int h, Context context) { 56 public static Bitmap cut(Bitmap source, float x, float y, int w, int h, Context context) {
55 // 获取 Glide 的 BitmapPool 57 // 获取 Glide 的 BitmapPool
56 BitmapPool bitmapPool = Glide.get(context).getBitmapPool(); 58 BitmapPool bitmapPool = Glide.get(context).getBitmapPool();
57 59
58 // 从 BitmapPool 中获取可复用的 Bitmap 60 // 从 BitmapPool 中获取可复用的 Bitmap
59 Bitmap result = bitmapPool.get(w, h, source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888); 61 Bitmap result = bitmapPool.get(w, h, source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888);
60 62
61 // 填充白色背景 63 // 填充白色背景
62 result.eraseColor(Color.WHITE); 64 result.eraseColor(Color.WHITE);
63 65
64 // 创建画布并绘制 66 // 创建画布并绘制
65 Canvas canvas = new Canvas(result); 67 Canvas canvas = new Canvas(result);
66 Paint paint = new Paint(); 68 Paint paint = new Paint();
67 canvas.drawBitmap(source, -x, -y, paint); 69 canvas.drawBitmap(source, -x, -y, paint);
68 70
69 return result; 71 return result;
70 } 72 }
71 73
72 public static void onLayoutReady(final View view, final Function1<View> action) { 74 public static void onLayoutReady(final View view, final Function1<View> action) {
73 view.getViewTreeObserver().addOnGlobalLayoutListener( 75 view.getViewTreeObserver().addOnGlobalLayoutListener(
74 new ViewTreeObserver.OnGlobalLayoutListener() { 76 new ViewTreeObserver.OnGlobalLayoutListener() {
75 @Override 77 @Override
76 public void onGlobalLayout() { 78 public void onGlobalLayout() {
77 view.getViewTreeObserver().removeOnGlobalLayoutListener(this); 79 view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
78 action.invoke(view); 80 action.invoke(view);
79 } 81 }
80 } 82 }
81 ); 83 );
82 } 84 }
83 85
84 public static byte[] bitmapToByteArray(Bitmap bitmap) { 86 public static byte[] bitmapToByteArray(Bitmap bitmap) {
85 ByteArrayOutputStream output = new ByteArrayOutputStream(); 87 ByteArrayOutputStream output = new ByteArrayOutputStream();
86 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, output); 88 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, output);
87 return output.toByteArray(); 89 return output.toByteArray();
88 } 90 }
89 91
90 public static String bitmapToBase64(Bitmap bitmap, Boolean usePrefix) { 92 public static String bitmapToBase64(Bitmap bitmap, Boolean usePrefix) {
91 String base64 = Base64.encodeToString(bitmapToByteArray(bitmap), Base64.NO_WRAP); 93 String base64 = Base64.encodeToString(bitmapToByteArray(bitmap), Base64.NO_WRAP);
92 if (usePrefix) return "data:image/jpeg;base64," + base64; 94 if (usePrefix) return "data:image/jpeg;base64," + base64;
93 else return base64; 95 else return base64;
94 } 96 }
95 97
96 public static List<File> compressAllSync(Context context, List<String> originList, int ignore) throws IOException { 98 public static List<File> compressAllSync(Context context, List<String> originList, int ignore) throws IOException {
97 return Luban.with(context).ignoreBy(ignore) 99 return Luban.with(context).ignoreBy(ignore)
98 .setTargetDir(context.getExternalCacheDir().getAbsolutePath()) 100 .setTargetDir(context.getExternalCacheDir().getAbsolutePath())
99 .load(originList) 101 .load(originList)
100 .get(); 102 .get();
101 } 103 }
104
105 public static String saveBitmapToCache(Bitmap bitmap, Context context) {
106 String fileName = System.currentTimeMillis() + CommonUtil.getStr() + ".jpg";
107 String path = context.getExternalCacheDir().getPath() + "/images/" + fileName;
108 try {
109 File file = new File(path);
110 File parent = file.getParentFile();
111 if (parent != null && !parent.exists()) {
112 parent.mkdirs();
113 }
114
115 FileOutputStream fos = new FileOutputStream(file);
116 boolean success = bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
117 fos.flush();
118 fos.close();
119
120 if (success) {
121 return path;
122 }
123 } catch (Exception e) {
124 e.printStackTrace();
125 }
126 return null;
127 }
128
102 } 129 }
103 130
app/src/main/res/drawable/bg_error_add_enabled.xml
File was created 1 <?xml version="1.0" encoding="utf-8"?>
2 <selector xmlns:android="http://schemas.android.com/apk/res/android">
3 <item android:state_enabled="false">
4 <shape>
5 <corners android:radius="5dp"/>
6 <solid android:color="#8DC7F9"/>
7 </shape>
8 </item>
9 <item>
10 <shape>
11 <corners android:radius="5dp"/>
12 <solid android:color="#1C90F3"/>
13 </shape>
14 </item>
15 </selector>
app/src/main/res/layout/activity_judge.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto" 3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 xmlns:tools="http://schemas.android.com/tools" 4 xmlns:tools="http://schemas.android.com/tools"
5 android:orientation="vertical" 5 android:orientation="vertical"
6 android:layout_width="match_parent" 6 android:layout_width="match_parent"
7 android:layout_height="match_parent" 7 android:layout_height="match_parent"
8 tools:ignore="UseCompoundDrawables,HardcodedText,SmallSp,ContentDescription"> 8 tools:ignore="UseCompoundDrawables,HardcodedText,SmallSp,ContentDescription">
9 9
10 <androidx.appcompat.widget.Toolbar 10 <androidx.appcompat.widget.Toolbar
11 android:background="@color/white" 11 android:background="@color/white"
12 app:contentInsetStart="0dp" 12 app:contentInsetStart="0dp"
13 android:layout_width="match_parent" 13 android:layout_width="match_parent"
14 android:layout_height="40dp"> 14 android:layout_height="40dp">
15 <ImageView 15 <ImageView
16 android:id="@+id/ivBack" 16 android:id="@+id/ivBack"
17 android:layout_width="30dp" 17 android:layout_width="30dp"
18 android:layout_height="36dp" 18 android:layout_height="36dp"
19 android:layout_centerVertical="true" 19 android:layout_centerVertical="true"
20 android:layout_marginStart="5dp" 20 android:layout_marginStart="5dp"
21 android:padding="10dp" 21 android:padding="10dp"
22 android:src="@mipmap/icon_back" /> 22 android:src="@mipmap/icon_back" />
23 </androidx.appcompat.widget.Toolbar> 23 </androidx.appcompat.widget.Toolbar>
24 24
25 <FrameLayout 25 <FrameLayout
26 android:background="@color/white" 26 android:background="@color/white"
27 android:padding="8dp" 27 android:padding="8dp"
28 android:layout_margin="16dp" 28 android:layout_margin="16dp"
29 android:layout_width="match_parent" 29 android:layout_width="match_parent"
30 android:layout_height="0px" 30 android:layout_height="0px"
31 android:layout_weight="1"> 31 android:layout_weight="1">
32 <ImageView 32 <ImageView
33 android:id="@+id/ivPic" 33 android:id="@+id/ivPic"
34 android:layout_width="match_parent" 34 android:layout_width="match_parent"
35 android:layout_height="match_parent"/> 35 android:layout_height="match_parent"/>
36 <FrameLayout 36 <FrameLayout
37 android:id="@+id/flRects" 37 android:id="@+id/flRects"
38 android:layout_width="match_parent" 38 android:layout_width="match_parent"
39 android:layout_height="match_parent" /> 39 android:layout_height="match_parent" />
40 </FrameLayout> 40 </FrameLayout>
41 41
42 <LinearLayout 42 <LinearLayout
43 android:orientation="horizontal" 43 android:orientation="horizontal"
44 android:gravity="center_vertical" 44 android:gravity="center_vertical"
45 android:paddingHorizontal="16dp" 45 android:paddingHorizontal="16dp"
46 android:background="@color/white" 46 android:background="@color/white"
47 android:layout_width="match_parent" 47 android:layout_width="match_parent"
48 android:layout_height="64dp"> 48 android:layout_height="64dp">
49 <androidx.appcompat.widget.AppCompatTextView 49 <androidx.appcompat.widget.AppCompatTextView
50 android:id="@+id/btnSelectAll" 50 android:id="@+id/btnSelectAll"
51 android:text="全选" 51 android:text="全选"
52 android:textSize="16sp" 52 android:textSize="16sp"
53 android:textColor="#333" 53 android:textColor="#333"
54 android:gravity="center_vertical" 54 android:gravity="center_vertical"
55 android:paddingHorizontal="8dp" 55 android:paddingHorizontal="8dp"
56 android:paddingVertical="4dp" 56 android:paddingVertical="4dp"
57 android:layout_width="wrap_content" 57 android:layout_width="wrap_content"
58 android:layout_height="wrap_content"/> 58 android:layout_height="wrap_content"/>
59 59
60 <Space style="@style/empty_space"/> 60 <Space style="@style/empty_space"/>
61 <TextView 61 <TextView
62 android:id="@+id/btnAdd" 62 android:id="@+id/btnAdd"
63 android:enabled="false"
63 android:text="加入错题" 64 android:text="加入错题"
64 android:textSize="16sp" 65 android:textSize="16sp"
65 android:textColor="@color/white" 66 android:textColor="@color/white"
66 android:gravity="center" 67 android:gravity="center"
67 android:background="@drawable/shape_radius_5" 68 android:background="@drawable/bg_error_add_enabled"
68 android:backgroundTint="#1C90F3"
69 android:layout_width="112dp" 69 android:layout_width="112dp"
70 android:layout_height="36dp"/> 70 android:layout_height="36dp"/>
71 </LinearLayout> 71 </LinearLayout>
72 72