管灌系统巡查员智能手机App
zuoxiao
2025-01-13 50f9b82ac862652e88444d727a32e0da1d824e9e
app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java
@@ -1,36 +1,66 @@
package com.dayu.pipirrapp.activity;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import static com.dayu.pipirrapp.net.Constants.BASE_URL;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.lifecycle.Observer;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.SimpleItemAnimator;
import com.dayu.pipirrapp.MyApplication;
import com.dayu.pipirrapp.adapter.AddPictureAdapter;
import com.dayu.pipirrapp.bean.db.LatLonBean;
import com.dayu.pipirrapp.bean.net.AddProcessingRequest;
import com.dayu.pipirrapp.bean.net.InsectionResult;
import com.dayu.pipirrapp.bean.net.UplodFileState;
import com.dayu.pipirrapp.databinding.ActivityOrderDealBinding;
import com.dayu.pipirrapp.fragment.OrderFragment;
import com.dayu.pipirrapp.net.ApiManager;
import com.dayu.pipirrapp.net.BaseResponse;
import com.dayu.pipirrapp.net.subscribers.SubscriberListener;
import com.dayu.pipirrapp.net.upload.UploadFileListener;
import com.dayu.pipirrapp.tool.FileUploadUtils;
import com.dayu.pipirrapp.tool.FullyGridLayoutManager;
import com.dayu.pipirrapp.tool.GlideEngine;
import com.dayu.pipirrapp.tool.ImageFileCompressEngine;
import com.dayu.pipirrapp.utils.CommonKeyName;
import com.dayu.pipirrapp.utils.MyLog;
import com.dayu.pipirrapp.utils.ServiceUtils;
import com.dayu.pipirrapp.utils.ToastUtil;
import com.dayu.pipirrapp.view.TitleBar;
import com.jeremyliao.liveeventbus.LiveEventBus;
import com.luck.picture.lib.basic.PictureSelectionModel;
import com.luck.picture.lib.basic.PictureSelector;
import com.luck.picture.lib.config.PictureConfig;
import com.luck.picture.lib.config.PictureMimeType;
import com.luck.picture.lib.config.SelectMimeType;
import com.luck.picture.lib.config.SelectModeConfig;
import com.luck.picture.lib.decoration.GridSpacingItemDecoration;
import com.luck.picture.lib.engine.ImageEngine;
import com.luck.picture.lib.entity.LocalMedia;
import com.luck.picture.lib.interfaces.OnGridItemSelectAnimListener;
import com.luck.picture.lib.interfaces.OnQueryFilterListener;
import com.luck.picture.lib.interfaces.OnSelectAnimListener;
import com.luck.picture.lib.entity.MediaExtraInfo;
import com.luck.picture.lib.interfaces.OnExternalPreviewEventListener;
import com.luck.picture.lib.utils.DensityUtil;
import com.luck.picture.lib.utils.MediaUtils;
import com.luck.picture.lib.utils.PictureFileUtils;
import com.tencent.bugly.crashreport.CrashReport;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import retrofit2.Call;
/**
 * OrderDealDetailActivity -
@@ -41,24 +71,45 @@
 * @since 2024-11-27
 */
