|  |  | 
 |  |  | package com.dayu.pipirrapp.net; | 
 |  |  |  | 
 |  |  | import static com.dayu.pipirrapp.bean.net.UplodFileState.STATE_DONE; | 
 |  |  | import static com.dayu.pipirrapp.bean.net.UplodFileState.STATE_ERROR; | 
 |  |  | import static com.dayu.pipirrapp.bean.net.UplodFileState.STATE_UPDING; | 
 |  |  | import static com.luck.picture.lib.thread.PictureThreadUtils.runOnUiThread; | 
 |  |  |  | 
 |  |  | import android.annotation.SuppressLint; | 
 |  |  | import android.content.Context; | 
 |  |  | import android.content.Intent; | 
 |  |  | import android.text.TextUtils; | 
 |  |  | import android.util.Log; | 
 |  |  |  | 
 |  |  | import com.dayu.pipirrapp.MyApplication; | 
 |  |  | import com.dayu.pipirrapp.activity.LoginActivity; | 
 |  |  | import com.dayu.pipirrapp.adapter.AddPictureAdapter; | 
 |  |  | import com.dayu.pipirrapp.bean.net.CodeResult; | 
 |  |  | import com.dayu.pipirrapp.bean.net.UplodFileState; | 
 |  |  | import com.dayu.pipirrapp.bean.net.WeatherResponse; | 
 |  |  | import com.dayu.pipirrapp.bean.net.UploadFileResult; | 
 |  |  | import com.dayu.pipirrapp.net.subscribers.BaseProgressSubscriber; | 
 |  |  | import com.dayu.pipirrapp.net.subscribers.CodeListener; | 
 |  |  | import com.dayu.pipirrapp.net.subscribers.ProgressSubscriber; | 
 |  |  | import com.dayu.pipirrapp.net.subscribers.SubscriberListener; | 
 |  |  | import com.dayu.pipirrapp.net.upload.ProgressListener; | 
 |  |  | import com.dayu.pipirrapp.net.upload.ProgressRequestBody; | 
 |  |  | import com.dayu.pipirrapp.net.upload.UploadFileListener; | 
 |  |  | import com.dayu.pipirrapp.utils.CleanDataUtils; | 
 |  |  | 
 |  |  | import com.dayu.pipirrapp.utils.MyJsonParser; | 
 |  |  | import com.dayu.pipirrapp.utils.MyLog; | 
 |  |  | import com.dayu.pipirrapp.utils.NetUtils; | 
 |  |  | import com.google.gson.Gson; | 
 |  |  | import com.google.gson.internal.LinkedTreeMap; | 
 |  |  |  | 
 |  |  | import java.io.File; | 
 |  |  | import java.util.HashMap; | 
 |  |  | 
 |  |  |     //文件上传失败重复次数 | 
 |  |  |     int uplodFilerepeatSize = 3; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     ApiService apiService; | 
 |  |  |     private CompositeDisposable compositeDisposable = new CompositeDisposable(); // 管理订阅事件 | 
 |  |  |     // 管理订阅事件 | 
 |  |  |     private final CompositeDisposable compositeDisposable = new CompositeDisposable(); | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 初始化通信框架 | 
 |  |  | 
 |  |  |                     public BaseResponse<T> apply(Object o) { | 
 |  |  |                         if (o instanceof BaseResponse) { | 
 |  |  |                             BaseResponse tem = (BaseResponse) o; | 
 |  |  |                             if (tem.getCode().equals("0000")) { | 
 |  |  |                             if (tem.getCode().equals(Constants.TOKEN_INVALID)) { | 
 |  |  |                                 //当code为0000是跳转到登录界面 | 
 |  |  |                                 tem.setMsg("登录失效请重新登录"); | 
 |  |  |                                 redirectToLogin(); | 
 |  |  | 
 |  |  |                             } | 
 |  |  |                             BaseResponse<T> response = new BaseResponse<>(); | 
 |  |  |                             response.setCode(tem.getCode()); | 
 |  |  |                             response.setMsg(tem.getMsg()); | 
 |  |  |                             if (!TextUtils.isEmpty(tem.getMsg())) { | 
 |  |  |                                 response.setMsg(tem.getMsg()); | 
 |  |  |                             } else { | 
 |  |  |                                 response.setMsg(""); | 
 |  |  |                             } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                             if (tClass != null) { | 
 |  |  |                                 if (tem.getContent() instanceof Map) { | 
 |  |  | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |             Observable<ResponseBody> observable; | 
 |  |  |             observable = apiService.downloadTile(urlPath); | 
 |  |  |             observable | 
 |  |  |                     .subscribeOn(Schedulers.io())  // 网络请求在 I/O 线程中进行 | 
 |  |  |                     .observeOn(Schedulers.io())    // 回调处理也在 I/O 线程 | 
 |  |  |                     // 网络请求在 I/O 线程中进行 | 
 |  |  |                     .subscribeOn(Schedulers.io()) | 
 |  |  |                     // 回调处理也在 I/O 线程 | 
 |  |  |                     .observeOn(Schedulers.io()) | 
 |  |  |                     .subscribe( | 
 |  |  |                             responseBody -> { | 
 |  |  |  | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | //    public void uploadFile(final Context context, final UplodFileState uplodData, final UploadFileListener listener) { | 
 |  |  | //        uploadFile(context, uplodData, listener, null); | 
 |  |  | //    } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 上传文件 | 
 |  |  |      * 上传图片文件 | 
 |  |  |      * | 
 |  |  |      * @param context | 
 |  |  |      * @param uplodData | 
 |  |  |      * @param listener | 
 |  |  |      */ | 
 |  |  |     public void uploadFile(final Context context, final UplodFileState uplodData, final UploadFileListener listener) { | 
 |  |  |     public void uploadFile(final Context context, final UplodFileState uplodData, final UploadFileListener listener, final AddPictureAdapter adapter) { | 
 |  |  |  | 
 |  |  |         File file = new File(uplodData.getFilePath()); | 
 |  |  |         RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); | 
 |  |  |         ProgressRequestBody progressRequestBody = new ProgressRequestBody(requestBody, new ProgressListener() { | 
 |  |  |             @Override | 
 |  |  |             public void onProgress(long bytesWritten, long contentLength, boolean done) { | 
 |  |  |         if (!TextUtils.isEmpty(uplodData.getFilePath())) { | 
 |  |  |             MyLog.d("progressRequestBody_uploadFile>>>" + "path:" + uplodData.getFilePath() + ">>>uploadType:" + uplodData.getUploadType()); | 
 |  |  |             uplodData.setState(STATE_UPDING); | 
 |  |  |             File file = new File(uplodData.getFilePath()); | 
 |  |  |             RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); | 
 |  |  |             ProgressRequestBody progressRequestBody = new ProgressRequestBody(requestBody, (bytesWritten, contentLength, done) -> { | 
 |  |  | //            MyLog.d("progressRequestBody>>>" + "bytesWritten:" + bytesWritten + ">>>contentLength: " + contentLength ); | 
 |  |  |                 // 更新进度条或进行其他操作 | 
 |  |  |                 int progress = (int) (100 * bytesWritten / contentLength); | 
 |  |  |                 // 例如:更新 ProgressBar 或显示进度 | 
 |  |  |                 runOnUiThread(() -> { | 
 |  |  |                     if (progress <5) { | 
 |  |  |                         uplodData.setProgress(0); | 
 |  |  |                     } | 
 |  |  |                     // 进度条更新代码 | 
 |  |  |                     // progressBar.setProgress(progress); | 
 |  |  |                     MyLog.d("progressRequestBody>>>" + "上传进度: " + progress + "%"); | 
 |  |  |                     if (adapter != null && uplodData.getAdapterPosition() != -1) { | 
 |  |  |                         //优化不频繁更新进度 | 
 |  |  |                         if (progress - uplodData.getProgress() > 5 || progress == 100) { | 
 |  |  |                             uplodData.setProgress(progress); | 
 |  |  |                             adapter.updateProgress(uplodData); | 
 |  |  |  | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                     } | 
 |  |  |                     MyLog.d("progressRequestBodyHolder>>>path" + "adapterPosition:" + uplodData.getAdapterPosition() + ">>>上传进度: " + progress + "%"); | 
 |  |  |                 }); | 
 |  |  |  | 
 |  |  |             }); | 
 |  |  |             MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), progressRequestBody); | 
 |  |  |             RequestBody description = RequestBody.create(MediaType.parse("text/plain"), "file description"); | 
 |  |  |             Call<BaseResponse<UploadFileResult>> uploadFile = null; | 
 |  |  |             switch (uplodData.getUploadType()) { | 
 |  |  |                 case UplodFileState.IMG_TYPE: | 
 |  |  |                     uploadFile = apiService.uploadImgFile(body, description); | 
 |  |  |                     break; | 
 |  |  |                 case UplodFileState.VIDEO_TYPE: | 
 |  |  |                     uploadFile = apiService.uploadVideoFile(body, description); | 
 |  |  |                     break; | 
 |  |  |                 default: | 
 |  |  |                     uploadFile = apiService.uploadImgFile(body, description); | 
 |  |  |                     break; | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |         MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), progressRequestBody); | 
 |  |  |         RequestBody description = RequestBody.create(MediaType.parse("text/plain"), "file description"); | 
 |  |  |         Call<BaseResponse> uploadFile = apiService.uploadFile(body, description); | 
 |  |  |         uplodData.setThisCall(uploadFile); | 
 |  |  |         uploadFile.enqueue(new Callback<BaseResponse>() { | 
 |  |  |             @Override | 
 |  |  |             public void onResponse(Call<BaseResponse> call, Response<BaseResponse> response) { | 
 |  |  |                 if (response.body() != null) { | 
 |  |  |                     if (response.body().isSuccess()) { | 
 |  |  |                         uplodData.setState(1); | 
 |  |  |                         uplodData.setId(((LinkedTreeMap) response.body().getContent()).get("id").toString()); | 
 |  |  |                         uplodData.setWebPath(((LinkedTreeMap) response.body().getContent()).get("webPath").toString()); | 
 |  |  |                         listener.onBack(uplodData); | 
 |  |  |                     } else { | 
 |  |  |                         if (uplodData.getNumber() <= uplodFilerepeatSize) { | 
 |  |  |                             uplodData.setNumber(uplodData.getNumber() + 1); | 
 |  |  |                             uplodData.setState(2); | 
 |  |  |                             uploadFile(context, uplodData, listener); | 
 |  |  |                         } else { | 
 |  |  |  | 
 |  |  |             uplodData.setThisCall(uploadFile); | 
 |  |  |             uploadFile.enqueue(new Callback<BaseResponse<UploadFileResult>>() { | 
 |  |  |                 @Override | 
 |  |  |                 public void onResponse(Call<BaseResponse<UploadFileResult>> call, Response<BaseResponse<UploadFileResult>> response) { | 
 |  |  |                     if (response.body() != null) { | 
 |  |  |                         if (response.body().isSuccess()) { | 
 |  |  |                             UploadFileResult uploadFileResult=response.body().getContent(); | 
 |  |  |                             uplodData.setState(STATE_DONE); | 
 |  |  |                             uplodData.setPostId(uploadFileResult.getId()); | 
 |  |  |                             uplodData.setUoloadFilePath(uploadFileResult.getFilePath()); | 
 |  |  |                             uplodData.setHash(uploadFileResult.getHash()); | 
 |  |  |                             uplodData.setWebPathZip(uploadFileResult.getWebPathZip()); | 
 |  |  |                             listener.onBack(uplodData); | 
 |  |  |                         } else { | 
 |  |  |                             MyLog.d("progressRequestBody>>>" + response.body().getMsg()); | 
 |  |  |                             if (uplodData.getNumber() <= uplodFilerepeatSize) { | 
 |  |  |                                 uplodData.setNumber(uplodData.getNumber() + 1); | 
 |  |  |                                 uplodData.setState(STATE_ERROR); | 
 |  |  |                                 uploadFile(context, uplodData, listener, adapter); | 
 |  |  |                             } else { | 
 |  |  |                                 uplodData.setState(STATE_ERROR); | 
 |  |  |                                 uplodData.setNumber(0); | 
 |  |  |                                 listener.onBack(uplodData); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onFailure(Call<BaseResponse> call, Throwable t) { | 
 |  |  |                 if (uplodData.getNumber() <= uplodFilerepeatSize) { | 
 |  |  |                     uplodData.setNumber(uplodData.getNumber() + 1); | 
 |  |  |                     uplodData.setState(2); | 
 |  |  |                     uploadFile(context, uplodData, listener); | 
 |  |  |                 } else { | 
 |  |  |                     listener.onBack(uplodData); | 
 |  |  |                 @Override | 
 |  |  |                 public void onFailure(Call<BaseResponse<UploadFileResult>> call, Throwable t) { | 
 |  |  |                     MyLog.d("progressRequestBody>>>" + "onFailure:" + t.getMessage()); | 
 |  |  |                     if (!t.getMessage().equals("Canceled")) { | 
 |  |  |                         uplodData.setState(STATE_ERROR); | 
 |  |  |                         if (uplodData.getNumber() <= uplodFilerepeatSize) { | 
 |  |  |                             uplodData.setNumber(uplodData.getNumber() + 1); | 
 |  |  |                             uploadFile(context, uplodData, listener, adapter); | 
 |  |  |                         } else { | 
 |  |  |                             uplodData.setNumber(0); | 
 |  |  |                             listener.onBack(uplodData); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 判断当前code是否是未登录状态 | 
 |  |  |      * | 
 |  |  |      * @param responseBody the response body in JSON format | 
 |  |  |      * @return true if login is required, false otherwise | 
 |  |  |      */ | 
 |  |  |     private boolean isLoginRequired(String responseBody) { | 
 |  |  |         try { | 
 |  |  |             Gson gson = new Gson(); | 
 |  |  |             Map<String, Object> responseMap = gson.fromJson(responseBody, Map.class); | 
 |  |  |             String code = (String) responseMap.get("code"); | 
 |  |  |             return "0000".equals(code);  // Check if the code is not 0000 | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             }); | 
 |  |  |         } else { | 
 |  |  |             uplodData.setState(STATE_ERROR); | 
 |  |  |             listener.onBack(uplodData); | 
 |  |  |         } | 
 |  |  |         return false; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 当code为“0000”时跳转到登录界面 | 
 |  |  |      */ |