管灌系统巡查员智能手机App
1.问题上报相关
2.问题上报列表相关
3.添加图片上传中断功能
4.图片添加的bug
1 文件已重命名
18个文件已修改
9个文件已添加
1个文件已删除
1377 ■■■■ 已修改文件
app/src/main/AndroidManifest.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/activity/AddIssueActivity.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/activity/BaseActivity.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/activity/IssueListActivity.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/activity/OrderDetailActivity.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/adapter/AddPictureAdapter.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/adapter/IssueAdapter.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/adapter/OrderAdapter.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/bean/net/IssueListResult.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/bean/net/IssueResult.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/bean/net/UplodFileState.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/fragment/MyFragment.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/fragment/OrderFragment.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/net/BaseResponse.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/net/MqttManager.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/net/subscribers/ProgressSubscriber.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/service/MyLocationService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/pipirrapp/tool/ImageFileCompressEngine.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/ic_issue.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_add_issue.xml 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_add_question.xml 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_issue_list.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_order_deal.xml 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_my.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_issue.xml 266 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/colors.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml
@@ -104,6 +104,8 @@
        </activity>
        <activity android:name=".activity.OrderDetailActivity" />
        <activity android:name=".activity.OrderDealActivity" />
        <activity android:name=".activity.AddIssueActivity"/>
        <activity android:name=".activity.IssueListActivity"/>
        <!--        <activity android:name=".activity.MainActivity" />-->
app/src/main/java/com/dayu/pipirrapp/activity/AddIssueActivity.java
File was renamed from app/src/main/java/com/dayu/pipirrapp/activity/AddQuestionActivity.java
@@ -4,7 +4,6 @@
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
@@ -26,7 +25,7 @@
import com.dayu.pipirrapp.bean.net.AddIssueRequest;
import com.dayu.pipirrapp.bean.net.InsectionResult;
import com.dayu.pipirrapp.bean.net.UplodFileState;
import com.dayu.pipirrapp.databinding.ActivityAddQuestionBinding;
import com.dayu.pipirrapp.databinding.ActivityAddIssueBinding;
import com.dayu.pipirrapp.fragment.OrderFragment;
import com.dayu.pipirrapp.net.ApiManager;
import com.dayu.pipirrapp.net.BaseResponse;
@@ -35,6 +34,7 @@
import com.dayu.pipirrapp.service.MyLocationService;
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.ToastUtil;
import com.dayu.pipirrapp.view.TitleBar;
@@ -44,28 +44,21 @@
import com.luck.picture.lib.config.PictureMimeType;
import com.luck.picture.lib.config.SelectMimeType;
import com.luck.picture.lib.decoration.GridSpacingItemDecoration;
import com.luck.picture.lib.engine.CompressFileEngine;
import com.luck.picture.lib.engine.ImageEngine;
import com.luck.picture.lib.entity.LocalMedia;
import com.luck.picture.lib.entity.MediaExtraInfo;
import com.luck.picture.lib.interfaces.OnExternalPreviewEventListener;
import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener;
import com.luck.picture.lib.utils.DateUtils;
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.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import top.zibin.luban.CompressionPredicate;
import top.zibin.luban.Luban;
import top.zibin.luban.OnNewCompressListener;
import top.zibin.luban.OnRenameListener;
import retrofit2.Call;
/**
 * AddQuestionActivity -问题上报
@@ -74,10 +67,10 @@
 * @version 1.0
 * @since 2024-12-09
 */
public class AddQuestionActivity extends BaseActivity{
    private String TAG = "AddQuestionActivity";
public class AddIssueActivity extends BaseActivity {
    private final String TAG = "AddQuestionActivity";
    ActivityAddQuestionBinding binding;
    ActivityAddIssueBinding binding;
    RecyclerView mRecyclerView;
    AddPictureAdapter mAdapter;
    int maxSelectNum = 10;//最大照片
@@ -97,17 +90,19 @@
            latLonBean = (LatLonBean) o;
        }
    };
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding=ActivityAddQuestionBinding.inflate(LayoutInflater.from(this));
        binding = ActivityAddIssueBinding.inflate(LayoutInflater.from(this));
        setContentView(binding.getRoot());
        launcherResult = createActivityResultLauncher();
        initView();
        startLocation();
    }
    void initView() {
        new TitleBar(this).setTitleText("处理工单").setLeftIco().setLeftIcoListening(v -> AddQuestionActivity.this.finish());
        new TitleBar(this).setTitleText("上报问题").setLeftIco().setLeftIcoListening(v -> AddIssueActivity.this.finish());
        mRecyclerView = binding.recycler;
        FullyGridLayoutManager manager = new FullyGridLayoutManager(this,
                4, GridLayoutManager.VERTICAL, false);
@@ -126,10 +121,10 @@
            @Override
            public void onItemClick(View v, int position) {
                // 预览图片、视频、音频
                PictureSelector.create(AddQuestionActivity.this)
                PictureSelector.create(AddIssueActivity.this)
                        .openPreview()
                        .setImageEngine(imageEngine)
                        .setExternalPreviewEventListener(new AddQuestionActivity.MyExternalPreviewEventListener())
                        .setExternalPreviewEventListener(new AddIssueActivity.MyExternalPreviewEventListener())
                        .startActivityPreview(position, true, mAdapter.getData());
            }
@@ -137,6 +132,11 @@
            public void openPicture() {
                //添加图片
                mOpenPicture();
            }
            @Override
            public void onDeleteClick(int position) {
                deleteItem(position);
            }
        });
        binding.dealButton.setOnClickListener(v -> {
@@ -152,13 +152,13 @@
                    if (uplodFileStates.size() > 0) {
                        postData();
                    } else {
                        ToastUtil.showToast(AddQuestionActivity.this, "请上传图片");
                        ToastUtil.showToast(AddIssueActivity.this, "请上传图片");
                    }
                } else {
                    ToastUtil.showToast(AddQuestionActivity.this, "图片正在上传请稍后提交");
                    ToastUtil.showToast(AddIssueActivity.this, "图片正在上传请稍后提交");
                }
            } else {
                ToastUtil.showToast(AddQuestionActivity.this, "请输入反馈内容");
                ToastUtil.showToast(AddIssueActivity.this, "请输入反馈内容");
            }
        });
    }
@@ -174,7 +174,7 @@
                .setMaxVideoSelectNum(maxSelectVideoNum)
                .setImageEngine(imageEngine)
                //设置图片压缩
                .setCompressEngine(new AddQuestionActivity.ImageFileCompressEngine())
                .setCompressEngine(new ImageFileCompressEngine())
                .setSelectedData(mAdapter.getData());
        selectionModel.forResult(launcherResult);
@@ -205,6 +205,7 @@
        @Override
        public void onPreviewDelete(int position) {
            deleteItem(position);
            mAdapter.remove(position);
            mAdapter.notifyItemRemoved(position);
        }
