diff --git a/app/src/main/java/com/hjx/parent/ImageActivity.java b/app/src/main/java/com/hjx/parent/ImageActivity.java index 091dc69..6f7c577 100644 --- a/app/src/main/java/com/hjx/parent/ImageActivity.java +++ b/app/src/main/java/com/hjx/parent/ImageActivity.java @@ -347,10 +347,16 @@ public class ImageActivity extends BaseRxActivity implemen 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(); + addHomeworkDialog.show(paths, () -> { + // TODO + }); } } diff --git a/app/src/main/java/com/hjx/parent/dialog/AddHomeworkDialog.java b/app/src/main/java/com/hjx/parent/dialog/AddHomeworkDialog.java index 1ac45ca..d95940f 100644 --- a/app/src/main/java/com/hjx/parent/dialog/AddHomeworkDialog.java +++ b/app/src/main/java/com/hjx/parent/dialog/AddHomeworkDialog.java @@ -2,39 +2,47 @@ package com.hjx.parent.dialog; import android.annotation.SuppressLint; import android.content.Context; +import android.util.Pair; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; +import android.widget.Toast; import androidx.annotation.NonNull; import com.bigkoo.pickerview.builder.TimePickerBuilder; -import com.bigkoo.pickerview.listener.OnTimeSelectListener; -import com.bigkoo.pickerview.view.TimePickerView; import com.google.gson.Gson; import com.hjx.parent.R; import com.hjx.parent.bean.StudentBean; import com.hjx.parent.databinding.DialogAddHomeworkBinding; -import com.hjx.parent.rx.ILifecycleActivity; +import com.hjx.parent.function.Function0; +import com.hjx.parent.rx.BaseRxActivity; import com.prws.common.bean.GradeAndSubject; import com.prws.common.bean.ResponseResult; import com.prws.common.bean.Student; import com.prws.common.bean.Subject; +import com.prws.common.bean.baidu.BaiduInput; import com.prws.common.net.NetWorks; import com.prws.common.utils.SharedPreferencesUtil; import com.trello.rxlifecycle2.android.RxLifecycleAndroid; +import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; +import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; public class AddHomeworkDialog extends BaseDialog{ - private final ILifecycleActivity activity; + private final BaseRxActivity activity; + + private Function0 callback; String stuId; @@ -42,17 +50,25 @@ public class AddHomeworkDialog extends BaseDialog{ List studentList; List gradeAndSubjectList; + List images; + Student student; String grade; String term; String subject; Date uploadTime = new Date(); - public AddHomeworkDialog(ILifecycleActivity context) { + public AddHomeworkDialog(BaseRxActivity context) { super((Context) context); activity = context; } + public void show(List paths, Function0 callback) { + images = paths; + this.callback = callback; + super.show(); + } + @SuppressLint("SetTextI18n") @Override public void initView() { @@ -107,6 +123,15 @@ public class AddHomeworkDialog extends BaseDialog{ }).setType(new boolean[]{true, true, true, false, false, false}).isDialog(true).build().show(); }); + binding.btnConfirm.setOnClickListener(v -> { + String name = binding.etName.getText().toString().trim(); + if (name.isEmpty()) { + Toast.makeText(getContext(), "请输入作业名称", Toast.LENGTH_SHORT).show(); + return; + } + uploadImage(name); + }); + getGrade(); } @@ -183,6 +208,73 @@ public class AddHomeworkDialog extends BaseDialog{ binding.spSubject.setAdapter(new ArrayAdapter<>(getContext(), R.layout.item_spinner, subjects)); } + @SuppressLint("CheckResult") + public void uploadImage(String name) { + activity.showLoadingDialog("上传作业中..."); + Observable.fromIterable(images) + .map(path -> { + int index = images.indexOf(path); + return new Pair<>(index, path); + }) + .subscribeOn(Schedulers.io()) + .flatMap(pair -> { + int index = pair.first; + String path = pair.second; + File file = new File(path); + String id = file.getName().substring(0, file.getName().lastIndexOf(".")); + return Observable.just(file) + .map(var -> { + BaiduInput baiduInput = NetWorks.inputImage(path, id).blockingGet(); + if (baiduInput.getError_code() != null) { + throw new RuntimeException("图片入库失败"); + } else { + return baiduInput; + } + }) + .map(var -> NetWorks.uploadImage(path, id).blockingGet()) + .map(var -> { + Map map = new HashMap<>(); + map.put("brief", id); + map.put("sort", index); + return map; + }); + }, 2) + .toList() + .map(list -> { + List stuIds = new ArrayList<>(); + stuIds.add(student.stuId); + String userId = NetWorks.getUserId(); + + Map map = new HashMap<>(); + map.put("name", name); + map.put("grade", grade); + map.put("term", term); + map.put("subject", subject); + map.put("userId", userId); + map.put("stuIds", stuIds); + map.put("briefList", list); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); + map.put("uploadTime", format.format(uploadTime)); + return map; + }) + .flatMap(body -> { + return NetWorks.service_url.uploadHomework(NetWorks.getHeader(), body); + }) + .observeOn(AndroidSchedulers.mainThread()) + .compose(RxLifecycleAndroid.bindActivity(activity.getRxLifecycle())) + .subscribe((response, th) -> { + if (th != null) th.printStackTrace(); + if (response != null && response.getSuccess()) { + activity.cancelLoadingDialog(); + dismiss(); + if (callback != null) callback.invoke(); + } else { + activity.loadFail("上传作业失败"); + } + }) + ; + } + @NonNull @Override public DialogAddHomeworkBinding getBinding() { diff --git a/app/src/main/res/layout/dialog_add_homework.xml b/app/src/main/res/layout/dialog_add_homework.xml index 4dd5d87..7c2650a 100644 --- a/app/src/main/res/layout/dialog_add_homework.xml +++ b/app/src/main/res/layout/dialog_add_homework.xml @@ -165,12 +165,13 @@ android:maxLength="50" android:paddingHorizontal="16dp" android:textColor="@color/text_title" - android:textSize="18sp" + android:textSize="13sp" android:inputType="text" tools:ignore="Autofill,LabelFor" /> >> getStudentHomework(@Header("Authorization") String token, @Query("stuId") String stuId); + @POST + Single inputImage(@Url String url, @Body RequestBody body); + + @Multipart + @POST("api/v1/homework/uploadHomework") + Single uploadImage(@Header("Authorization") String token, @Part() MultipartBody.Part file, @Query("brief") String id); + + @POST("api/v1/homework/uploadHomeworkAction") + Single uploadHomework(@Header("Authorization") String token, @Body Object map); + } public static String getUserId() { @@ -194,6 +206,24 @@ public class NetWorks extends RetrofitUtils { return (String) SharedPreferencesUtil.getData("baiduToken", ""); } + public static Single inputImage(String filePath, String id) { + MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); + String base64 = BitmapUtils.fileToBase64(filePath); + File file = new File(filePath); + RequestBody body = RequestBody.create(mediaType, "image=" + base64 + "&brief={\"name\":\"" + file.getName() + "\", \"id\":\"" + id + "\"}"); + return getBaiduTokenOcr().map(jsonObject -> jsonObject.get("access_token").getAsString()) + .flatMap(token -> { + return service_url.inputImage("https://aip.baidubce.com/rest/2.0/realtime_search/same_hq/add?access_token=" + token, body); + }); + } + + public static Single uploadImage(String path, String id) { + File file = new File(path); + RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpg"), file); + MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestBody); + return service_url.uploadImage(getHeader(), part, id); + } + public static void checkUpdate(int code, String packageName, Callback> callback) { service_url.checkUpdate(code, packageName, 0).enqueue(callback); @@ -231,6 +261,10 @@ public class NetWorks extends RetrofitUtils { setSubscribe(service_url.getBaiduToken("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + BuildConfig.APIKey + "&client_secret=" + BuildConfig.SecretKey), observer); } + public static Single getBaiduTokenOcr() { + return service_url.getBaiduToken("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + BuildConfig.APIKey1 + "&client_secret=" + BuildConfig.SecretKey1).firstOrError(); + } + public static void removeWriting(String base64, Observer observer) { MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); RequestBody body = RequestBody.create(mediaType, "image=" + base64);