管灌系统巡查员智能手机App
app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java
@@ -1,7 +1,12 @@
package com.dayu.pipirrapp.fragment;
import static com.dayu.pipirrapp.net.Constants.BASE_URL;
import static com.dayu.pipirrapp.tool.InspectionUtils.addInspectionLocationData;
import static com.dayu.pipirrapp.tool.InspectionUtils.updateInspectionLocationData;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
@@ -18,10 +23,18 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import com.dayu.pipirrapp.MyApplication;
import com.dayu.pipirrapp.R;
import com.dayu.pipirrapp.bean.db.CenterPointBean;
import com.dayu.pipirrapp.bean.db.InspectionBean;
import com.dayu.pipirrapp.bean.db.InspectionLocationBean;
import com.dayu.pipirrapp.bean.db.LatLonBean;
import com.dayu.pipirrapp.bean.db.MarkerBean;
import com.dayu.pipirrapp.bean.net.CenterPointResult;
import com.dayu.pipirrapp.bean.net.InspectionRequest;
import com.dayu.pipirrapp.bean.net.LoginResult;
import com.dayu.pipirrapp.bean.net.MarkerResult;
import com.dayu.pipirrapp.dao.DaoSingleton;
import com.dayu.pipirrapp.databinding.FragmentMapBinding;
@@ -32,11 +45,18 @@
import com.dayu.pipirrapp.net.subscribers.SubscriberListener;
import com.dayu.pipirrapp.observer.MapFragmenObserver;
import com.dayu.pipirrapp.service.MyLocationService;
import com.dayu.pipirrapp.tool.InspectionUtils;
import com.dayu.pipirrapp.utils.CommonData;
import com.dayu.pipirrapp.utils.CommonKeyName;
import com.dayu.pipirrapp.utils.DateUtils;
import com.dayu.pipirrapp.utils.MapJpgUtils;
import com.dayu.pipirrapp.utils.MyLog;
import com.dayu.pipirrapp.utils.SharedPreferencesHelper;
import com.dayu.pipirrapp.utils.ToastUtil;
import com.dayu.pipirrapp.utils.WebViewUtils;
import com.dayu.pipirrapp.view.ConfirmDialog;
import com.jeremyliao.liveeventbus.LiveEventBus;
import com.tencent.bugly.crashreport.CrashReport;
import java.io.File;
import java.io.FileInputStream;
@@ -64,35 +84,42 @@
    WebView mWebView;
    CenterPointBean centerPointBean;
    String strMarkerJson;
    boolean isStartInspec = false;
    //当前巡检状态
    int mInspectionState;
    MapFragmenObserver mapFragmenObserver;
    //当前巡检记录的相关信息
    InspectionBean mInspectionBean;
    LatLonBean lastLatLonBean;
    InspectionRequest inspectionRequest;
    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        requireActivity().getLifecycle().addObserver(new MapFragmenObserver());
        Log.i(TAG, "onAttach");
        mapFragmenObserver = new MapFragmenObserver();
        requireActivity().getLifecycle().addObserver(mapFragmenObserver);
    }
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "onCreate");
        mInspectionState = SharedPreferencesHelper.getInstance(this.getContext()).get(CommonKeyName.inspectionState, 0);
    }
    @Override
    public void onStart() {
        super.onStart();
        //显示巡检状态
        if (isStartInspec) {
            binding.stateText.setVisibility(View.VISIBLE);
        } else {
            binding.stateText.setVisibility(View.GONE);
        }
        Log.i(TAG, "onStart");
    }
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        binding = FragmentMapBinding.inflate(inflater, container, false);
        mapFragmenObserver.setmWebView(binding.webView);
        Log.i("MapFragment", "onCreateView");
        mWebView = binding.webView;
        mWebView = WebViewUtils.initWebView(mWebView);
