From 4f7f99c6ea914bcd38de78bd8371be566026b905 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期三, 26 二月 2025 15:54:14 +0800
Subject: [PATCH] -为按钮和列表项添加波纹效果,以获得更好的视觉反馈 -改进MapFragment中的底部布局动画 -在MapFragment中添加设备状态和RTU地址显示 -更新BaseListResult以支持泛型类型 -为设备数据添加IntakeListResult和IntakeResult -通过数据库支持增强标记位置更新功能 -添加电话拨号意图以分隔标记详细信息 -通过过期检查改进磁贴缓存 -添加问题报告的确认对话框 -更新登录活动以限制用户名长度 -为波纹效果和UI元素添加新颜色 -重构XML布局以使用新的波纹图 -改进MapFragment中的错误处理和用户反馈

---
 app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java |  258 ++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 210 insertions(+), 48 deletions(-)

diff --git a/app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java b/app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java
index 82ab38e..5591ce1 100644
--- a/app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java
+++ b/app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java
@@ -5,6 +5,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Resources;
+import android.net.Uri;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.util.Log;
@@ -35,11 +36,14 @@
 import com.dayu.pipirrapp.bean.db.PipeNetWorkDataBean;
 import com.dayu.pipirrapp.bean.db.PipeNetworkBean;
 import com.dayu.pipirrapp.bean.db.PipeNetworkDataCoordinateBean;
+import com.dayu.pipirrapp.bean.net.BaseListResult;
 import com.dayu.pipirrapp.bean.net.CenterPointResult;
 import com.dayu.pipirrapp.bean.net.DivideListResult;
 import com.dayu.pipirrapp.bean.net.DivideResult;
 import com.dayu.pipirrapp.bean.net.InsectionResult;
 import com.dayu.pipirrapp.bean.net.InspectionRequest;
+import com.dayu.pipirrapp.bean.net.IntakeListResult;
+import com.dayu.pipirrapp.bean.net.IntakeResult;
 import com.dayu.pipirrapp.bean.net.MarkerListResult;
 import com.dayu.pipirrapp.bean.net.MarkerResult;
 import com.dayu.pipirrapp.bean.net.PipeNetworkResult;