public class OrderDealActivity extends BaseActivity {
    private final String TAG = "OrderDealActivity";
    ActivityOrderDealBinding binding;
    RecyclerView mRecyclerView;
    AddPictureAdapter mAdapter;
    int maxSelectNum = 10;//最大照片
    int maxSelectVideoNum = 0;//最大视频
    private final List<LocalMedia> mData = new ArrayList<>();
    private ActivityResultLauncher<Intent> launcherResult;
    private ImageEngine imageEngine;
    //    List<UplodFileState> uplodFileStates = new ArrayList<>();
    Map<String, UplodFileState> uplodFileStates = new HashMap<>();
    String workOrderId;
    LatLonBean latLonBean;
    /**
     * 定位监听
     */
    private Observer<Object> locationObserver = new Observer<Object>() {
        @Override
        public void onChanged(Object o) {
            MyLog.d("OrderDealActivity>>>locationObserver>>");
            latLonBean = (LatLonBean) o;
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityOrderDealBinding.inflate(LayoutInflater.from(this));
        setContentView(binding.getRoot());
        workOrderId = this.getIntent().getStringExtra("workOrderId");
        launcherResult = createActivityResultLauncher();
        initView();
        startLocation();
    }
    void initView() {
        new TitleBar(this).setTitleText("处理工单").setLeftIco().setLeftIcoListening(v -> OrderDealActivity.this.finish());
        mRecyclerView = binding.recycler;
        FullyGridLayoutManager manager = new FullyGridLayoutManager(this,
                4, GridLayoutManager.VERTICAL, false);
@@ -69,33 +120,234 @@
        }
        mRecyclerView.addItemDecoration(new GridSpacingItemDecoration(4,
                DensityUtil.dip2px(this, 8), false));
        mAdapter = new AddPictureAdapter(this, mData);
        mAdapter = new AddPictureAdapter(this, mData, uplodFileStates);
        mAdapter.setSelectMax(maxSelectNum + maxSelectVideoNum);
        mRecyclerView.setAdapter(mAdapter);
        imageEngine = GlideEngine.createGlideEngine();
        mAdapter.setOnItemClickListener(new AddPictureAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View v, int position) {
                // 预览图片、视频、音频
                PictureSelector.create(OrderDealActivity.this)
                        .openPreview()
                        .setImageEngine(imageEngine)
                        .setExternalPreviewEventListener(new MyExternalPreviewEventListener())
                        .startActivityPreview(position, true, mAdapter.getData());
            }
            @Override
            public void openPicture() {
                //添加图片
                mOpenPicture();
            }
            @Override
            public void onDeleteClick(int position) {
                deleteItem(position);
            }
            @Override
            public void onReUpload(UplodFileState uplodFileState) {
                FileUploadUtils.uploadFile(OrderDealActivity.this, uplodFileState, uplodFileStates, mAdapter);
            }
        });
        binding.dealButton.setOnClickListener(v -> {
            boolean isAllPost = true;
            for (UplodFileState imgData : uplodFileStates.values()) {
                if (imgData.getState() == 0) {
                    isAllPost = false;
                }
            }
            if (!TextUtils.isEmpty(binding.contentET.getText().toString())) {
                if (isAllPost) {
                    if (uplodFileStates.size() > 0) {
                        postData();
                    } else {
                        ToastUtil.showToast(OrderDealActivity.this, "请上传图片");
                    }
                } else {
                    ToastUtil.showToast(OrderDealActivity.this, "图片正在上传请稍后提交");
                }
            } else {
                ToastUtil.showToast(OrderDealActivity.this, "请输入反馈内容");
            }
        });
    }
    /**
     * 添加图片
     */
    private void mOpenPicture() {
        // 进入相册
        PictureSelectionModel selectionModel = PictureSelector.create(this)
                .openGallery(SelectMimeType.ofImage())
                .setMaxSelectNum(maxSelectNum)
                .setMaxVideoSelectNum(maxSelectVideoNum)
                .setImageEngine(GlideEngine.createGlideEngine())
                .setImageEngine(imageEngine)
                //设置图片压缩
                .setCompressEngine(new ImageFileCompressEngine())
                .setSelectedData(mAdapter.getData());
        selectionModel.forResult(PictureConfig.CHOOSE_REQUEST);
        selectionModel.forResult(launcherResult);
    }
    /**
     * 创建一个ActivityResultLauncher
     *
     * @return
     */
    private ActivityResultLauncher<Intent> createActivityResultLauncher() {
        return registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
                result -> {
                    int resultCode = result.getResultCode();
                    if (resultCode == RESULT_OK) {
                        ArrayList<LocalMedia> selectList = PictureSelector.obtainSelectorList(result.getData());
                        analyticalSelectResults(selectList);
                    } else if (resultCode == RESULT_CANCELED) {
                        Log.i(TAG, "onActivityResult PictureSelector Cancel");
                    }
                });
    }
    /**
     * 外部预览监听事件
     */
    private class MyExternalPreviewEventListener implements OnExternalPreviewEventListener {
        @Override
        public void onPreviewDelete(int position) {
            deleteItem(position);
            mAdapter.remove(position);
            mAdapter.notifyItemRemoved(position);
        }
        @Override
        public boolean onLongPressDownload(Context context, LocalMedia media) {
            return false;
        }
    }
    /**
     * 处理选择结果
     *
     * @param result
     */
    private void analyticalSelectResults(ArrayList<LocalMedia> result) {
        for (LocalMedia media : result) {
            if (media.getWidth() == 0 || media.getHeight() == 0) {
                if (PictureMimeType.isHasImage(media.getMimeType())) {
                    MediaExtraInfo imageExtraInfo = MediaUtils.getImageSize(this, media.getPath());
                    media.setWidth(imageExtraInfo.getWidth());
                    media.setHeight(imageExtraInfo.getHeight());
                } else if (PictureMimeType.isHasVideo(media.getMimeType())) {
                    MediaExtraInfo videoExtraInfo = MediaUtils.getVideoSize(this, media.getPath());
                    media.setWidth(videoExtraInfo.getWidth());
                    media.setHeight(videoExtraInfo.getHeight());
                }
            }
            Log.i(TAG, "文件名: " + media.getFileName());
            Log.i(TAG, "是否压缩:" + media.isCompressed());
            Log.i(TAG, "压缩:" + media.getCompressPath());
            Log.i(TAG, "初始路径:" + media.getPath());
            Log.i(TAG, "绝对路径:" + media.getRealPath());
            Log.i(TAG, "是否裁剪:" + media.isCut());
            Log.i(TAG, "裁剪路径:" + media.getCutPath());
            Log.i(TAG, "是否开启原图:" + media.isOriginal());
            Log.i(TAG, "原图路径:" + media.getOriginalPath());
            Log.i(TAG, "沙盒路径:" + media.getSandboxPath());
            Log.i(TAG, "水印路径:" + media.getWatermarkPath());
            Log.i(TAG, "视频缩略图:" + media.getVideoThumbnailPath());
            Log.i(TAG, "原始宽高: " + media.getWidth() + "x" + media.getHeight());
            Log.i(TAG, "裁剪宽高: " + media.getCropImageWidth() + "x" + media.getCropImageHeight());
            Log.i(TAG, "文件大小: " + PictureFileUtils.formatAccurateUnitFileSize(media.getSize()));
            Log.i(TAG, "文件时长: " + media.getDuration());
            Log.i(TAG, "扩展名: " + media.getMimeType());
            FileUploadUtils.creatAndUploadFile(this, media, uplodFileStates, mAdapter);
        }
        // 获取 result 中没有而 uplodFileStates 中有的地址
        FileUploadUtils.cancelRemovedUploads(result, uplodFileStates);
        // 更新UI
        FileUploadUtils.updateUI(result, mAdapter);
    }
    /**
     * 上报处理结果
     */
    private void postData() {
        AddProcessingRequest result = new AddProcessingRequest();
        result.setImages(uplodFileStates);
        result.setContent(binding.contentET.getText().toString());
        result.setInspectorId(MyApplication.myApplication.userId);
        result.setWorkOrderId(workOrderId);
        result.setCompleteTime(com.dayu.pipirrapp.utils.DateUtils.getNowDateToMMStr());
        if (latLonBean != null) {
            result.setLat(String.valueOf(latLonBean.getLatitude()));
            result.setLng(String.valueOf(latLonBean.getLongitude()));
        }
        ApiManager.getInstance().requestPostHideLoading(this, BASE_URL + "/app/workOrder/addProcessingResult", InsectionResult.class, result.toMap(result), new SubscriberListener<BaseResponse<List<InsectionResult>>>() {
            @Override
            public void onNext(BaseResponse<List<InsectionResult>> t) {
                try {
                    if (t.isSuccess()) {
                        ToastUtil.showToastLong(OrderDealActivity.this, "上报成功");
                        setResult(OrderFragment.RESULT_REFRESH);
                        OrderDealActivity.this.finish();
                    } else {
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    CrashReport.postCatchedException(e);
                }
            }
        });
    }
    /**
     * 开始定位相关逻辑
     */
    private void startLocation() {
        ServiceUtils.startLocationService(this, true);
        //获取定位服务传过来的坐标点
        LiveEventBus.get(CommonKeyName.locationData).observeForever(locationObserver);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        LiveEventBus.get(CommonKeyName.locationData).removeObserver(locationObserver);
        FileUploadUtils.cancelAllCall(uplodFileStates);
    }
    /**
     * 预览和图片列表删除图片时处理删除事件
     */
    private void deleteItem(int position) {
        LocalMedia localMedia = mAdapter.getData().get(position);
        String path;
        UplodFileState uplodFileState;
        if (TextUtils.isEmpty(localMedia.getCompressPath())) {
            uplodFileState = uplodFileStates.get(localMedia.getRealPath());
        } else {
            uplodFileState = uplodFileStates.get(localMedia.getCompressPath());
        }
        if (uplodFileState != null) {
            path = uplodFileState.getFilePath();
            try {
                Call<BaseResponse> mCall = uplodFileStates.get(path).getThisCall();
                if (mCall != null) {
                    mCall.cancel();
                    MyLog.d("progressRequestBody>>>" + "cancel》》》path:" + path);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            uplodFileStates.remove(path);
        }
    }
}