管灌系统巡查员智能手机App
app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java
@@ -5,9 +5,11 @@
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -20,6 +22,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.Observer;
import com.dayu.pipirrapp.MyApplication;
@@ -62,6 +65,7 @@
import com.dayu.pipirrapp.utils.WebViewUtils;
import com.dayu.pipirrapp.view.ConfirmDialog;
import com.dayu.pipirrapp.view.TipUtil;
import com.example.expand_button.ExpandButton;
import com.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
@@ -80,6 +84,7 @@
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import kotlin.Triple;
/**
 * author: zuo
@@ -178,69 +183,69 @@
    private void loadLocalData() {
        // 异步加载中心点数据
        compositeDisposable.add(
            DaoSingleton.getAsynchInstance(this.getContext()).centerPointDao().findFirst()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(result -> {
                    centerPointBean = result;
                    if (centerPointBean == null) {
                        getCenterPoint();
                    } else {
                        jumpCenterPoint();
                    }
                }, throwable -> {
                    Log.e(TAG, "Load centerPoint error: " + throwable);
                    getCenterPoint();
                }, () -> {
                    // 当Maybe为空时调用
                    getCenterPoint();
                })
                DaoSingleton.getAsynchInstance(this.getContext()).centerPointDao().findFirst()
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(result -> {
                            centerPointBean = result;
                            if (centerPointBean == null) {
                                getCenterPoint();
                            } else {
                                jumpCenterPoint();
                            }
                        }, throwable -> {
                            Log.e(TAG, "Load centerPoint error: " + throwable);
                            getCenterPoint();
                        }, () -> {
                            // 当Maybe为空时调用
                            getCenterPoint();
                        })
        );
        // 异步加载取水口数据
        compositeDisposable.add(
            DaoSingleton.getAsynchInstance(this.getContext()).markerDao().getAll()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(markers -> {
                    if (markers == null || markers.isEmpty()) {
                        getMarkerData();
                    } else {
                        for (MarkerBean marker : markers) {
                            markerBeanSet.put(marker.getId(), marker);
                            setMapMarker(marker);
                        }
                    }
                }, throwable -> {
                    Log.e(TAG, "Load markers error: " + throwable.getMessage());
                    getMarkerData();
                }, () -> {
                    // 当Maybe为空时调用
                    getMarkerData();
                })
                DaoSingleton.getAsynchInstance(this.getContext()).markerDao().getAll()
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(markers -> {
                            if (markers == null || markers.isEmpty()) {
                                getMarkerData();
                            } else {
                                for (MarkerBean marker : markers) {
                                    markerBeanSet.put(marker.getId(), marker);
                                    setMapMarker(marker);
                                }
                            }
                        }, throwable -> {
                            Log.e(TAG, "Load markers error: " + throwable.getMessage());
                            getMarkerData();
                        }, () -> {
                            // 当Maybe为空时调用
                            getMarkerData();
                        })
        );
        // 异步加载分水房数据
        compositeDisposable.add(
            DaoSingleton.getAsynchInstance(this.getContext()).divideDao().getAll()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(divides -> {
                    if (divides == null || divides.isEmpty()) {
                        getDivideList();
                    } else {
                        for (DivideBean divide : divides) {
                            divideBeanMap.put(divide.getId(), divide);
                            setMapDivide(divide);
                        }
                    }
                }, throwable -> {
                    Log.e(TAG, "Load divides error: " + throwable.getMessage());
                    getDivideList();
                }, () -> {
                    // 当Maybe为空时调用
                    getDivideList();
                })
                DaoSingleton.getAsynchInstance(this.getContext()).divideDao().getAll()
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(divides -> {
                            if (divides == null || divides.isEmpty()) {
                                getDivideList();
                            } else {
                                for (DivideBean divide : divides) {
                                    divideBeanMap.put(divide.getId(), divide);
                                    setMapDivide(divide);
                                }
                            }
                        }, throwable -> {
                            Log.e(TAG, "Load divides error: " + throwable.getMessage());
                            getDivideList();
                        }, () -> {
                            // 当Maybe为空时调用
                            getDivideList();
                        })
        );
    }
@@ -370,19 +375,19 @@
                        // 使用 CompositeDisposable 管理数据库插入操作
                        compositeDisposable.add(
                            DaoSingleton.getAsynchInstance(MapFragment.this.getContext()).markerDao().insertAll(markerBeans)
                                .subscribeOn(Schedulers.io())
                                .observeOn(AndroidSchedulers.mainThread())
                                .subscribe(
                                    () -> {
                                        // 插入成功
                                        Log.i("mWebView", "数据插入成功");
                                    },
                                    throwable -> {
                                        // 插入失败
                                        Log.e("mWebView", "数据插入失败: " + throwable.getMessage());
                                    }
                                )
                                DaoSingleton.getAsynchInstance(MapFragment.this.getContext()).markerDao().insertAll(markerBeans)
                                        .subscribeOn(Schedulers.io())
                                        .observeOn(AndroidSchedulers.mainThread())
                                        .subscribe(
                                                () -> {
                                                    // 插入成功
                                                    Log.i("mWebView", "数据插入成功");
                                                },
                                                throwable -> {
                                                    // 插入失败
                                                    Log.e("mWebView", "数据插入失败: " + throwable.getMessage());
                                                }
                                        )
                        );
                    }
@@ -432,8 +437,27 @@
            Intent issue = new Intent(MapFragment.this.getActivity(), AddIssueActivity.class);
            MapFragment.this.getActivity().startActivity(issue);
        });
        binding.expandButton.setLegendsArray(new Triple<>(
                        ContextCompat.getDrawable(requireContext(), R.drawable.marker_blue),
                        ContextCompat.getDrawable(requireContext(), R.drawable.marker_unselected),
                        "取水口"
                ),
                new Triple<>(
                        ContextCompat.getDrawable(requireContext(), R.drawable.divide_home_blue),
                        ContextCompat.getDrawable(requireContext(), R.drawable.divide_home_unselected),
                        "分水房"
                ));
        binding.expandButton.setOnLegendItemClickListener((position, isSelected) -> {
            switch (position) {
                case 0:
                    showMarkers(isSelected);
                    break;
                case 1:
                    showDivideMarkers(isSelected);
                    break;
            }
        });
    }
    /**
@@ -1010,22 +1034,22 @@
                                setMapDivide(divideBean);
                                divideBeans.add(divideBean);
                            }
                            // 使用 CompositeDisposable 管理数据库插入操作
                            compositeDisposable.add(
                                DaoSingleton.getAsynchInstance(MapFragment.this.getContext()).divideDao().insertAll(divideBeans)
                                    .subscribeOn(Schedulers.io())
                                    .observeOn(AndroidSchedulers.mainThread())
                                    .subscribe(
                                        () -> {
                                            // 插入成功
                                            Log.i("mWebView", "数据插入成功");
                                        },
                                        throwable -> {
                                            // 插入失败
                                            Log.e("mWebView", "数据插入失败: " + throwable.getMessage());
                                        }
                                    )
                                    DaoSingleton.getAsynchInstance(MapFragment.this.getContext()).divideDao().insertAll(divideBeans)
                                            .subscribeOn(Schedulers.io())
                                            .observeOn(AndroidSchedulers.mainThread())
                                            .subscribe(
                                                    () -> {
                                                        // 插入成功
                                                        Log.i("mWebView", "数据插入成功");
                                                    },
                                                    throwable -> {
                                                        // 插入失败
                                                        Log.e("mWebView", "数据插入失败: " + throwable.getMessage());
                                                    }
                                            )
                            );
                        }
                    } else {
@@ -1157,4 +1181,36 @@
            mWebView.restoreState(savedInstanceState);
        }
    }
    /**
     * 显示或隐藏地图上的取水口
     *
     * @param isShow
     */
    private void showMarkers(boolean isShow) {
        if (isShow) {
            mWebView.evaluateJavascript("javascript:showAllWaterIntakes()", value -> {
            });
        } else {
            mWebView.evaluateJavascript("javascript:hideAllWaterIntakes()", value -> {
            });
        }
    }
    /**
     * 显示或隐藏地图上的分水房
     *
     * @param isShow
     */
    private void showDivideMarkers(boolean isShow) {
        if (isShow) {
            mWebView.evaluateJavascript("javascript:showAllDivides()", value -> {
            });
        } else {
            mWebView.evaluateJavascript("javascript:hideAllDivides()", value -> {
            });
        }
    }
}