@@ -221,10 +222,13 @@
     * @param result
     */
    private void analyticalSelectResults(ArrayList<LocalMedia> result) {
        //获取当前uplodFileStates所有的图片地址
        Set<String> existingPaths = new HashSet<>();
        for (UplodFileState uplodData : uplodFileStates) {
            existingPaths.add(uplodData.getFilePath());
        }
        //获取在PictureSelector的相册时取消选中的图片
        for (LocalMedia media : result) {
            if (media.getWidth() == 0 || media.getHeight() == 0) {
                if (PictureMimeType.isHasImage(media.getMimeType())) {
@@ -254,10 +258,10 @@
            Log.i(TAG, "文件大小: " + PictureFileUtils.formatAccurateUnitFileSize(media.getSize()));
            Log.i(TAG, "文件时长: " + media.getDuration());
            String compressPath = media.getCompressPath();
            //判断是否有这个路径,没有的话上传该图片
            //判断是否有这个路径,没有的话上传该图片并添加uplodFileStates中
            if (!existingPaths.contains(compressPath)) {
                UplodFileState uplodFileState = new UplodFileState();
                uplodFileState.setFilePath(media.getRealPath());
                uplodFileState.setFilePath(compressPath);
                uplodFileStates.add(uplodFileState);
                // 执行上传图片的操作
                uplodeImg(uplodFileState);
@@ -278,52 +282,6 @@
            }
        });
    }
    /**
     * 自定义图片压缩
     */
    private static class ImageFileCompressEngine implements CompressFileEngine {
        @Override
        public void onStartCompress(Context context, ArrayList<Uri> source, OnKeyValueResultCallbackListener call) {
            Luban.with(context).load(source).ignoreBy(100).setRenameListener(new OnRenameListener() {
                @Override
                public String rename(String filePath) {
                    int indexOf = filePath.lastIndexOf(".");
                    String postfix = indexOf != -1 ? filePath.substring(indexOf) : ".jpg";
                    return DateUtils.getCreateFileName("CMP_") + postfix;
                }
            }).filter(new CompressionPredicate() {
                @Override
                public boolean apply(String path) {
                    if (PictureMimeType.isUrlHasImage(path) && !PictureMimeType.isHasHttp(path)) {
                        return true;
                    }
                    return !PictureMimeType.isUrlHasGif(path);
                }
            }).setCompressListener(new OnNewCompressListener() {
                @Override
                public void onStart() {
                }
                @Override
                public void onSuccess(String source, File compressFile) {
                    if (call != null) {
                        call.onCallback(source, compressFile.getAbsolutePath());
                    }
                }
                @Override
                public void onError(String source, Throwable e) {
                    if (call != null) {
                        call.onCallback(source, null);
                    }
                }
            }).launch();
        }
    }
@@ -363,9 +321,9 @@
            public void onNext(BaseResponse<List<InsectionResult>> t) {
                try {
                    if (t.isSuccess()) {
                        ToastUtil.showToastLong(AddQuestionActivity.this, "上报成功");
                        ToastUtil.showToastLong(AddIssueActivity.this, "上报成功");
                        setResult(OrderFragment.RESULT_REFRESH);
                        AddQuestionActivity.this.finish();
                        AddIssueActivity.this.finish();
                    } else {
                    }
@@ -400,5 +358,19 @@
        super.onDestroy();
        LiveEventBus.get(CommonKeyName.locationData).removeObserver(locationObserver);
    }
    /**
     * 预览和图片列表删除图片时处理删除事件
     */
    private void deleteItem(int position) {
        try {
            Call<BaseResponse> mCall = uplodFileStates.get(position).getThisCall();
            if (mCall != null) {
                mCall.cancel();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        uplodFileStates.remove(position);
    }
}
app/src/main/java/com/dayu/pipirrapp/activity/BaseActivity.java
@@ -9,6 +9,7 @@
import androidx.appcompat.app.AppCompatActivity;
import com.dayu.pipirrapp.R;
import com.scwang.smart.refresh.layout.api.RefreshLayout;
/**
 * author: zuo
@@ -17,14 +18,25 @@
 * 备注:
 */
public class BaseActivity extends AppCompatActivity {
    int page = 0;
    int pageSize=10;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(getResources().getColor(R.color.title_color));
        Window window = getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(getResources().getColor(R.color.title_color));
    }
    public void layoutFinish(RefreshLayout refreshLayout, boolean isRefresh) {
        if (refreshLayout != null) {
            if (isRefresh) {
                refreshLayout.finishRefresh();
            } else {
                refreshLayout.finishLoadMore();
            }
        }
    }
}
app/src/main/java/com/dayu/pipirrapp/activity/IssueListActivity.java
New file
@@ -0,0 +1,119 @@
package com.dayu.pipirrapp.activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.dayu.pipirrapp.MyApplication;
import com.dayu.pipirrapp.adapter.IssueAdapter;
import com.dayu.pipirrapp.bean.net.IssueListResult;
import com.dayu.pipirrapp.bean.net.IssueResult;
import com.dayu.pipirrapp.databinding.ActivityIssueListBinding;
import com.dayu.pipirrapp.net.ApiManager;
import com.dayu.pipirrapp.net.BaseResponse;
import com.dayu.pipirrapp.net.Constants;
import com.dayu.pipirrapp.net.subscribers.SubscriberListener;
import com.dayu.pipirrapp.utils.ToastUtil;
import com.dayu.pipirrapp.view.TitleBar;
import com.scwang.smart.refresh.footer.ClassicsFooter;
import com.scwang.smart.refresh.header.ClassicsHeader;
import com.scwang.smart.refresh.layout.api.RefreshLayout;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * IssueListActivity -
 *
 * @author zuoxiao
 * @version 1.0
 * @since 2024-12-10
 */
public class IssueListActivity extends BaseActivity {
    ActivityIssueListBinding binding;
    RefreshLayout myRefreshLayout;
    List<IssueResult> recordsList = new ArrayList<>();
    IssueAdapter mAdapter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityIssueListBinding.inflate(LayoutInflater.from(this));
        setContentView(binding.getRoot());
        initView();
        getData(true);
    }
    private void initView() {
        new TitleBar(this).setTitleText("问题列表").setLeftIco().setLeftIcoListening(v -> IssueListActivity.this.finish());
        myRefreshLayout = (RefreshLayout) binding.refreshLayout;
        myRefreshLayout.setRefreshHeader(new ClassicsHeader(this));
        myRefreshLayout.setRefreshFooter(new ClassicsFooter(this));
        myRefreshLayout.setOnRefreshListener(refreshlayout -> {
//                refreshlayout.finishRefresh(2000/*,false*/);//传入false表示刷新失败
            recordsList.clear();
            page = 0;
            getData(true);
        });
        myRefreshLayout.setOnLoadMoreListener(refreshlayout -> {
            page = page + 1;
            getData(false);
        });
        mAdapter = new IssueAdapter(this, recordsList);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        binding.recyclerView.setLayoutManager(layoutManager);
        binding.recyclerView.setAdapter(mAdapter);
    }
    private void getData(boolean isRefresh) {
        Map<String, Object> params = new HashMap<>();
        if (isRefresh) {
            page = 1;
            recordsList.clear();
        }
        params.put("pageSize", pageSize);
        params.put("pageCurr", page);
        params.put("inspectorId", MyApplication.myApplication.userId);
        ApiManager.getInstance().requestGetHideLoading(this, Constants.BASE_URL + "/app/issue/getIssueReports", IssueListResult.class, params, new SubscriberListener<BaseResponse<IssueListResult>>() {
            @Override
            public void onNext(BaseResponse<IssueListResult> t) {
                if (t.isSuccess()) {
                    if (t.isSuccess()) {
                        if (t.getContent().getObj() != null && t.getContent().getObj().size() > 0) {
                            recordsList.addAll(t.getContent().getObj());
                            if (t.getContent().getPageTotal() == page) {
                                myRefreshLayout.finishLoadMoreWithNoMoreData();
                            }
                        } else {
                            myRefreshLayout.finishLoadMoreWithNoMoreData();
                        }
                    }
                } else {
                    ToastUtil.showToast(IssueListActivity.this, t.getMsg());
                }
            }
            @Override
            public void onCloose() {
                super.onCloose();
                layoutFinish(myRefreshLayout, isRefresh);
                mAdapter.notifyDataSetChanged();
            }
        });
    }
    public void startDetail(String issueReportId) {
    }
}
app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java
@@ -4,7 +4,6 @@
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
@@ -34,6 +33,7 @@
import com.dayu.pipirrapp.service.MyLocationService;
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.ToastUtil;
import com.dayu.pipirrapp.view.TitleBar;
@@ -43,28 +43,21 @@
import com.luck.picture.lib.config.PictureMimeType;
import com.luck.picture.lib.config.SelectMimeType;
import com.luck.picture.lib.decoration.GridSpacingItemDecoration;
import com.luck.picture.lib.engine.CompressFileEngine;
import com.luck.picture.lib.engine.ImageEngine;
import com.luck.picture.lib.entity.LocalMedia;
import com.luck.picture.lib.entity.MediaExtraInfo;
import com.luck.picture.lib.interfaces.OnExternalPreviewEventListener;
import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener;
import com.luck.picture.lib.utils.DateUtils;
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.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import top.zibin.luban.CompressionPredicate;
import top.zibin.luban.Luban;
import top.zibin.luban.OnNewCompressListener;
import top.zibin.luban.OnRenameListener;
import retrofit2.Call;
/**
 * OrderDealDetailActivity -
@@ -142,6 +135,11 @@
                //添加图片
                mOpenPicture();
            }
            @Override
            public void onDeleteClick(int position) {
                deleteItem(position);
            }
        });
        binding.dealButton.setOnClickListener(v -> {
            boolean isAllPost = true;
@@ -209,6 +207,7 @@
        @Override
        public void onPreviewDelete(int position) {
            deleteItem(position);
            mAdapter.remove(position);
            mAdapter.notifyItemRemoved(position);
        }
@@ -261,7 +260,7 @@
            //判断是否有这个路径,没有的话上传该图片
            if (!existingPaths.contains(compressPath)) {
                UplodFileState uplodFileState = new UplodFileState();
                uplodFileState.setFilePath(media.getRealPath());
                uplodFileState.setFilePath(compressPath);
                uplodFileStates.add(uplodFileState);
                // 执行上传图片的操作
                uplodeImg(uplodFileState);
@@ -282,52 +281,6 @@
            }
        });
    }
    /**
     * 自定义图片压缩
     */
    private static class ImageFileCompressEngine implements CompressFileEngine {
        @Override
        public void onStartCompress(Context context, ArrayList<Uri> source, OnKeyValueResultCallbackListener call) {
            Luban.with(context).load(source).ignoreBy(100).setRenameListener(new OnRenameListener() {
                @Override
                public String rename(String filePath) {
                    int indexOf = filePath.lastIndexOf(".");
                    String postfix = indexOf != -1 ? filePath.substring(indexOf) : ".jpg";
                    return DateUtils.getCreateFileName("CMP_") + postfix;
                }
            }).filter(new CompressionPredicate() {
                @Override
                public boolean apply(String path) {
                    if (PictureMimeType.isUrlHasImage(path) && !PictureMimeType.isHasHttp(path)) {
                        return true;
                    }
                    return !PictureMimeType.isUrlHasGif(path);
                }
            }).setCompressListener(new OnNewCompressListener() {
                @Override
                public void onStart() {
                }
                @Override
                public void onSuccess(String source, File compressFile) {
                    if (call != null) {
                        call.onCallback(source, compressFile.getAbsolutePath());
                    }
                }
                @Override
                public void onError(String source, Throwable e) {
                    if (call != null) {
                        call.onCallback(source, null);
                    }
                }
            }).launch();
        }
    }
@@ -405,4 +358,19 @@
        super.onDestroy();
        LiveEventBus.get(CommonKeyName.locationData).removeObserver(locationObserver);
    }
    /**
     * 预览和图片列表删除图片时处理删除事件
     */
    private void deleteItem(int position) {
        try {
            Call<BaseResponse> mCall = uplodFileStates.get(position).getThisCall();
            if (mCall != null) {
                mCall.cancel();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        uplodFileStates.remove(position);
    }
}
app/src/main/java/com/dayu/pipirrapp/activity/OrderDetailActivity.java
@@ -131,26 +131,26 @@
                            ProResultStateId = orderDetailResult.getProResultStateId();
                            switch (ProResultStateId) {
                                case 0://未上报
                                    binding.stateText.setTextColor(OrderDetailActivity.this.getResources().getColor(R.color.black));
                                    binding.stateText.setBackground(OrderDetailActivity.this.getResources().getDrawable(R.drawable.order_state_no_bg));
                                    binding.dealButton.setBackgroundColor(getResources().getColor(R.color.title_color));
                                    binding.stateText.setTextColor(OrderDetailActivity.this.getResources().getColor(R.color.black,null));
                                    binding.stateText.setBackground(OrderDetailActivity.this.getResources().getDrawable(R.drawable.order_state_no_bg,null));
                                    binding.dealButton.setBackgroundColor(getResources().getColor(R.color.title_color,null));
                                    binding.dealButton.setVisibility(View.VISIBLE);
                                    break;
                                case 1://已上报
                                    binding.stateText.setTextColor(OrderDetailActivity.this.getResources().getColor(R.color.white));
                                    binding.stateText.setBackground(OrderDetailActivity.this.getResources().getDrawable(R.drawable.order_state_wait_bg));
                                    binding.dealButton.setBackgroundColor(getResources().getColor(R.color.delete_color));
                                    binding.stateText.setTextColor(OrderDetailActivity.this.getResources().getColor(R.color.white,null));
                                    binding.stateText.setBackground(OrderDetailActivity.this.getResources().getDrawable(R.drawable.order_state_wait_bg,null));
                                    binding.dealButton.setBackgroundColor(getResources().getColor(R.color.delete_color,null));
                                    binding.dealButton.setVisibility(View.VISIBLE);
                                    binding.dealButton.setText("删除处理结果");
                                    break;
                                case 2://已完成
                                    binding.stateText.setTextColor(OrderDetailActivity.this.getResources().getColor(R.color.white));
                                    binding.stateText.setBackground(OrderDetailActivity.this.getResources().getDrawable(R.drawable.order_state_finish_bg));
                                    binding.stateText.setTextColor(OrderDetailActivity.this.getResources().getColor(R.color.white,null));
                                    binding.stateText.setBackground(OrderDetailActivity.this.getResources().getDrawable(R.drawable.order_state_finish_bg,null));
                                    binding.dealButton.setVisibility(View.GONE);
                                    break;
                                case 3://被驳回
                                    binding.stateText.setTextColor(OrderDetailActivity.this.getResources().getColor(R.color.white));
                                    binding.stateText.setBackground(OrderDetailActivity.this.getResources().getDrawable(R.drawable.order_state_reject_bg));
                                    binding.stateText.setTextColor(OrderDetailActivity.this.getResources().getColor(R.color.white,null));
                                    binding.stateText.setBackground(OrderDetailActivity.this.getResources().getDrawable(R.drawable.order_state_reject_bg,null));
                                    binding.dealButton.setBackgroundColor(getResources().getColor(R.color.title_color));
                                    binding.dealButton.setVisibility(View.VISIBLE);
                                    break;
@@ -159,6 +159,12 @@
                        } else {
                            ToastUtil.showToast(OrderDetailActivity.this, t.getMsg());
                        }
                    } else if (t.DATA_NULL.equals(t.getCode())) {
                        //工单已被删除
                        ToastUtil.showToast(OrderDetailActivity.this, "订单已被删除!");
                        setResult(OrderFragment.RESULT_REFRESH);
                        OrderDetailActivity.this.finish();
                    }
                } else {
                    ToastUtil.showToast(OrderDetailActivity.this, t.getMsg());
app/src/main/java/com/dayu/pipirrapp/adapter/AddPictureAdapter.java
@@ -8,6 +8,7 @@
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
@@ -43,7 +44,6 @@
     */
    public void delete(int position) {
        try {
            if (position != RecyclerView.NO_POSITION && list.size() > position) {
                list.remove(position);
                notifyItemRemoved(position);
@@ -112,6 +112,7 @@
    /**
     * 创建ViewHolder
     */
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = mInflater.inflate(R.layout.item_add_filter_image, viewGroup, false);
@@ -127,7 +128,7 @@
     * 设置值
     */
    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
    public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int position) {
        //少于MaxSize张,显示继续添加的图标
        if (getItemViewType(position) == TYPE_CAMERA) {
            viewHolder.mImg.setImageResource(R.mipmap.ic_add_image);
@@ -145,6 +146,7 @@
            viewHolder.mIvDel.setOnClickListener(view -> {
                int index = viewHolder.getAbsoluteAdapterPosition();
                if (index != RecyclerView.NO_POSITION && list.size() > index) {
                    mItemClickListener.onDeleteClick(index);
                    list.remove(index);
                    notifyItemRemoved(index);
                    notifyItemRangeChanged(index, list.size());
@@ -214,6 +216,13 @@
         * Open PictureSelector
         */
        void openPicture();
        /**
         * 删除了某一个
         *
         * @param position
         */
        void onDeleteClick(int position);
    }
    private OnItemLongClickListener mItemLongClickListener;
app/src/main/java/com/dayu/pipirrapp/adapter/IssueAdapter.java
New file
@@ -0,0 +1,132 @@
package com.dayu.pipirrapp.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.RecyclerView;
import com.dayu.pipirrapp.R;
import com.dayu.pipirrapp.activity.IssueListActivity;
import com.dayu.pipirrapp.bean.net.IssueResult;
import com.dayu.pipirrapp.databinding.ItemIssueBinding;
import com.dayu.pipirrapp.databinding.ItemNoMoreBinding;
import java.util.List;
/**
 * IssueAdapter -
 *
 * @author zuoxiao
 * @version 1.0
 * @since 2024-12-10
 */
public class IssueAdapter extends BaseRecyclerAdapter<RecyclerView.ViewHolder> {
    List<IssueResult> recordsList;
    IssueListActivity activity;
    public IssueAdapter(IssueListActivity activity, List<IssueResult> recordsList) {
        this.activity = activity;
        this.recordsList = recordsList;
    }
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType == VIEW_TYPE_EMPTY) {
            ItemNoMoreBinding emptyView = DataBindingUtil.inflate((LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE), R.layout.item_no_more, parent, false);
            return new BaseRecyclerAdapter.ViewHolderEmpty(emptyView);
        } else {
            ItemIssueBinding binding = DataBindingUtil.inflate((LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE), R.layout.item_issue, parent, false);
            return new ViewHolder(binding, activity);
        }
    }
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof ViewHolder) {
            if (recordsList.size() > 0) {
                IssueResult record = recordsList.get(position);
                ((ViewHolder) holder).getBinding().setData(record);
                ViewHolder mHolder=  ((ViewHolder) holder);
                //状态;1-未受理,2-已受理,3已删除
                switch (record.getStateId()) {
                    case 1://未受理
                        mHolder.mBinding.stateText.setTextColor(activity.getResources().getColor(R.color.white, null));
                        mHolder.mBinding.stateText.setBackground(activity.getResources().getDrawable(R.drawable.order_state_wait_bg, null));
                        mHolder.mBinding.replyContentLL.setVisibility(View.GONE);
                        mHolder.mBinding.replyTimeLL.setVisibility(View.GONE);
                        break;
                    case 2://已受理
                        mHolder.mBinding.stateText.setTextColor(activity.getResources().getColor(R.color.white, null));
                        mHolder.mBinding.stateText.setBackground(activity.getResources().getDrawable(R.drawable.order_state_finish_bg, null));
                        mHolder.mBinding.replyContentLL.setVisibility(View.VISIBLE);
                        mHolder.mBinding.replyTimeLL.setVisibility(View.VISIBLE);
                        break;
                    case 3://3已删除
                        mHolder.mBinding.stateText.setTextColor(activity.getResources().getColor(R.color.white, null));
                        mHolder.mBinding.stateText.setBackground(activity.getResources().getDrawable(R.drawable.order_state_reject_bg, null));
                        mHolder.mBinding.replyContentLL.setVisibility(View.VISIBLE);
                        mHolder.mBinding.replyTimeLL.setVisibility(View.VISIBLE);
                        break;
                }
            }
        }
    }
    @Override
    public int getItemCount() {
        //同时这里也需要添加判断,如果mData.size()为0的话,只引入一个布局,就是emptyView
        // 那么,这个recyclerView的itemCount为1
        if (recordsList != null) {
            if (recordsList.size() == 0) {
                return 1;
            }
            return recordsList.size();
        } else {
            return 1;
        }
    }
    @Override
    public int getItemViewType(int position) {
        if (recordsList != null) {
            if (recordsList.size() == 0) {
                return VIEW_TYPE_EMPTY;
            } else {
                return VIEW_TYPE_ITEM;
            }
        } else {
            return VIEW_TYPE_EMPTY;
        }
    }
    static class ViewHolder extends RecyclerView.ViewHolder {
        ItemIssueBinding mBinding;
        public ItemIssueBinding getBinding() {
            return mBinding;
        }
        public void setBinding(ItemIssueBinding binding) {
            this.mBinding = binding;
        }
        public ViewHolder(ItemIssueBinding itemView, IssueListActivity issueListActivity) {
            super(itemView.getRoot());
            this.mBinding = itemView;
            mBinding.setItemclidk(issueListActivity);
        }
    }
}
app/src/main/java/com/dayu/pipirrapp/adapter/OrderAdapter.java
@@ -58,20 +58,20 @@
                ((OrderAdapter.ViewHolder) holder).getBinding().setData(record);
                switch (record.getProResultStateId()) {
                    case 0://未上报
                        ((ViewHolder) holder).mBinding.stateText.setTextColor(context.getResources().getColor(R.color.black));
                        ((ViewHolder) holder).mBinding.stateText.setBackground(context.getResources().getDrawable(R.drawable.order_state_no_bg));
                        ((ViewHolder) holder).mBinding.stateText.setTextColor(context.getResources().getColor(R.color.black,null));
                        ((ViewHolder) holder).mBinding.stateText.setBackground(context.getResources().getDrawable(R.drawable.order_state_no_bg,null));
                        break;
                    case 1://已上报
                        ((ViewHolder) holder).mBinding.stateText.setTextColor(context.getResources().getColor(R.color.white));
                        ((ViewHolder) holder).mBinding.stateText.setBackground(context.getResources().getDrawable(R.drawable.order_state_wait_bg));
                        ((ViewHolder) holder).mBinding.stateText.setTextColor(context.getResources().getColor(R.color.white,null));
                        ((ViewHolder) holder).mBinding.stateText.setBackground(context.getResources().getDrawable(R.drawable.order_state_wait_bg,null));
                        break;
                    case 2://已完成
                        ((ViewHolder) holder).mBinding.stateText.setTextColor(context.getResources().getColor(R.color.white));
                        ((ViewHolder) holder).mBinding.stateText.setBackground(context.getResources().getDrawable(R.drawable.order_state_finish_bg));
                        ((ViewHolder) holder).mBinding.stateText.setTextColor(context.getResources().getColor(R.color.white,null));
                        ((ViewHolder) holder).mBinding.stateText.setBackground(context.getResources().getDrawable(R.drawable.order_state_finish_bg,null));
                        break;
                    case 3://被驳回
                        ((ViewHolder) holder).mBinding.stateText.setTextColor(context.getResources().getColor(R.color.white));
                        ((ViewHolder) holder).mBinding.stateText.setBackground(context.getResources().getDrawable(R.drawable.order_state_reject_bg));
                        ((ViewHolder) holder).mBinding.stateText.setTextColor(context.getResources().getColor(R.color.white,null));
                        ((ViewHolder) holder).mBinding.stateText.setBackground(context.getResources().getDrawable(R.drawable.order_state_reject_bg,null));
                        break;
                }
app/src/main/java/com/dayu/pipirrapp/bean/net/IssueListResult.java
New file
@@ -0,0 +1,58 @@
package com.dayu.pipirrapp.bean.net;
import java.util.List;
/**
 * IssueListResult -
 *
 * @author zuoxiao
 * @version 1.0
 * @since 2024-12-11
 */
public class IssueListResult extends BaseResult {
    int itemTotal;
    int pageCurr;
    int pageSize;
    int pageTotal;
    List<IssueResult> obj;
    public int getItemTotal() {
        return itemTotal;
    }
    public void setItemTotal(int itemTotal) {
        this.itemTotal = itemTotal;
    }
    public int getPageCurr() {
        return pageCurr;
    }
    public void setPageCurr(int pageCurr) {
        this.pageCurr = pageCurr;
    }
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public int getPageTotal() {
        return pageTotal;
    }
    public void setPageTotal(int pageTotal) {
        this.pageTotal = pageTotal;
    }
    public List<IssueResult> getObj() {
        return obj;
    }
    public void setObj(List<IssueResult> obj) {
        this.obj = obj;
    }
}
app/src/main/java/com/dayu/pipirrapp/bean/net/IssueResult.java
New file
@@ -0,0 +1,99 @@
package com.dayu.pipirrapp.bean.net;
import java.util.List;
/**
 * IssueResult -上报问题
 *
 * @author zuoxiao
 * @version 1.0
 * @since 2024-12-10
 */
public class IssueResult extends BaseResult {
    public String issueReportId;// 2024121016522300010,
    public String inspectorName;// 左晓测试,
    public String phone;//
    public String reportTime;// 上报时间
    public String content;//上报内容
    //String                         audios: [],
    //String                         videos: [],
    public List<ImageResult> images;
    public String replyTime;//上报回复时间 null,
    public String replyContent;//回复内容
    public int stateId;//
    public String state;//未受理
    public String getIssueReportId() {
        return issueReportId;
    }
    public void setIssueReportId(String issueReportId) {
        this.issueReportId = issueReportId;
    }
    public String getInspectorName() {
        return inspectorName;
    }
    public void setInspectorName(String inspectorName) {
        this.inspectorName = inspectorName;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getReportTime() {
        return reportTime;
    }
    public void setReportTime(String reportTime) {
        this.reportTime = reportTime;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public List<ImageResult> getImages() {
        return images;
    }
    public void setImages(List<ImageResult> images) {
        this.images = images;
    }
    public String getReplyTime() {
        return replyTime;
    }
    public void setReplyTime(String replyTime) {
        this.replyTime = replyTime;
    }
    public int getStateId() {
        return stateId;
    }
    public void setStateId(int stateId) {
        this.stateId = stateId;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
}
app/src/main/java/com/dayu/pipirrapp/bean/net/UplodFileState.java
@@ -1,5 +1,9 @@
package com.dayu.pipirrapp.bean.net;
import com.dayu.pipirrapp.net.BaseResponse;
import retrofit2.Call;
/**
 * Copyright (C), 2023,
 * Author: zuo
@@ -12,6 +16,15 @@
    int number;//失败后重试的次数
    String id;//上传后的id
    String webPath;//上传后的地址
    Call<BaseResponse> thisCall;//当前请求
    public Call<BaseResponse> getThisCall() {
        return thisCall;
    }
    public void setThisCall(Call<BaseResponse> thisCall) {
        this.thisCall = thisCall;
    }
    public int getNumber() {
        return number;
app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java
@@ -25,6 +25,7 @@
import androidx.lifecycle.Observer;
import com.dayu.pipirrapp.R;
import com.dayu.pipirrapp.activity.AddIssueActivity;
import com.dayu.pipirrapp.bean.db.CenterPointBean;
import com.dayu.pipirrapp.bean.db.InspectionBean;
import com.dayu.pipirrapp.bean.db.InspectionLocationBean;
@@ -80,8 +81,6 @@
    static String TAG = "MapFragment";
    FragmentMapBinding binding;
    //定位相关
    LocationManager locationManager;
    WebView mWebView;
    CenterPointBean centerPointBean;
@@ -372,8 +371,9 @@
            chageInspecState(InspectionUtils.STOP_INSPECTION);
        });
        //上报问题
        binding.putButton.setOnClickListener(v->{
        binding.putButton.setOnClickListener(v -> {
            Intent issue = new Intent(MapFragment.this.getActivity(), AddIssueActivity.class);
            MapFragment.this.getActivity().startActivity(issue);
        });
    }
@@ -453,7 +453,6 @@
            }
        });
    }
    /**
app/src/main/java/com/dayu/pipirrapp/fragment/MyFragment.java
@@ -12,6 +12,7 @@
import androidx.annotation.Nullable;
import com.dayu.pipirrapp.activity.ChangePSActivity;
import com.dayu.pipirrapp.activity.IssueListActivity;
import com.dayu.pipirrapp.activity.LoginActivity;
import com.dayu.pipirrapp.bean.db.LoginBean;
import com.dayu.pipirrapp.dao.DaoSingleton;
@@ -32,7 +33,6 @@
 */
public class MyFragment extends BaseFragment {
    FragmentMyBinding binding;
    ConfirmDialog confirmDialog;
    @Nullable
    @Override
@@ -89,6 +89,11 @@
            confirmDialog.show();
        });
        binding.issueListRL.setOnClickListener(v -> {
            Intent intent = new Intent(MyFragment.this.getContext(), IssueListActivity.class);
            MyFragment.this.getActivity().startActivity(intent);
        });
    }
    private void initData() {
app/src/main/java/com/dayu/pipirrapp/fragment/OrderFragment.java
@@ -235,20 +235,20 @@
    void chooseStateView(boolean state) {
        if (state) {
            binding.manageStateProgress.setTextColor(getResources().getColor(R.color.title_color));
            binding.manageStateProgress.setBackground(getResources().getDrawable(R.drawable.ic_choose_bg_whit));
            binding.manageStateProgress.setTextColor(getResources().getColor(R.color.title_color,null));
            binding.manageStateProgress.setBackground(getResources().getDrawable(R.drawable.ic_choose_bg_whit,null));
            binding.manageStateProgress.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
            binding.manageStateFinish.setTextColor(getResources().getColor(R.color.black));
            binding.manageStateFinish.setBackground(getResources().getDrawable(R.color.title_choose_bg));
            binding.manageStateFinish.setTextColor(getResources().getColor(R.color.black,null));
            binding.manageStateFinish.setBackground(getResources().getDrawable(R.color.title_choose_bg,null));
            binding.manageStateFinish.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
            binding.refreshLayout.setVisibility(View.VISIBLE);
            binding.refreshLayoutDone.setVisibility(View.GONE);
        } else {
            binding.manageStateFinish.setTextColor(getResources().getColor(R.color.title_color));
            binding.manageStateFinish.setBackground(getResources().getDrawable(R.drawable.ic_choose_bg_whit));
            binding.manageStateFinish.setTextColor(getResources().getColor(R.color.title_color,null));
            binding.manageStateFinish.setBackground(getResources().getDrawable(R.drawable.ic_choose_bg_whit,null));
            binding.manageStateFinish.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
            binding.manageStateProgress.setTextColor(getResources().getColor(R.color.black));
            binding.manageStateProgress.setBackground(getResources().getDrawable(R.color.title_choose_bg));
            binding.manageStateProgress.setTextColor(getResources().getColor(R.color.black,null));
            binding.manageStateProgress.setBackground(getResources().getDrawable(R.color.title_choose_bg,null));
            binding.manageStateProgress.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
            binding.refreshLayout.setVisibility(View.GONE);
            binding.refreshLayoutDone.setVisibility(View.VISIBLE);
app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java
@@ -2,6 +2,7 @@
import static com.luck.picture.lib.thread.PictureThreadUtils.runOnUiThread;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
@@ -239,6 +240,7 @@
     *
     * @param urlPath
     */
    @SuppressLint("CheckResult")
    public void donwLoadTile(Context context, String urlPath) {
        if (NetUtils.isNetworkAvailable(context)) {
            Observable<ResponseBody> observable;
@@ -300,7 +302,9 @@
        });
        MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), progressRequestBody);
        RequestBody description = RequestBody.create(MediaType.parse("text/plain"), "file description");
        apiService.uploadFile(body, description).enqueue(new Callback<BaseResponse>() {
        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) {
@@ -332,6 +336,7 @@
                }
            }
        });
    }
    /**
app/src/main/java/com/dayu/pipirrapp/net/BaseResponse.java
@@ -7,6 +7,10 @@
 * Description:返回参数主类
 */
public class BaseResponse<T> {
    //数据已被删除或为空
    public final String DATA_NULL = "1001";
    private String code;
    private String msg;
    private T content;
app/src/main/java/com/dayu/pipirrapp/net/MqttManager.java
@@ -1,7 +1,6 @@
package com.dayu.pipirrapp.net;
import android.content.Context;
import android.net.ConnectivityManager;
import android.util.Log;
import androidx.lifecycle.LifecycleOwner;
@@ -32,8 +31,9 @@
 */
public class MqttManager {
    private static final String MQTT_BROKER_URL = "tcp://115.236.153.170:30764"; // 修改为你的 broker 地址
    private static final String CLIENT_ID = "mqttx_f62ef124";
//    private static final String MQTT_BROKER_URL = "tcp://115.236.153.170:30764"; // 修改为你的 broker 地址
private static final String MQTT_BROKER_URL = "tcp://192.168.10.52:1883";
    private static final String CLIENT_ID = "mqttx_a7a9fe73";
    private static final String TOPIC = "workOrder"; // 订阅的主题
    private MqttClient mqttClient;
app/src/main/java/com/dayu/pipirrapp/net/subscribers/ProgressSubscriber.java
@@ -76,6 +76,9 @@
    }
    /**
     * 不管是error还是成功最后都会调用
     */
    @Override
    public void onCloose() {
        mSubscriberListener.onCloose();
app/src/main/java/com/dayu/pipirrapp/service/MyLocationService.java
@@ -67,7 +67,9 @@
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        MyLog.i("onStartCommand()");
        isSingle = intent.getBooleanExtra("isSingle", false);
        if (intent != null) {
            isSingle = intent.getBooleanExtra("isSingle", false);
        }
        if (!isSingle) {
            // 在API11之后构建Notification的方式
            Notification.Builder builder = new Notification.Builder
@@ -159,7 +161,7 @@
                MyLog.i("原生定位没有权限>>>>");
                return;
            }
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER , 1000, 0, listener);
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, listener);
        } catch (Exception e) {
            CrashReport.postCatchedException(e);
        }
app/src/main/java/com/dayu/pipirrapp/tool/ImageFileCompressEngine.java
New file
@@ -0,0 +1,62 @@
package com.dayu.pipirrapp.tool;
import android.content.Context;
import android.net.Uri;
import com.luck.picture.lib.config.PictureMimeType;
import com.luck.picture.lib.engine.CompressFileEngine;
import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener;
import com.luck.picture.lib.utils.DateUtils;
import java.io.File;
import java.util.ArrayList;
import top.zibin.luban.Luban;
import top.zibin.luban.OnNewCompressListener;
import top.zibin.luban.OnRenameListener;
/**
 * ImageFileCompressEngine -自定义图片压缩
 *
 * @author zuoxiao
 * @version 1.0
 * @since 2024-12-10
 */
public  class ImageFileCompressEngine  implements CompressFileEngine {
    @Override
    public void onStartCompress(Context context, ArrayList<Uri> source, OnKeyValueResultCallbackListener call) {
        Luban.with(context).load(source).ignoreBy(100).setRenameListener(new OnRenameListener() {
            @Override
            public String rename(String filePath) {
                int indexOf = filePath.lastIndexOf(".");
                String postfix = indexOf != -1 ? filePath.substring(indexOf) : ".jpg";
                return DateUtils.getCreateFileName("CMP_") + postfix;
            }
        }).filter(path -> {
            if (PictureMimeType.isUrlHasImage(path) && !PictureMimeType.isHasHttp(path)) {
                return true;
            }
            return !PictureMimeType.isUrlHasGif(path);
        }).setCompressListener(new OnNewCompressListener() {
            @Override
            public void onStart() {
            }
            @Override
            public void onSuccess(String source, File compressFile) {
                if (call != null) {
                    call.onCallback(source, compressFile.getAbsolutePath());
                }
            }
            @Override
            public void onError(String source, Throwable e) {
                if (call != null) {
                    call.onCallback(source, null);
                }
            }
        }).launch();
    }
}
app/src/main/res/drawable/ic_issue.xml
New file
@@ -0,0 +1,25 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="48"
    android:viewportHeight="48">
  <path
      android:pathData="M44,8H4V38H19L24,43L29,38H44V8Z"
      android:strokeLineJoin="round"
      android:strokeWidth="4"
      android:fillColor="#00000000"
      android:strokeColor="#3D8BFF"
      android:strokeLineCap="round"/>
  <path
      android:pathData="M24,23V32"
      android:strokeWidth="4"
      android:fillColor="#00000000"
      android:strokeColor="#3D8BFF"
      android:strokeLineCap="round"/>
  <path
      android:pathData="M24,16V17"
      android:strokeWidth="4"
      android:fillColor="#00000000"
      android:strokeColor="#3D8BFF"
      android:strokeLineCap="round"/>
</vector>
app/src/main/res/layout/activity_add_issue.xml
New file
@@ -0,0 +1,89 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <include
        android:id="@+id/title"
        layout="@layout/top_title" />
    <LinearLayout
        android:id="@+id/center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/deal_button"
        android:layout_below="@+id/title"
        android:orientation="vertical"
        android:padding="20dp">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="* "
                android:textColor="@color/base_red"
                android:textSize="@dimen/order_detail_button_size" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="反馈内容:"
                android:textColor="@color/black"
                android:textSize="@dimen/order_detail_button_size" />
        </LinearLayout>
        <EditText
            android:id="@+id/contentET"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:background="@drawable/edittext_backgroud"
            android:gravity="start"
            android:maxHeight="200dp"
            android:minHeight="100dp"
            android:text="" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:orientation="horizontal">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="* "
                android:textColor="@color/base_red"
                android:textSize="@dimen/order_detail_button_size" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="提交图片:"
                android:textColor="@color/black"
                android:textSize="@dimen/order_detail_button_size" />
        </LinearLayout>
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:background="@color/white"
            android:overScrollMode="never"
            android:padding="5dp" />
    </LinearLayout>
    <TextView
        android:id="@+id/deal_button"
        android:layout_width="match_parent"
        android:layout_height="@dimen/order_detail_button_height"
        android:layout_alignParentBottom="true"
        android:background="@color/title_color"
        android:gravity="center"
        android:text="上报问题"
        android:textColor="@color/white"
        android:textSize="@dimen/order_detail_button_size" />
</RelativeLayout>
app/src/main/res/layout/activity_add_question.xml
File was deleted
app/src/main/res/layout/activity_issue_list.xml
New file
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <include
        android:id="@+id/title"
        layout="@layout/top_title" />
    <com.scwang.smart.refresh.layout.SmartRefreshLayout
        android:id="@+id/refreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/line">
        <com.scwang.smart.refresh.header.ClassicsHeader
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#fff"
            android:overScrollMode="never"
            android:padding="10dp" />
        <com.scwang.smart.refresh.footer.ClassicsFooter
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
</LinearLayout>
app/src/main/res/layout/activity_order_deal.xml
@@ -33,12 +33,25 @@
            android:orientation="vertical"
            android:padding="20dp">
            <TextView
                android:layout_width="wrap_content"
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="反馈内容:"
                android:textColor="@color/black"
                android:textSize="@dimen/order_detail_button_size" />
                android:orientation="horizontal">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="* "
                    android:textColor="@color/base_red"
                    android:textSize="@dimen/order_detail_button_size" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="反馈内容:"
                    android:textColor="@color/black"
                    android:textSize="@dimen/order_detail_button_size" />
            </LinearLayout>
            <EditText
@@ -46,27 +59,42 @@
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:text=""
                android:gravity="start"
                android:background="@drawable/edittext_backgroud"
                android:gravity="start"
                android:maxHeight="200dp"
                android:minHeight="100dp"
                android:maxHeight="200dp"/>
                android:text="" />
            <TextView
                android:layout_width="wrap_content"
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="提交图片:"
                android:layout_marginTop="10dp"
                android:textColor="@color/black"
                android:textSize="@dimen/order_detail_button_size" />
                android:orientation="horizontal">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="* "
                    android:textColor="@color/base_red"
                    android:textSize="@dimen/order_detail_button_size" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="提交图片:"
                    android:textColor="@color/black"
                    android:textSize="@dimen/order_detail_button_size" />
            </LinearLayout>
            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/recycler"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="5dp"
                android:background="@color/white"
                android:layout_marginTop="10dp"
                android:overScrollMode="never" />
                android:background="@color/white"
                android:overScrollMode="never"
                android:padding="5dp" />
        </LinearLayout>
app/src/main/res/layout/fragment_my.xml
@@ -7,16 +7,15 @@
    android:background="@color/bg_color">
    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="@dimen/title_height"
        android:background="@color/title_color"
        android:textSize="@dimen/title_center_text_size"
        android:gravity="center"
        android:text="我的"
        android:textColor="@color/white"
        android:layout_height="@dimen/title_height"/>
        android:textSize="@dimen/title_center_text_size" />
    <View
@@ -71,7 +70,7 @@
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:text="18311594524"
                android:text=""
                android:textColor="@color/grey" />
        </LinearLayout>
@@ -80,7 +79,7 @@
    <RelativeLayout
        android:id="@+id/headRL"
        android:id="@+id/issueListRL"
        android:layout_width="match_parent"
        android:layout_height="@dimen/item_height"
        android:layout_below="@+id/headRL_top">
@@ -88,11 +87,10 @@
        <TextView
            android:layout_width="match_parent"
            android:layout_height="@dimen/item_height"
            android:background="@color/white"
            android:gravity="center_vertical"
            android:paddingLeft="30dp"
            android:text="头像"
            android:text="问题列表"
            android:textColor="@color/black"
            android:textSize="@dimen/my_item_text_size" />
@@ -110,7 +108,7 @@
        android:id="@+id/passwordRL"
        android:layout_width="match_parent"
        android:layout_height="@dimen/item_height"
        android:layout_below="@+id/headRL"
        android:layout_below="@+id/issueListRL"
        android:layout_marginTop="1dp">
        <TextView
@@ -160,6 +158,7 @@
            android:layout_marginRight="15dp"
            android:src="@drawable/ic_right" />
    </RelativeLayout>
    <RelativeLayout
        android:id="@+id/loginOutRL"
        android:layout_width="match_parent"
@@ -187,6 +186,7 @@
            android:layout_marginRight="15dp"
            android:src="@drawable/ic_right" />
    </RelativeLayout>
    <RelativeLayout
        android:id="@+id/versionRL"
        android:layout_width="match_parent"
@@ -205,7 +205,6 @@
            android:textSize="@dimen/my_item_text_size" />
        <TextView
            android:id="@+id/versionText"
            android:layout_width="wrap_content"
@@ -217,7 +216,6 @@
            android:textColor="@color/text_color"
            android:textSize="15sp" />
    </RelativeLayout>
</RelativeLayout>
app/src/main/res/layout/item_issue.xml
New file
@@ -0,0 +1,266 @@
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="itemclidk"
            type="com.dayu.pipirrapp.activity.IssueListActivity" />
        <variable
            name="data"
            type="com.dayu.pipirrapp.bean.net.IssueResult" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:background="@drawable/ic_choose_gray_edge"
        android:onClick="@{()->itemclidk.startDetail(data.issueReportId)}"
        android:orientation="vertical"
        android:padding="10dp">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:minHeight="30dp"
            android:orientation="horizontal">
            <ImageView
                android:id="@+id/ic_project"
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:layout_centerVertical="true"
                android:layout_marginRight="10dp"
                android:src="@drawable/ic_issue" />
            <TextView
                android:id="@+id/projectName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginEnd="15dp"
                android:layout_toStartOf="@+id/stateText"
                android:layout_toEndOf="@+id/ic_project"
                android:ellipsize="end"
                android:maxLines="1"
                android:text="@{data.issueReportId}"
                android:textColor="@color/title_color"
                android:textSize="@dimen/manage_item_text_size" />
            <TextView
                android:id="@+id/stateText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:background="@drawable/ic_edt_gray_bg"
                android:gravity="center"
                android:paddingLeft="10dp"
                android:paddingTop="5dp"
                android:paddingRight="10dp"
                android:paddingBottom="5dp"
                android:text="@{data.state}"
                android:textColor="@color/black"
                android:textSize="@dimen/manage_item_text_state_size" />
        </RelativeLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:orientation="horizontal">
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1">
                <TextView
                    android:id="@+id/daiShenPiTag"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="上报内容:"
                    android:textColor="@color/manage_item_text"
                    android:textSize="@dimen/manage_item_text_size" />
                <TextView
                    android:id="@+id/daiShenPi"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:ellipsize="end"
                    android:maxLines="1"
                    android:text="@{data.content}"
                    android:textColor="@color/manage_item_text"
                    android:textSize="@dimen/manage_item_text_size" />
            </LinearLayout>
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:gravity="center_vertical"
            android:orientation="horizontal">
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:paddingRight="5dp">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="上报时间:"
                    android:textColor="@color/manage_item_text"
                    android:textSize="@dimen/manage_item_text_size" />
                <TextView
                    android:id="@+id/xiangMuJianCheng"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:ellipsize="end"
                    android:maxLines="1"
                    android:text="@{data.reportTime}"
                    android:textColor="@color/manage_item_text"
                    android:textSize="@dimen/manage_item_text_size" />
            </LinearLayout>
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:gravity="center_vertical"
            android:orientation="horizontal">
            <LinearLayout
                android:id="@+id/replyContentLL"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:paddingRight="5dp">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:text="回复内容:"
                    android:textColor="@color/manage_item_text"
                    android:textSize="@dimen/manage_item_text_size" />
                <TextView
                    android:id="@+id/replyContent"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:ellipsize="end"
                    android:maxLines="1"
                    android:text="@{data.replyContent}"
                    android:textColor="@color/manage_item_text"
                    android:textSize="@dimen/manage_item_text_size" />
            </LinearLayout>
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:orientation="horizontal">
            <LinearLayout
                android:id="@+id/replyTimeLL"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:layout_weight="2"
                android:gravity="center_vertical"
                android:orientation="horizontal">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:gravity="center_vertical"
                    android:text="回复时间:"
                    android:textColor="@color/manage_item_text"
                    android:textSize="@dimen/manage_item_text_size" />
                <TextView
                    android:id="@+id/replyTime"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@{data.replyTime}"
                    android:textColor="@color/manage_item_text"
                    android:textSize="@dimen/manage_item_text_size" />
            </LinearLayout>
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_marginTop="5dp"
                android:layout_marginRight="10dp"
                android:layout_weight="1"
                android:orientation="horizontal"
                android:visibility="gone">
                <TextView
                    android:id="@+id/lookDetail"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/manage_item_btn_height"
                    android:layout_weight="1"
                    android:background="@drawable/ic_blue_background"
                    android:gravity="center"
                    android:text="查看"
                    android:textColor="@color/white"
                    android:textSize="@dimen/manage_item_btn_text_size" />
                <TextView
                    android:id="@+id/examineBtn"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/manage_item_btn_height"
                    android:layout_marginLeft="15dp"
                    android:layout_weight="1"
                    android:background="@drawable/ic_blue_background"
                    android:gravity="center"
                    android:text="审批"
                    android:textColor="@color/white"
                    android:textSize="@dimen/manage_item_btn_text_size" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
</layout>
app/src/main/res/values/colors.xml
@@ -3,6 +3,7 @@
    <color name="black">#FF000000</color>
    <color name="white">#FFFFFFFF</color>
    <color name="base_blue">#3D8BFF</color>
    <color name="base_red">#FF6666</color>
    <color name="down_blue">#3a68fc</color>
    <color name="down_green_up">#00cc00</color>
    <color name="down_green_down">#006600</color>
@@ -23,7 +24,7 @@
    <color name="manage_item_time">#AAAAAA</color>
    <color name="app_color_f6">#f6f6f6</color>
    <color name="app_color_white">#FFFFFF</color>
    <color name="inspect_text_color_close">#ff0000</color>
    <color name="inspect_text_color_close">#FF6666</color>
    <color name="inspect_text_color_pause">#7fff00</color>
    <color name="inspect_rl_bg_color">#ff6347</color>
    <color name="delete_color">#ff0000</color>