@@ -103,17 +130,19 @@
        initView();
        initLocalData();
        getMarkerData();
        //开启定位
        Intent location = new Intent(this.getActivity(), MyLocationService.class);
        location.putExtra("isSingle", false);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            this.getActivity().startForegroundService(location);
        } else {
            this.getActivity().startService(location);
        }
        //显示巡检状态
        chageInspecState(mInspectionState);
        return binding.getRoot();
    }
    /**
     * 初始化各个状态
     */
    private void initState() {
        //开启定位
    }
    /**
     * 初始化本地数据
@@ -121,7 +150,7 @@
    public void initLocalData() {
        centerPointBean = DaoSingleton.getInstance(MapFragment.this.getContext()).centerPointDao().findFirst();
        List<MarkerBean> markerBeans = DaoSingleton.getInstance(MapFragment.this.getContext()).markerDao().findAll();
        strMarkerJson = beanToJson(markerBeans);
        strMarkerJson = WebViewUtils.beanToJson(markerBeans);
        jumpCenterPoint();
        setMapMarker();
    }
@@ -133,7 +162,7 @@
    public void jumpCenterPoint() {
        if (centerPointBean != null) {
            Log.d(TAG, "jumpCenterPoint>>>>>>>>>>>>>>>>>>>" + centerPointBean.getLng() + "\",\"" + centerPointBean.getLat());
            mWebView.evaluateJavascript("javascript:setCenterAndZoom(\"" + centerPointBean.getLng() + "\",\"" + centerPointBean.getLat() + "\")", value -> {
            mWebView.evaluateJavascript("javascript:setCenterAndZoom(\"" + centerPointBean.getLng() + "\",\"" + centerPointBean.getLat() + "\",\"" + centerPointBean.getZoomMp() + "\")", value -> {
            });
        }
    }
@@ -156,7 +185,7 @@
     * 获取取水口列表
     */
    private void getMarkerData() {
        ApiManager.getInstance().requestGetHideLoading(this.getContext(), Constants.BASE_URL + ":8085/project/intake/all", MarkerResult.class, null, new SubscriberListener<BaseResponse<MarkerResult>>() {
        ApiManager.getInstance().requestGetHideLoading(this.getContext(), Constants.BASE_URL + "/project/intake/all", MarkerResult.class, null, new SubscriberListener<BaseResponse<MarkerResult>>() {
            @Override
            public void onNext(BaseResponse<MarkerResult> t) {
                if (t.isSuccess()) {
@@ -177,7 +206,7 @@
                                markerBean.setCountyId(result.getCountyId());
                                markerBeans.add(markerBean);
                            }
                            strMarkerJson = beanToJson(markerBeans);
                            strMarkerJson = WebViewUtils.beanToJson(markerBeans);
                            setMapMarker();
                            DaoSingleton.getInstance(MapFragment.this.getContext()).markerDao().deleteAll();
                            // 使用 RxJava 异步插入数据
@@ -199,29 +228,6 @@
            }
        });
    }
    /**
     * bean转json
     *
     * @param markerBeans
     */
    private String beanToJson(List<MarkerBean> markerBeans) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("[");
        for (int i = 0; i < markerBeans.size(); i++) {
            MarkerBean markerBean = markerBeans.get(i);
            stringBuilder.append("[");
            stringBuilder.append(markerBean.getLng());
            stringBuilder.append(",");
            stringBuilder.append(markerBean.getLat());
            stringBuilder.append(",\"" + markerBean.getName() + "\"]");
            if (i != markerBeans.size() - 1) {
                stringBuilder.append(",");
            }
        }
        stringBuilder.append("]");
        return stringBuilder.toString().replace("\\", "\\\\").replace("\"", "\\\"");
    }
@@ -261,40 +267,14 @@
        });
    }
    @Override
    public void onResume() {
        super.onResume();
        mWebView.onResume(); // 恢复 WebView,能正常执行网页的响应
    }
    @Override
    public void onPause() {
        super.onPause();
        //
        mWebView.onPause(); // 通过 onPause 动作通知内核暂停所有的动作,如 DOM 的解析、plugin 的执行、JavaScript 执行等
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        ((ViewGroup) mWebView.getParent()).removeView(mWebView);
        mWebView.destroy(); // 当 Activity 要 destroy 时,应先将 WebView 移除,再 destroy 掉
    }
    void initView() {
        //跳转到指定位置
        binding.flyBtn.setOnClickListener(v -> {
            mWebView.evaluateJavascript("javascript:locationOverLay(116.399565,39.89432)", value -> {
            });
        });
        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                String url = request.getUrl().toString();
                Log.i(TAG, "加载地址>>>" + url);
                //判断当前是否为加载瓦片
                if (MapJpgUtils.getInsatance().isTianDiTuTileRequest(url)) {
                    String androidUrl = url.replace(CommonData.webKey, CommonData.androidKey);
@@ -318,6 +298,8 @@
                    }
                    Log.i(TAG, "在线加载>>>" + url);
                }
                return super.shouldInterceptRequest(view, request);
            }