@@ -72,6 +76,7 @@
 import com.jeremyliao.liveeventbus.LiveEventBus;
 import com.tencent.bugly.crashreport.CrashReport;
 
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -84,6 +89,7 @@
 import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
 import io.reactivex.rxjava3.disposables.CompositeDisposable;
 import io.reactivex.rxjava3.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Single;
 
 /**
  * author: zuo
@@ -145,10 +151,55 @@
 
         // 娣诲姞鍒锋柊鏁版嵁鐨勭洃鍚�
         LiveEventBus.get(CommonKeyName.refreshData).observe(this, o -> {
-            getCenterPoint();
-            getMarkerData();
-            getDivideList();
-            getPipeNetworkList();
+            // 鏄剧ず鍔犺浇鍔ㄧ敾
+            TipUtil.showLoading(MapFragment.this.getActivity(), "姝e湪鏇存柊鏁版嵁...");
+
+            // 鍒涘缓澶氫釜Single瀵硅薄鏉ヨ〃绀烘瘡涓綉缁滆姹�
+            Single<Boolean> centerPointSingle = Single.create(emitter -> {
+                getCenterPoint();
+                emitter.onSuccess(true);
+            });
+
+            Single<Boolean> markerDataSingle = Single.create(emitter -> {
+                getMarkerData();
+                emitter.onSuccess(true);
+            });
+
+            Single<Boolean> divideListSingle = Single.create(emitter -> {
+                getDivideList();
+                emitter.onSuccess(true);
+            });
+
+            Single<Boolean> pipeNetworkListSingle = Single.create(emitter -> {
+                getPipeNetworkList();
+                emitter.onSuccess(true);
+            });
+
+            // 缁勫悎鎵�鏈塖ingle
+            compositeDisposable.add(
+                    Single.zip(
+                                    centerPointSingle,
+                                    markerDataSingle,
+                                    divideListSingle,
+                                    pipeNetworkListSingle,
+                                    (centerPoint, marker, divide, pipe) -> true
+                            )
+                            .subscribeOn(Schedulers.io())
+                            .observeOn(AndroidSchedulers.mainThread())
+                            .doFinally(() -> {
+                                // 鏃犺鎴愬姛杩樻槸澶辫触锛岄兘闇�瑕侀殣钘忓姞杞藉姩鐢�
+                                TipUtil.dismissLoading();
+                            })
+                            .subscribe(
+                                    result -> {
+                                        ToastUtil.showToast(MapFragment.this.getContext(), "鏁版嵁鏇存柊瀹屾垚");
+                                    },
+                                    throwable -> {
+                                        Log.e(TAG, "鏁版嵁鏇存柊澶辫触: " + throwable.getMessage());
+                                        ToastUtil.showToast(MapFragment.this.getContext(), "鏁版嵁鏇存柊澶辫触");
+                                    }
+                            )
+            );
         });
     }
 
@@ -289,24 +340,31 @@
                     // 妫�鏌ユ湰鍦扮紦瀛�
                     File cachedTile = MapJpgUtils.getInsatance().getCachedTile(androidUrl);
                     if (cachedTile != null && cachedTile.exists()) {
-//                        Log.d(TAG, "鏈湴缂撳瓨>>>" + androidUrl);
-//                        if (MapJpgUtils.getInsatance().validateImageFile(androidUrl,request.))
-                        // 鍒ゆ柇缂撳瓨鏄惁杩囨湡
-//                    if (!MapJpgUtils.getInsatance(MapFragment.this.getContext()).isCacheExpired(cachedTile)) {
-                        try {
-                            // 浠庣紦瀛樺姞杞界摝鐗�
-                            return new WebResourceResponse("image/jpg", "utf-8", new FileInputStream(cachedTile));
-                        } catch (FileNotFoundException e) {
-                            e.printStackTrace();
+                        // 妫�鏌ユ枃浠舵槸鍚﹁秴杩�6涓湀
+                        long sixMonthsInMillis = 6L * 30 * 24 * 60 * 60 * 1000; // 6涓湀鐨勬绉掓暟
+                        long fileAge = System.currentTimeMillis() - cachedTile.lastModified();
+
+                        if (fileAge > sixMonthsInMillis) {
+                            // 濡傛灉鏂囦欢瓒呰繃6涓湀锛屽垹闄ゆ棫鏂囦欢骞堕噸鏂颁笅杞�
+                            if (cachedTile.delete()) {
+                                Log.d(TAG, "宸插垹闄よ繃鏈熺摝鐗�: " + androidUrl);
+                            } else {
+                                Log.e(TAG, "鍒犻櫎杩囨湡鐡︾墖澶辫触: " + androidUrl);
+                            }
+                            ApiManager.getInstance().donwLoadTile(MapFragment.this.getContext(), androidUrl);
+                        } else {
+                            try {
+                                // 浠庣紦瀛樺姞杞界摝鐗�
+                                return new WebResourceResponse("image/jpg", "utf-8", new FileInputStream(cachedTile));
+                            } catch (FileNotFoundException e) {
+                                e.printStackTrace();
+                            }
                         }
-//                    }
                     } else {
                         //涓嬭浇鐡︾墖
                         ApiManager.getInstance().donwLoadTile(MapFragment.this.getContext(), androidUrl);
                     }
-
                 }
-
 
                 return super.shouldInterceptRequest(view, request);
             }
@@ -440,7 +498,7 @@
         //宸℃鎸夐挳
         binding.inspectButton.setOnClickListener(v -> {
             if (XXPermissions.isGranted(MapFragment.this.getContext(), Permission.ACCESS_BACKGROUND_LOCATION)) {
-                new ConfirmDialog(MapFragment.this.getActivity(), "纭寮�濮嬪贰妫�鍚楋紵",(confirmDialog, v1) -> {
+                new ConfirmDialog(MapFragment.this.getActivity(), "纭寮�濮嬪贰妫�鍚楋紵", (confirmDialog, v1) -> {
                     chageInspecState(InspectionUtils.STAT_INSPECTION_ONCLICK);
                     confirmDialog.dismiss();
                 }).show();
@@ -469,8 +527,13 @@
         });
         //涓婃姤闂
         binding.putButton.setOnClickListener(v -> {
-            Intent issue = new Intent(MapFragment.this.getActivity(), AddIssueActivity.class);
-            MapFragment.this.getActivity().startActivity(issue);
+            new ConfirmDialog(MapFragment.this.getActivity(), "纭涓婃姤闂鍚楋紵", (confirmDialog, v1) -> {
+                Intent issue = new Intent(MapFragment.this.getActivity(), AddIssueActivity.class);
+                MapFragment.this.getActivity().startActivity(issue);
+                confirmDialog.dismiss();
+            }).show();
+
+
         });
         binding.expandButton.setLegendsArray(new ExpandButton.Quadruple(
                         ContextCompat.getDrawable(requireContext(), R.drawable.marker_blue),
@@ -521,33 +584,33 @@
 //                    }
                     // 璺宠浆鍒伴�夋嫨鐨勪綅缃�
                     mWebView.evaluateJavascript(
-                        String.format("javascript:setCenterAndZoom(\"%s\",\"%s\",\"17\")", 
-                        item.getLng(), 
-                        item.getLat()), 
-                        null
+                            String.format("javascript:setCenterAndZoom(\"%s\",\"%s\",\"17\")",
+                                    item.getLng(),
+                                    item.getLat()),
+                            null
                     );
                 });
-                
+
                 // 鎵ц鎼滅储
                 compositeDisposable.add(
-                    DaoSingleton.getAsynchInstance(requireContext())
-                        .divideDao()
-                        .searchAllByKeyword(s)
-                        .subscribeOn(Schedulers.io())
-                        .observeOn(AndroidSchedulers.mainThread())
-                        .subscribe(
-                            results -> {
-                                if (results != null && !results.isEmpty()) {
-                                    searchDialog.setData(results);
-                                    searchDialog.show();
-                                } else {
-                                    ToastUtil.showToast(requireContext(), "鏈壘鍒扮浉鍏崇粨鏋�");
-                                }
-                            },
-                            throwable -> {
-                                ToastUtil.showToast(requireContext(), "鎼滅储澶辫触锛�" + throwable.getMessage());
-                            }
-                        )
+                        DaoSingleton.getAsynchInstance(requireContext())
+                                .divideDao()
+                                .searchAllByKeyword(s)
+                                .subscribeOn(Schedulers.io())
+                                .observeOn(AndroidSchedulers.mainThread())
+                                .subscribe(
+                                        results -> {
+                                            if (results != null && !results.isEmpty()) {
+                                                searchDialog.setData(results);
+                                                searchDialog.show();
+                                            } else {
+                                                ToastUtil.showToast(requireContext(), "鏈壘鍒扮浉鍏崇粨鏋�");
+                                            }
+                                        },
+                                        throwable -> {
+                                            ToastUtil.showToast(requireContext(), "鎼滅储澶辫触锛�" + throwable.getMessage());
+                                        }
+                                )
                 );
             }
             return null;
@@ -609,8 +672,23 @@
         });
     }
 
+    /**
+     * 闅愯棌搴曢儴甯冨眬鐨勫姩鐢绘晥鏋�
+     */
+    private void hideBottomLayoutWithAnimation() {
+        binding.bottomLL.animate()
+                .translationY(binding.bottomLL.getHeight())
+                .setDuration(300)
+                .setInterpolator(new android.view.animation.AccelerateInterpolator())
+                .withEndAction(() -> {
+                    binding.bottomLL.setVisibility(View.GONE);
+                    binding.bottomLL.setTranslationY(0);
+                })
+                .start();
+    }
+
     public void closeWaterIntakeDetail() {
-        binding.bottomLL.setVisibility(View.GONE);
+        hideBottomLayoutWithAnimation();
     }
 
     /**
@@ -844,7 +922,7 @@
                 boolean isfrist = true;
                 for (PipeNetworkDataCoordinateBean data : pipeNetworkBean.getData().getCoordinates()) {
                     if (!TextUtils.isEmpty(data.getLat()) && !TextUtils.isEmpty(data.getLng())) {
-                        mWebView.evaluateJavascript("javascript:addPipeNetwork(\"" + data.getLng() + "\",\"" + data.getLat() + "\",\"" + isfrist +  "\",\"" + isShowPipeNetwork +"\")", new ValueCallback<String>() {
+                        mWebView.evaluateJavascript("javascript:addPipeNetwork(\"" + data.getLng() + "\",\"" + data.getLat() + "\",\"" + isfrist + "\",\"" + isShowPipeNetwork + "\")", new ValueCallback<String>() {
                             @Override
                             public void onReceiveValue(String value) {
                             }
@@ -958,7 +1036,30 @@
                         binding.lat.setText(lat);
                         mWebView.evaluateJavascript("javascript:cancelPin()", value -> {
                         });
-                        ToastUtil.showToastLong(MapFragment.this.getContext(), "淇敼鎴愬姛锛�");
+
+                        // 鏇存柊鏈湴鏁版嵁搴�
+                        compositeDisposable.add(
+                                DaoSingleton.getAsynchInstance(MapFragment.this.getContext())
+                                        .markerDao()
+                                        .updateMarkerLocation(markerBean.getId(), lng, lat)
+                                        .subscribeOn(Schedulers.io())
+                                        .observeOn(AndroidSchedulers.mainThread())
+                                        .subscribe(
+                                                () -> {
+                                                    // 鏇存柊鏈湴缂撳瓨Map涓殑鏁版嵁
+                                                    MarkerBean cachedMarker = markerBeanSet.get(markerBean.getId());
+                                                    if (cachedMarker != null) {
+                                                        cachedMarker.setLng(lng);
+                                                        cachedMarker.setLat(lat);
+                                                    }
+                                                    ToastUtil.showToastLong(MapFragment.this.getContext(), "淇敼鎴愬姛锛�");
+                                                },
+                                                throwable -> {
+                                                    Log.e(TAG, "鏇存柊鏈湴鏁版嵁搴撳け璐�: ");
+                                                    ToastUtil.showToastLong(MapFragment.this.getContext(), "淇敼鎴愬姛锛屼絾鏈湴鏁版嵁搴撴洿鏂板け璐�");
+                                                }
+                                        )
+                        );
 
                     } else {
                         ToastUtil.showToastLong(MapFragment.this.getContext(), t.getMsg());
@@ -998,6 +1099,7 @@
                     mMarkerBean.setAddress(result.getAddress());
                     mMarkerBean.setBlockName(result.getBlockName());
                     mMarkerBean.setDivideId(result.getDivideId());
+                    getDeviceData(result.getName());
                     showMarker(mMarkerBean);
                 } else {
                     ToastUtil.showToast(MapFragment.this.getContext(), t.getMsg());
@@ -1008,7 +1110,7 @@
     }
 
     /**
-     * 鏄剧ず鍙栨按鍙h鎯�
+     * 鏄剧ず鍒嗘按鎴胯鎯�
      */
     private void getDivideDetail(DivideBean divideBean) {
         ApiManager.getInstance().requestGet(this.getContext(), Constants.BASE_URL + "/project/divide/getone/" + divideBean.getDivideId(), DivideResult.class, null, new SubscriberListener<BaseResponse<DivideResult>>() {
@@ -1016,6 +1118,7 @@
             public void onNext(BaseResponse<DivideResult> t) {
                 if (t.isSuccess()) {
                     DivideBean divideBean = getDivideBean(t.getContent());
+                    getDeviceData(divideBean.getDivideName());
                     showDivideMarker(divideBean);
                 } else {
                     ToastUtil.showToast(MapFragment.this.getContext(), t.getMsg());
@@ -1026,10 +1129,23 @@
     }
 
     /**
+     * 鏄剧ず搴曢儴甯冨眬鐨勫姩鐢绘晥鏋�
+     */
+    private void showBottomLayoutWithAnimation() {
+        binding.bottomLL.setVisibility(View.VISIBLE);
+        binding.bottomLL.setTranslationY(binding.bottomLL.getHeight());
+        binding.bottomLL.animate()
+                .translationY(0)
+                .setDuration(300)
+                .setInterpolator(new android.view.animation.DecelerateInterpolator())
+                .start();
+    }
+
+    /**
      * 鏄剧ず鍙栨按鍙h鎯�
      */
     private void showMarker(MarkerBean markerBean) {
-        binding.bottomLL.setVisibility(View.VISIBLE);
+        showBottomLayoutWithAnimation();
         binding.phoneLL.setVisibility(View.GONE);
         binding.headerLL.setVisibility(View.GONE);
         binding.editePoint.setVisibility(View.VISIBLE);
@@ -1073,7 +1189,7 @@
      * @param divideBean
      */
     private void showDivideMarker(DivideBean divideBean) {
-        binding.bottomLL.setVisibility(View.VISIBLE);
+        showBottomLayoutWithAnimation();
         binding.phoneLL.setVisibility(View.VISIBLE);
         binding.headerLL.setVisibility(View.VISIBLE);
         binding.editePoint.setVisibility(View.GONE);
@@ -1081,6 +1197,11 @@
         binding.markerName.setText(divideBean.getDivideName());
         binding.markerBlockName.setText(divideBean.getBlockName());
         binding.phone.setText(divideBean.getPhone());
+        binding.phone.setOnClickListener(v -> {
+            Intent intent = new Intent(Intent.ACTION_DIAL);
+            intent.setData(Uri.parse("tel:" + divideBean.getPhone()));
+            startActivity(intent);
+        });
         binding.header.setText(divideBean.getHeader());
         binding.lat.setText(divideBean.getLat());
         binding.lng.setText(divideBean.getLng());
@@ -1337,4 +1458,45 @@
         }
     }
 
+    /**
+     * 鑾峰彇璁惧鐩稿叧鐘舵�佷俊鎭�
+     *
+     * @param intakeNum
+     */
+    private void getDeviceData(String intakeNum) {
+        Map<String, Object> params = new HashMap<>();
+        params.put("intakeNum", intakeNum);
+        ApiManager.getInstance().requestGetHideLoading(MapFragment.this.getContext(), BASE_URL + "/remote/monitor/all_intakes", IntakeListResult.class, params, new SubscriberListener<BaseResponse<IntakeListResult>>() {
+            @Override
+            public void onNext(BaseResponse<IntakeListResult> t) {
+                try {
+                    if (t.isSuccess()) {
+                        if (t.getContent() != null && t.getContent().getObj().size() > 0) {
+                            binding.deviceStateLL.setVisibility(View.VISIBLE);
+                            binding.rtuAddressLL.setVisibility(View.VISIBLE);
+                            IntakeResult intakeResult = t.getContent().getObj().get(0);
+                            if (intakeResult.isOnLine()) {
+                                binding.deviceState.setText("鍦ㄧ嚎");
+                                binding.deviceState.setTextColor(getResources().getColor(R.color.down_green_up, null));
+                            } else {
+                                binding.deviceState.setText("绂荤嚎");
+                                binding.deviceState.setTextColor(getResources().getColor(R.color.delete_color, null));
+                            }
+                            binding.rtuAddress.setText(intakeResult.getRtuAddr());
+                        } else {
+                            binding.deviceStateLL.setVisibility(View.GONE);
+                            binding.rtuAddressLL.setVisibility(View.GONE);
+                        }
+                    } else {
+                        ToastUtil.showToastLong(MapFragment.this.getContext(), t.getMsg());
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    CrashReport.postCatchedException(e);
+                }
+            }
+
+        });
+    }
+
 }

--
Gitblit v1.8.0