@@ -343,16 +325,21 @@
                // 根据HTTP状态码处理错误
            }
        });
        //巡检按钮
        binding.inspectButton.setOnClickListener(v -> {
            if (!isStartInspec) {
                isStartInspec = true;
                binding.inspectButton.setText("终");
            chageInspecState(InspectionUtils.STAT_INSPECTION);
        });
        //暂停巡检
        binding.inspectPause.setOnClickListener(v -> {
            if (mInspectionState == InspectionUtils.STAT_INSPECTION) {
                chageInspecState(InspectionUtils.PAUSE_INSPECTION);
            } else {
                isStartInspec = false;
                chageInspecState(InspectionUtils.STAT_INSPECTION);
            }
            binding.stateText.setVisibility(View.VISIBLE);
        });
        //停止巡检
        binding.inspectClose.setOnClickListener(v -> {
            chageInspecState(InspectionUtils.STOP_INSPECTION);
        });
    }
@@ -368,7 +355,7 @@
     */
    private void getCenterPoint() {
        ApiManager.getInstance().requestGet(this.getContext(), Constants.BASE_URL + ":8080/base/dict_item/map_center", CenterPointResult.class, null, new SubscriberListener<BaseResponse<CenterPointResult>>() {
        ApiManager.getInstance().requestGet(this.getContext(), Constants.BASE_URL + "/base/dict_item/map_center", CenterPointResult.class, null, new SubscriberListener<BaseResponse<CenterPointResult>>() {
            @Override
            public void onNext(BaseResponse<CenterPointResult> t) {
                if (t.isSuccess()) {
@@ -377,6 +364,7 @@
                    }
                    centerPointBean.setLat(t.getContent().getLat());
                    centerPointBean.setLng(t.getContent().getLng());
                    centerPointBean.setZoomMp(t.getContent().getZoomMp());
                    DaoSingleton.getInstance(MapFragment.this.getContext()).centerPointDao().insert(centerPointBean);
                    jumpCenterPoint();
                } else {
@@ -391,4 +379,162 @@
        binding.bottomLL.setVisibility(View.GONE);
    }
    /**
     * 上报巡检记录
     */
    private void pushLocationData(InspectionLocationBean inspectionLocationBean) {
        inspectionRequest.setInspectId(inspectionLocationBean.getInspectId());
        inspectionRequest.setInspectorId(inspectionLocationBean.getInspectorId());
        if (mInspectionBean != null) {
            inspectionRequest.setStartTime(mInspectionBean.getStartTime());
            inspectionRequest.setStopTime(mInspectionBean.getStopTime());
        }
        InspectionRequest.Track track = new InspectionRequest.Track();
        track.setLat(inspectionLocationBean.getLat());
        track.setLng(inspectionLocationBean.getLng());
        track.setLocateTime(inspectionLocationBean.getLocateTime());
        inspectionRequest.getTracks().clear();
        inspectionRequest.addTracks(track);
        ApiManager.getInstance().requestPostHideLoading(MapFragment.this.getContext(), BASE_URL + "/app/inspect/save", LoginResult.class, inspectionRequest.toMap(inspectionRequest), new SubscriberListener<BaseResponse<LoginResult>>() {
            @Override
            public void onNext(BaseResponse<LoginResult> t) {
                try {
                    if (t.isSuccess()) {
                        inspectionLocationBean.setPost(true);
                        updateInspectionLocationData(MapFragment.this.getContext(), inspectionLocationBean);
                    } else {
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    CrashReport.postCatchedException(e);
                }
            }
        });
    }
    /**
     * 开始巡检
     */
    private void startInspection() {
        DaoSingleton.getAsynchInstance(this.getContext()).inspectionDao().getMostRecentInspectionWithNoStopTime()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread()).subscribe(inspectionBean -> {
                    // 更新 UI
                    mInspectionBean = inspectionBean;
                });
    }
    /**
     * 定位监听
     */
    private Observer<Object> locationObserver = new Observer<Object>() {
        @Override
        public void onChanged(Object o) {
            if (mInspectionBean != null) {
                LatLonBean latLonBean = (LatLonBean) o;
                if (InspectionUtils.isThanMinMeters(lastLatLonBean, latLonBean)) {
                    //大于最小距离
                    lastLatLonBean = latLonBean;
                    Log.i("chageInspecState", "lat:" + latLonBean.getLatitude() + ",log:" + latLonBean.getLongitude());
                    InspectionLocationBean inspectionLocationBean = createInspectionLocation(latLonBean);
                    addInspectionLocationData(MapFragment.this.getContext(), inspectionLocationBean);
                    //更新到地图
                    mWebView.evaluateJavascript("javascript:updateLocation(\"" + latLonBean.getLongitude() + "\",\"" + latLonBean.getLatitude() + "\")", value -> {
                    });
                    //上传坐标
                    pushLocationData(inspectionLocationBean);
                } else {
                    Log.d(TAG, "isThanMinMeters>>>false");
                }
            }
        }
    };
    /**
     * 创建InspectionLocationBean
     */
    private InspectionLocationBean createInspectionLocation(LatLonBean latLonBean) {
        InspectionLocationBean inspectionLocationBean = new InspectionLocationBean();
        inspectionLocationBean.setInspectId(mInspectionBean.getInspectId());
        inspectionLocationBean.setLocateTime(DateUtils.getNowDateStr());
        inspectionLocationBean.setPost(false);
        inspectionLocationBean.setInspectorId(MyApplication.myApplication.userId);
        inspectionLocationBean.setLng(String.valueOf(latLonBean.getLongitude()));
        inspectionLocationBean.setLat(String.valueOf(latLonBean.getLatitude()));
        return inspectionLocationBean;
    }
    /**
     * 修改巡检状态
     */
    private void chageInspecState(int inspectionState) {
        Intent location = new Intent(this.getActivity(), MyLocationService.class);
        location.putExtra("isSingle", false);
        //0没有开始,1开始,2暂停,3关闭
        switch (inspectionState) {
            case 0:
                binding.inspectButton.setVisibility(View.VISIBLE);
                binding.inspectRL.setVisibility(View.GONE);
                binding.inspectButton.setText("巡");
                LiveEventBus.get(CommonKeyName.locationData).removeObserver(locationObserver);
                //关闭定位
                this.getActivity().stopService(location);
                break;
            case InspectionUtils.STAT_INSPECTION://1开始
                //添加新的巡检记录
                startInspection();
                //获取定位服务传过来的坐标点
                LiveEventBus.get(CommonKeyName.locationData).observeForever(locationObserver);
                binding.inspectRL.setVisibility(View.VISIBLE);
                binding.inspectButton.setVisibility(View.GONE);
                binding.inspectPause.setText("暂停");
                binding.stateText.setText("已开启巡检");
                binding.inspectRL.setBackgroundColor(this.getContext().getResources().getColor(R.color.base_blue));
                //开启定位
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    this.getActivity().startForegroundService(location);
                } else {
                    this.getActivity().startService(location);
                }
                mInspectionBean = InspectionUtils.startInspection(this.getContext());
                inspectionRequest = new InspectionRequest();
                SharedPreferencesHelper.getInstance(this.getContext()).put(CommonKeyName.inspectionState, InspectionUtils.STAT_INSPECTION);
                break;
            case 2://暂停
                try {
                    LiveEventBus.get(CommonKeyName.locationData).removeObserver(locationObserver);
                    //关闭定位
                    this.getActivity().stopService(location);
                    binding.stateText.setText("已暂停巡检");
                    binding.inspectPause.setText("继续");
                    binding.inspectRL.setBackgroundColor(this.getContext().getResources().getColor(R.color.inspect_rl_bg_color));
                    SharedPreferencesHelper.getInstance(this.getContext()).put(CommonKeyName.inspectionState, InspectionUtils.PAUSE_INSPECTION);
                } catch (Resources.NotFoundException e) {
                    e.printStackTrace();
                }
                break;
            case 3:
                ConfirmDialog confirmDialog = new ConfirmDialog(MapFragment.this.getActivity(), "提示", "确认关闭巡检吗?", new ConfirmDialog.ConfirmOnClickListener() {
                    @Override
                    public void onClick(ConfirmDialog confirmDialog, View v) {
                        confirmDialog.dismiss();
                        chageInspecState(InspectionUtils.NO_INSPECTION);
                        SharedPreferencesHelper.getInstance(MapFragment.this.getContext()).put(CommonKeyName.inspectionState, InspectionUtils.NO_INSPECTION);
                    }
                });
                confirmDialog.show();
                break;
            default:
        }
        mInspectionState = inspectionState;
    }
}