Browse Source

抄表业务部分测试问题修改,界面遮挡等问题

YEJAVON\Tfly 3 years ago
parent
commit
ca620d9cde
26 changed files with 1041 additions and 95 deletions
  1. 3 3
      app/build.gradle
  2. 1 1
      app/src/main/java/com/tofly/route/module/gps/GpsTool.java
  3. 43 28
      app/src/main/java/com/tofly/route/module/monitor/ui/UiMonitor.java
  4. 1 1
      app/src/main/java/com/tofly/route/module/sign/ui/UiSign.java
  5. 1 1
      app/src/main/java/com/tofly/route/module/version/data/UpdateManager.java
  6. 8 2
      app/src/main/java/com/tofly/route/ui/activity/HdysActivity.java
  7. 50 3
      app/src/main/java/com/tofly/route/ui/activity/UiMapTool.java
  8. 6 6
      app/src/main/java/com/tofly/route/ui/adapter/ZjQuestionAdapter.java
  9. 2 2
      app/src/main/java/com/tofly/route/util/AmapUtils/AmapLocationUtils.java
  10. 62 0
      app/src/main/java/com/tofly/route/util/AmapUtils/DegreeUtil.java
  11. 703 0
      app/src/main/java/com/tofly/route/util/AmapUtils/MeasuringTool.java
  12. 24 0
      app/src/main/java/com/tofly/tyuan/ui/activity/MeterListActivity.java
  13. 1 1
      app/src/main/java/com/tofly/tyuan/ui/activity/MeterListZoneActivity.java
  14. 19 2
      app/src/main/java/com/tofly/tyuan/ui/activity/MeterPCListActivity.java
  15. 10 8
      app/src/main/java/com/tofly/tyuan/ui/activity/RepairjgczActivity.java
  16. 2 1
      app/src/main/java/com/tofly/tyuan/ui/activity/TaskActivity.java
  17. 2 0
      app/src/main/java/com/tofly/tyuan/ui/adapter/MeterListZoneAdapter.java
  18. 1 0
      app/src/main/java/com/tofly/tyuan/ui/imp/MeterListImpl.java
  19. 6 6
      app/src/main/java/com/tofly/tyuan/utils/MeterExcepterUtils.java
  20. 5 0
      app/src/main/res/drawable/main_menu_exu.xml
  21. 1 0
      app/src/main/res/layout/activity_meter_list.xml
  22. 8 1
      app/src/main/res/layout/item_rv_meter_zone.xml
  23. 66 29
      app/src/main/res/layout/ui_maptool.xml
  24. 16 0
      app/src/main/res/menu/menu_main_and_ex.xml
  25. BIN
      app/src/main/res/mipmap-xxhdpi/ic_ex.png
  26. BIN
      app/src/main/res/mipmap-xxhdpi/ic_ex_false.png

+ 3 - 3
app/build.gradle

@@ -15,8 +15,8 @@ android {
         applicationId "com.tofly.tyuan"
         minSdkVersion MIN_SDK_VERSION
         targetSdkVersion TARGET_SDK_VERSION as int
-        versionCode 37
-        versionName "3.7"
+        versionCode 40
+        versionName "4.0"
         flavorDimensions "versionCode"
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         buildFeatures.dataBinding = true
@@ -39,7 +39,7 @@ android {
     }
 
     greendao {
-        schemaVersion 12 //数据库版本号
+        schemaVersion 14 //数据库版本号
         daoPackage 'com.tofly.tyuan.greenDao.db'
         // 设置DaoMaster、DaoSession、Dao 包名
         targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录,请注意,这里路径用/不要用.

+ 1 - 1
app/src/main/java/com/tofly/route/module/gps/GpsTool.java

@@ -727,7 +727,7 @@ public class GpsTool {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             NotificationChannel channel = new NotificationChannel(
                     mContext.getPackageName(),
-                    "巡检任务(巡检系统)",
+                    "",
                     NotificationManager.IMPORTANCE_DEFAULT
             );
             notificationManager.createNotificationChannel(channel);

+ 43 - 28
app/src/main/java/com/tofly/route/module/monitor/ui/UiMonitor.java

@@ -3,7 +3,6 @@ package com.tofly.route.module.monitor.ui;
 import android.annotation.SuppressLint;
 import android.graphics.drawable.BitmapDrawable;
 import android.os.Build;
-import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.View;
@@ -35,7 +34,6 @@ import com.esri.arcgisruntime.symbology.TextSymbol;
 import com.esri.arcgisruntime.util.ListenableList;
 import com.tofly.latte_core.base.BaseActivity;
 import com.tofly.latte_core.utils.AccountManager;
-import com.tofly.latte_core.utils.LogUtils;
 import com.tofly.latte_core.utils.ScreenUtils;
 import com.tofly.route.base.BaseMapController;
 import com.tofly.route.base.C;
@@ -227,35 +225,38 @@ public class UiMonitor extends BaseActivity<MonitorContract.Presenter> implement
                                         // Log.e("TAG", "run: --------点击要素-----" + id + "--------test:");
                                         //根据当前要素对应的ID 查询具体抄表数据详情并弹窗展示
 
-                                            String yhbh = (String) attributes.get("yhbh");
-                                            String yhxm = (String) attributes.get("yhxm");
-                                            String ysxzName = (String) attributes.get("ysxzName");
-                                            String lxdh = (String) attributes.get("lxdh");
-                                            String yhdz = (String) attributes.get("yhdz");
-                                            String sbbh = (String) attributes.get("sbbh");
-                                            String sbcj = (String) attributes.get("sbcj");
-                                            String cbkj = (String) attributes.get("cbkj");
+                                        String yhbh = (String) attributes.get("yhbh");
+                                        String yhxm = (String) attributes.get("yhxm");
+                                        String ysxzName = (String) attributes.get("ysxzName");
+                                        String lxdh = (String) attributes.get("lxdh");
+                                        String yhdz = (String) attributes.get("yhdz");
+                                        String sbbh = (String) attributes.get("sbbh");
+                                        String sbcj = (String) attributes.get("sbcj");
+                                        String cbkj = (String) attributes.get("cbkj");
 
 
-                                            Integer month1 = (Integer) attributes.get("month1");
-                                            Integer month2 = (Integer) attributes.get("month2");
-                                            Integer month3 = (Integer) attributes.get("month3");
-                                            attributes.get("jfzt");
+                                        Integer month1 = (Integer) attributes.get("month1");
+                                        String cbrq1 = (String) attributes.get("cbrq1");
+                                        Integer month2 = (Integer) attributes.get("month2");
+                                        String cbrq2 = (String) attributes.get("cbrq2");
+                                        Integer month3 = (Integer) attributes.get("month3");
+                                        String cbrq3 = (String) attributes.get("cbrq3");
+                                        attributes.get("jfzt");
 
 
-                                            String cbfsName = (String) attributes.get("cbfsName");
-                                            Integer bcds = (Integer) attributes.get("bcds");
-                                            Integer scds = (Integer) attributes.get("scds");
-                                            String bz = (String) attributes.get("bz");
+                                        String cbfsName = (String) attributes.get("cbfsName");
+                                        Integer bcds = (Integer) attributes.get("bcds");
+                                        Integer scds = (Integer) attributes.get("scds");
+                                        String bz = (String) attributes.get("bz");
 
-                                            //附件
-                                            //List<CbHisDataBean.FileInfoDTO> fileInfo = (List<CbHisDataBean.FileInfoDTO>) attributes.get("fileInfo");
-                                            if (yhbh != null) {
-                                                showCbDetails(clickPoint, attributes);
-                                            }
+                                        //附件
+                                        //List<CbHisDataBean.FileInfoDTO> fileInfo = (List<CbHisDataBean.FileInfoDTO>) attributes.get("fileInfo");
+                                        if (yhbh != null) {
+                                            showCbDetails(clickPoint, attributes);
+                                        }
 
                                     } catch (Exception e) {
-                                       // Log.e("TAG", "run: --------点击要素-----" + e.getMessage() + "--------test:");
+                                        // Log.e("TAG", "run: --------点击要素-----" + e.getMessage() + "--------test:");
 
                                     }
                                     break;
@@ -319,15 +320,29 @@ public class UiMonitor extends BaseActivity<MonitorContract.Presenter> implement
 
 
         Integer month1 = (Integer) attributes.get("month1");
+        String cbrq1 = (String) attributes.get("cbrq1");
+        //
         Integer month2 = (Integer) attributes.get("month2");
+        String cbrq2 = (String) attributes.get("cbrq2");
         Integer month3 = (Integer) attributes.get("month3");
+        String cbrq3 = (String) attributes.get("cbrq3");
+
         String jfzt = (String) attributes.get("jfzt");
         TextView tv_pre_one = view.findViewById(R.id.tv_pre_one);
-        tv_pre_one.setText("前一月水量:" + month1 + "");
+
+        if (month1 != null && cbrq1 != null) {
+            tv_pre_one.setText(cbrq1.substring(0, 7) + "月水量:" + month1 + "");
+        }
+
         TextView tv_pre_two = view.findViewById(R.id.tv_pre_two);
-        tv_pre_two.setText("前二月水量:" + month2 + "");
+        if (month2 != null && cbrq2 != null) {
+            tv_pre_two.setText(cbrq2.substring(0, 7) + "月水量:" + month2 + "");
+        }
         TextView tv_pre_three = view.findViewById(R.id.tv_pre_three);
-        tv_pre_three.setText("前三月水量:" + month3 + "");
+        if (month3 != null && cbrq3 != null) {
+                //2021-12月
+            tv_pre_three.setText(cbrq3.substring(0, 7) + "月水量:" + month3 + "");
+        }
         TextView tv_state = view.findViewById(R.id.tv_state);
         tv_state.setText("是否欠费:" + jfzt + "");
 
@@ -628,7 +643,7 @@ public class UiMonitor extends BaseActivity<MonitorContract.Presenter> implement
                 //对象
                 // attributes.put("fileInfo", resultDTO.getFileInfo());
 
-               // LogUtils.e(this,"----- 将水表属性添加,点击的时候展示详情----"+ resultDTO.getYhbh()+ "    x="+resultDTO.getX()+ "    y="+resultDTO.getY());
+                // LogUtils.e(this,"----- 将水表属性添加,点击的时候展示详情----"+ resultDTO.getYhbh()+ "    x="+resultDTO.getX()+ "    y="+resultDTO.getY());
 
 
                 //将当前点展示在地图

+ 1 - 1
app/src/main/java/com/tofly/route/module/sign/ui/UiSign.java

@@ -140,7 +140,7 @@ public class UiSign extends BaseActivity<SignContract.Presenter> implements MapL
                 textViewAddr.setText(mAddress);
             } else if (msg.what == FALSE) {
                 //根据坐标解析地址失败
-                ToastUtil.showToast(UiSign.this, "定位走丢了....");
+               // ToastUtil.showToast(UiSign.this, "定位走丢了....");
             }
         }
     };

+ 1 - 1
app/src/main/java/com/tofly/route/module/version/data/UpdateManager.java

@@ -274,7 +274,7 @@ public class UpdateManager {
                 .VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
         mSavePath = "apk/" + version_name;
         request.setDestinationInExternalFilesDir(mContext, Environment.DIRECTORY_DOWNLOADS, mSavePath);
-        request.setTitle("巡检系统更新中");
+        request.setTitle("沱源水务综合管理平台更新中...");
         request.setDescription("下载完后请点击打开");
         request.setMimeType("application/vnd.android.package-archive");
 

+ 8 - 2
app/src/main/java/com/tofly/route/ui/activity/HdysActivity.java

@@ -235,16 +235,22 @@ public class HdysActivity extends LatteActivity implements MapLoadHelper {
             super.handleMessage(msg);
             if (msg.what == SUCCESS) {
                 //根据坐标解析地址成功
-                com.tofly.route.util.toast.ToastUtil.showToast(HdysActivity.this, "定位解析结果...."+mAddress);
+               // com.tofly.route.util.toast.ToastUtil.showToast(HdysActivity.this, "定位解析结果...."+mAddress);
             } else if (msg.what == FALSE) {
                 //根据坐标解析地址失败
-                com.tofly.route.util.toast.ToastUtil.showToast(HdysActivity.this, "定位走丢了....");
+                //com.tofly.route.util.toast.ToastUtil.showToast(HdysActivity.this, "定位走丢了....");
             }
         }
     };
     private Point longPoint = null;
 
     private String mAddress = null;
+
+    /**
+     * 通过坐标 解析当前坐标对应地址
+     * @param lon
+     * @param lat
+     */
     private void startSeartchLocation(double lon, double lat) {
 
         double finalLon = lon;

+ 50 - 3
app/src/main/java/com/tofly/route/ui/activity/UiMapTool.java

@@ -4,11 +4,14 @@ import android.content.Context;
 import android.content.Intent;
 import android.graphics.drawable.BitmapDrawable;
 import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -18,6 +21,9 @@ import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
+import androidx.fragment.app.FragmentActivity;
 
 import com.esri.arcgisruntime.concurrent.ListenableFuture;
 import com.esri.arcgisruntime.data.Feature;
@@ -39,6 +45,8 @@ import com.esri.arcgisruntime.mapping.view.GraphicsOverlay;
 import com.esri.arcgisruntime.mapping.view.LocationDisplay;
 import com.esri.arcgisruntime.mapping.view.MapView;
 import com.esri.arcgisruntime.symbology.MarkerSymbol;
+import com.google.android.material.appbar.AppBarLayout;
+import com.google.android.material.appbar.CollapsingToolbarLayout;
 import com.tofly.latte_core.base.BaseDelegate;
 import com.tofly.latte_core.utils.LogUtils;
 import com.tofly.latte_core.utils.ScreenUtils;
@@ -54,6 +62,7 @@ import com.tofly.route.module.map.ui.view.PipeAnalyzeResultBottomSheet;
 import com.tofly.route.ui.dialog.UiMainLayerManagerDailog;
 import com.tofly.route.ui.view.FloatAddressSearchBar;
 import com.tofly.route.util.AmapUtils.AmapLocationHelper;
+import com.tofly.route.util.AmapUtils.MeasuringTool;
 import com.tofly.route.util.ArcgisUtils.ArcgisUtils;
 import com.tofly.route.util.ArcgisUtils.SizeMarkerSymbol;
 import com.tofly.route.util.image.PhotoHelper;
@@ -89,6 +98,26 @@ public class UiMapTool extends BaseDelegate<MapPresenter> implements MapLoadHelp
     PipeAnalyzeResultBottomSheet pipeAnalyzeResultBottomSheet;//爆管分析
     @BindView(R.id.layout_float_area)
     LinearLayout layout_float_area;
+    @BindView(R.id.image_main_top_bg)
+    ImageView imageMainTopBg;
+    @BindView(R.id.toolbar_layout)
+    CollapsingToolbarLayout collapsingToolbarLayout;
+    @BindView(R.id.layout_app_bar)
+    AppBarLayout appBarLayout;
+    @BindView(R.id.text_toolbar_title)
+    TextView textToolbarTitle;
+    @BindView(R.id.maptool_location_iv)
+    ImageView maptoolLocationIv;
+    @BindView(R.id.maptool_location_ll)
+    LinearLayout maptoolLocationLl;
+    @BindView(R.id.text_connect_error_hint)
+    TextView textConnectErrorHint;
+    @BindView(R.id.text_connect_error_act)
+    TextView textConnectErrorAct;
+    @BindView(R.id.layer_manager)
+    ImageView layerManager;
+    @BindView(R.id.main_toolbar)
+    Toolbar toolbar;
     private ActionBar actionBar;
     private double mCurrentScale = BaseMapController.DEFAULTSCALE;
     private BaseMapController baseMapController;
@@ -101,6 +130,7 @@ public class UiMapTool extends BaseDelegate<MapPresenter> implements MapLoadHelp
     private Point mLocation;
     private boolean isPipeAnalyzeOn = false;
     private BaseMapController.MapMode mapFlag = BaseMapController.MapMode.offlineMode; // 离线地图模式 / 在线地图模式 /爆管分析模式
+    private MeasuringTool measuringTool;
 
     @Override
     protected MapPresenter createPresenter() {
@@ -124,13 +154,19 @@ public class UiMapTool extends BaseDelegate<MapPresenter> implements MapLoadHelp
         } else {
             layout_float_area.setVisibility(View.GONE);
         }
-        // Initialize the helper class to use the Toolkit
         mContext = getContext();
         imageLoc = (BitmapDrawable) getResources().getDrawable(R.mipmap.trouble_location);
         symbolLoc = SizeMarkerSymbol.sizeSymbol(imageLoc, 18, 18);
         setHasOptionsMenu(true);
+
+
+        measuringTool = new MeasuringTool(UiMapTool.this.mapView);
+        //coordinatorLayout.startActionMode(measuringTool);
     }
 
+
+
+
     @Override
     public void initNet() {
         initData();
@@ -148,7 +184,7 @@ public class UiMapTool extends BaseDelegate<MapPresenter> implements MapLoadHelp
 
     @Override
     public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
-        inflater.inflate(R.menu.menu_main, menu);
+         inflater.inflate(R.menu.menu_main_and_ex, menu);
         super.onCreateOptionsMenu(menu, inflater);
     }
 
@@ -156,8 +192,16 @@ public class UiMapTool extends BaseDelegate<MapPresenter> implements MapLoadHelp
     public boolean onOptionsItemSelected(@NonNull MenuItem item) {
         switch (item.getItemId()) {
             case R.id.action_sketch: {
+
+                Log.e("TAG", "onOptionsItemSelected: -------------截图");
             }
             break;
+
+            case R.id.action_ex:
+
+                Log.e("TAG", "onOptionsItemSelected: -------------测量");
+                //getActivity().startActionMode((ActionMode.Callback) measuringTool) ;//startSupportActionMode(measuringTool);
+                break;
         }
         return super.onOptionsItemSelected(item);
     }
@@ -175,7 +219,7 @@ public class UiMapTool extends BaseDelegate<MapPresenter> implements MapLoadHelp
      *
      * @param view
      */
-    @OnClick({R.id.layer_manager, R.id.maptool_location_ll, R.id.layout_pipe_analyze, R.id.pipe_analyze_bottom_sheet, R.id.image_sketch})
+    @OnClick({R.id.layer_manager, R.id.maptool_location_ll, R.id.layout_pipe_analyze, R.id.pipe_analyze_bottom_sheet, R.id.image_sketch, R.id.image_exu})
     void onClicked(View view) {
         switch (view.getId()) {
             case R.id.layer_manager:
@@ -208,6 +252,9 @@ public class UiMapTool extends BaseDelegate<MapPresenter> implements MapLoadHelp
                 getSignStatusToday();
             }
             break;
+            case R.id.image_exu:
+                getActivity().startActionMode(measuringTool);//startSupportActionMode(measuringTool);
+                break;
         }
         clearEditFocus();
     }

+ 6 - 6
app/src/main/java/com/tofly/route/ui/adapter/ZjQuestionAdapter.java

@@ -284,12 +284,12 @@ public class ZjQuestionAdapter extends BaseQuickAdapter<RecordMoreEntity, BaseVi
 
 
         initLczt();
-
-        tvZgsxTime.setOnClickListener(v -> {
-            DialogDateUtils.datePickerDialog(mContext, tvZgsxTime.getText().toString(), 1, time -> {
-                tvZgsxTime.setText(time);
-            });
-        });
+        tvZgsxTime.setEnabled(false);
+//        tvZgsxTime.setOnClickListener(v -> {
+//            DialogDateUtils.datePickerDialog(mContext, tvZgsxTime.getText().toString(), 1, time -> {
+//                tvZgsxTime.setText(time);
+//            });
+//        });
     }
 
     /**

+ 2 - 2
app/src/main/java/com/tofly/route/util/AmapUtils/AmapLocationUtils.java

@@ -97,8 +97,8 @@ public class AmapLocationUtils {
 
         Intent nfIntent = new Intent(appContext, HomeActivity.class);
         builder.setContentIntent(PendingIntent.getActivity(appContext, 0, nfIntent, 0))
-                .setContentTitle("上传高德GPS") // 设置下拉列表里的标题
-                .setContentText("巡检系统")// 设置上下文内容
+                .setContentTitle("位置信息上传...") // 设置下拉列表里的标题
+                .setContentText("")// 设置上下文内容
                 .setSmallIcon(R.mipmap.icon_logo)
                 .setWhen(System.currentTimeMillis());
 

+ 62 - 0
app/src/main/java/com/tofly/route/util/AmapUtils/DegreeUtil.java

@@ -0,0 +1,62 @@
+package com.tofly.route.util.AmapUtils;
+
+import android.util.Log;
+
+import com.esri.arcgisruntime.geometry.AngularUnit;
+import com.esri.arcgisruntime.geometry.AngularUnitId;
+import com.esri.arcgisruntime.geometry.Point;
+
+/**
+ * Created by li on 2016/8/29.
+ */
+public class DegreeUtil {
+    //传入点获取角度
+    public static double MeasuringDegree(Point pointC, Point pointB, Point pointA,
+                                         AngularUnit angularUnite) {
+        double bcLen;
+        double baLen;
+        double acLen;
+        double cX = pointC.getX();
+        double cY = pointC.getY();
+        double bX = pointB.getX();
+        double bY = pointB.getY();
+        double aX = pointA.getX();
+        double aY = pointA.getY();
+        double absBCX = Math.abs(cX - bX);
+        double absBCY = Math.abs(cY - bY);
+        double absBAX = Math.abs(bX - aX);
+        double absBAY = Math.abs(bY - aY);
+        double absACX = Math.abs(cX - aX);
+        double absACY = Math.abs(cY - aY);
+        acLen = Math.sqrt((absACX * absACX) + (absACY * absACY));
+        bcLen = Math.sqrt((absBCX * absBCX) + (absBCY * absBCY));
+        baLen = Math.sqrt((absBAX * absBAX) + (absBAY * absBAY));
+//        BigDecimal bc = new BigDecimal(bcLen);
+//        double a = bc.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+//        BigDecimal ba = new BigDecimal(baLen);
+//        double c = ba.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+//        BigDecimal ac = new BigDecimal(acLen);
+//        double b = ac.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+//
+//        double aa = a * a;
+        double aa = bcLen * bcLen;
+//        double cc = c * c;
+        double cc = baLen * baLen;
+//        double bb = b * b;
+        double bb = acLen * acLen;
+        double cosB = (aa + cc - bb) / (2 * bcLen * baLen);
+        double mResult = Math.acos(cosB)*(180/Math.PI);
+        Log.w("TAG", "draw: cosB = " + cosB);
+        Log.w("TAG", "draw: mResult = " + mResult);
+        AngularUnitId id = angularUnite.getAngularUnitId();
+        if (id == AngularUnitId.RADIANS) {
+            mResult = Math.toRadians(mResult);
+        }
+        return mResult;
+//        String unit = angularUnite.getDisplayName();
+//        angularUnite.
+//        switch (unit){
+//            case AngularUnit.Code.RADIAN:
+//        }
+    }
+}

+ 703 - 0
app/src/main/java/com/tofly/route/util/AmapUtils/MeasuringTool.java

@@ -0,0 +1,703 @@
+package com.tofly.route.util.AmapUtils;
+
+/**
+ * 测量工具:长度、面积、角度的测量
+ * Created by li on 2016/8/25.
+ */
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.graphics.Color;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.Spinner;
+import android.widget.TextView;
+import android.widget.RadioGroup.OnCheckedChangeListener;
+
+import androidx.appcompat.view.ActionMode;
+import androidx.core.view.ActionProvider;
+import androidx.core.view.MenuItemCompat;
+
+import com.esri.arcgisruntime.geometry.AngularUnit;
+import com.esri.arcgisruntime.geometry.AreaUnit;
+import com.esri.arcgisruntime.geometry.GeodeticCurveType;
+import com.esri.arcgisruntime.geometry.Geometry;
+import com.esri.arcgisruntime.geometry.GeometryEngine;
+import com.esri.arcgisruntime.geometry.LinearUnit;
+import com.esri.arcgisruntime.geometry.Point;
+import com.esri.arcgisruntime.geometry.PointCollection;
+import com.esri.arcgisruntime.geometry.Polygon;
+import com.esri.arcgisruntime.geometry.Polyline;
+import com.esri.arcgisruntime.geometry.Unit;
+import com.esri.arcgisruntime.mapping.view.Callout;
+import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener;
+import com.esri.arcgisruntime.mapping.view.Graphic;
+import com.esri.arcgisruntime.mapping.view.GraphicsOverlay;
+import com.esri.arcgisruntime.mapping.view.MapView;
+import com.esri.arcgisruntime.symbology.FillSymbol;
+import com.esri.arcgisruntime.symbology.LineSymbol;
+import com.esri.arcgisruntime.symbology.MarkerSymbol;
+import com.esri.arcgisruntime.symbology.SimpleFillSymbol;
+import com.esri.arcgisruntime.symbology.SimpleLineSymbol;
+import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol;
+import com.esri.arcgisruntime.util.ListenableList;
+import com.tofly.route.util.pupwindow.PopWindowUtils;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+@SuppressWarnings("ResourceType")
+public class MeasuringTool implements  android.view.ActionMode.Callback {
+    private static final long serialVersionUID = 1L;
+    private static final int MENU_DELETE = 0;
+    private static final int MENU_PREF = 1;
+    private static final int MENU_UNDO = 2;
+    private MapView mMap;
+    private GraphicsOverlay mLayer;//测量需要绘制的图形的底图,依附在mapView上
+    private View.OnTouchListener mOldOnSingleTapListener;
+    private MarkerSymbol mMarkerSymbol;//点的样式
+    private LineSymbol mLineSymbol;//线的样式
+    private double mResult; //计算结果
+    private TextView mText;//弹出框的tv
+    private MeasureType mMeasureMode;//测量的类型:长度,面积,角度
+    private int mCurrentLinearUnit;//使用的长度单位
+    private Unit[] mLinearUnits;
+    private Unit[] mDefaultLinearUnits;
+    private int mCurrentAreaUnit;//使用的面积单位
+    private Unit[] mAreaUnits;//新设置的面积单位数组
+    private Unit[] mDefaultAreaUnits;//默认的面积单位数组
+    private int mCurrentAngularUnit;//使用的角度单位
+    private Unit[] mAngularUnit;//新设置的角度单位数组
+    private Unit[] mDefaultAngularUnit;//默认的角度单位数组
+    private Context mContext;
+    private ArrayList<Point> mPoints;
+    private FillSymbol mFillSymbol;//面积样式
+    private Callout mCallout;
+    private android.view.ActionMode mMode;//
+    private Polyline mLine;//多线
+    private Polygon mPolygon;//多边形
+
+    //构造函数中设置默认的点线面样式,以及默认的测量单位
+    public MeasuringTool(MapView map) {
+        this.mMeasureMode = MeasureType.LINEAR;
+        this.mMap = map;
+        this.mContext = this.mMap.getContext();
+        this.mMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, -65536, 10);
+        this.mLineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, -16777216, 3.0F);
+        this.mDefaultLinearUnits = new Unit[] {Unit.fromUnitId(9001), Unit.fromUnitId(9036), Unit.fromUnitId(9002), Unit.fromUnitId(9093)};
+        this.mDefaultAreaUnits = new Unit[]{Unit.fromUnitId(109404), Unit.fromUnitId(109414), Unit.fromUnitId(109405), Unit.fromUnitId(109439)};
+        this.mDefaultAngularUnit = new Unit[]{Unit.fromUnitId(9102), Unit.fromUnitId(9101)};
+        this.mFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID,
+                Color.argb(100, 225, 225, 0), null);
+        this.mFillSymbol.setOutline(new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID ,0, 0.0F));
+    }
+
+    private void init() {
+        this.mOldOnSingleTapListener = this.mMap.getOnTouchListener();
+        this.mMap.setOnTouchListener(new DefaultMapViewOnTouchListener(mContext, mMap){
+            @Override
+            public boolean onSingleTapConfirmed(MotionEvent e) {
+                onSingleTap(e.getX(), e.getY());
+                return true;
+            }
+        });
+        this.mLayer = new GraphicsOverlay();
+        this.mMap.getGraphicsOverlays().add(this.mLayer);
+        this.mPoints = new ArrayList<>();
+    }
+
+
+
+    //删除全部点
+    public void deleteAll() {
+        this.mLayer.getGraphics().clear();
+        this.mResult = 0.0D;
+        this.mPoints.clear();
+        this.showResult();
+        this.updateMenu();
+    }
+
+//    //添加点击测量后ActionBar上的操作按钮
+//    @Override
+//    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+//        this.mMode = mode;
+//        this.init();
+//        MenuItem item = menu.add(0, 2, 1, "返回");//返回上一次操作
+//        item.setIcon(android.R.drawable.ic_menu_revert);
+//        item.setVisible(false);
+//        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+//        item = menu.add(0, 0, 2, "清理全部");//清除全部
+//        item.setIcon(android.R.drawable.ic_menu_delete);
+//        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+//        item.setVisible(false);
+//        item = menu.add(0, 1, 3, "参数选择");
+//        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+//        item.setIcon(android.R.drawable.ic_menu_manage);
+//        //item.setActionProvider(new MeasuringTool.Preferences(this.mContext));
+//        MenuItemCompat.setActionProvider(item, new Preferences(this.mContext));
+//        return true;
+//    }
+
+    //当ActionBar上面不显示测量的工具图标时调用
+    public void onDestroyActionMode(ActionMode mode) {
+        this.hideCallout();
+        this.mMap.getGraphicsOverlays().remove(this.mLayer);
+        this.mLayer = null;
+        this.mMap.setOnTouchListener(this.mOldOnSingleTapListener);
+        this.mPoints = null;
+    }
+
+    //隐藏弹出框
+    private void hideCallout() {
+        if (this.mCallout != null && this.mCallout.isShowing()) {
+            this.mCallout.dismiss();
+        }
+
+    }
+
+//   // public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+//        return false;
+//    }
+
+    //单击就添加点到集合中
+    public void onSingleTap(float x, float y) {
+        this.addPoint(x, y);
+    }
+
+    //在地图上添加点击的点,并按不同的模式显示不同的内容
+    private void addPoint(float x, float y) {
+        android.graphics.Point screenPoint =
+                new android.graphics.Point(Math.round(x), Math.round(y));
+        Point point = this.mMap.screenToLocation(screenPoint);
+        this.mPoints.add(point);
+        this.clearAndDraw();
+    }
+
+    //撤销
+    private void undo() {
+        this.mPoints.remove(this.mPoints.size() - 1);
+        this.clearAndDraw();
+    }
+
+    //清除当前的点并重新绘制点和计算
+    private void clearAndDraw() {
+        ListenableList oldGraphics = this.mLayer.getGraphics();
+        this.mLayer.getGraphics().removeAll(oldGraphics);
+        this.draw();
+        this.updateMenu();
+    }
+
+    /**
+     * 在地图上描点
+     */
+    private void draw() {
+        if (this.mPoints.size() != 0) {
+            int index = 0;
+            this.mResult = 0.0D;
+
+            //this.mPolygon = new Polygon();//多边形
+            PointCollection collection = new PointCollection(mMap.getSpatialReference());
+            Point screenPoint;
+            for (Iterator labelPointForPolygon = this.mPoints.iterator(); labelPointForPolygon.hasNext(); ++index) {
+                screenPoint = (Point) labelPointForPolygon.next();
+                this.mLayer.getGraphics().add(new Graphic(screenPoint, this.mMarkerSymbol));
+                if (index == 0) {
+                    collection.add(screenPoint);
+                    //this.mLine.startPath(screenPoint);//多线起始点
+                    if (this.mMeasureMode == MeasureType.AREA) {
+                        //this.mPolygon.startPath(screenPoint);//如果类型为面积,绘制多边形起始点
+                    }
+                } else {
+                    collection.add(screenPoint);
+                    //this.mLine.lineTo(screenPoint);//绘制到下个点
+                    if (this.mMeasureMode == MeasureType.AREA) {
+                        //this.mPolygon.lineTo(screenPoint);
+                    }
+                }
+                //添加到图层中
+                this.mLine = new Polyline(collection);//多线
+                this.mLayer.getGraphics().add(new Graphic(this.mLine, this.mLineSymbol));
+            }
+
+            Point var4;//显示的弹窗的点
+            if (this.mMeasureMode == MeasureType.LINEAR) {//计算长度的模式
+                //计算长度
+                this.mResult += GeometryEngine.lengthGeodetic(this.mLine
+                        , (LinearUnit) this.getLinearUnit(this.mCurrentLinearUnit)
+                        , GeodeticCurveType.GEODESIC);
+                android.graphics.Point screen = this.mMap.locationToScreen(this.mPoints.get(index - 1));
+                var4 = new Point(screen.x, screen.y);
+                this.showResult((float) var4.getX(), (float) var4.getY());// TODO: 2016/8/26 修改是否隐藏callout,分段显示长度
+            } else if (this.mMeasureMode == MeasureType.AREA) {//计算面积的模式
+                collection.add(this.mPoints.get(0));
+                this.mLine = new Polyline(collection);//多线
+                //this.mLine.lineTo((Point) this.mPoints.get(0));//绘制到起始点
+                this.mLayer.getGraphics().add(new Graphic(this.mLine, this.mLineSymbol));
+                this.mPolygon = new Polygon(collection);
+                //this.mPolygon.lineTo((Point) this.mPoints.get(0));//封闭多边形
+                this.mLayer.getGraphics().add(new Graphic(this.mPolygon, this.mFillSymbol));
+                //计算面积
+                this.mResult = GeometryEngine.areaGeodetic(this.mPolygon
+                        , (AreaUnit) this.getAreaUnit(this.mCurrentAreaUnit),
+                        GeodeticCurveType.GEODESIC);
+                var4 = GeometryEngine.labelPoint(this.mPolygon);
+                /*var4 = GeometryEngine.getLabelPointForPolygon(this.mPolygon
+                        , this.mMap.getSpatialReference());*/
+                android.graphics.Point screen = this.mMap.locationToScreen(var4);
+                this.showResult((float) screen.x, (float) screen.y);
+            } else if (this.mMeasureMode == MeasureType.ANGULAR) {//计算角度的模式
+                int i = index - 1;
+                //当点击的点大于等于3时,才能计算角度
+                if (i >= 2) {
+                    this.mResult = DegreeUtil.MeasuringDegree(mPoints.get(i - 2)
+                            , mPoints.get(i - 1)
+                            , mPoints.get(i)
+                            , (AngularUnit) this.getAngularUnite(this.mCurrentAngularUnit));
+                    //显示在第二个点上
+                    android.graphics.Point screen = this.mMap.locationToScreen(this.mPoints.get(index - 2));
+                    var4 = new Point(screen.x, screen.y);
+                    this.showResult((float) var4.getX(), (float) var4.getY());
+                } else {
+                    hideCallout();
+                }
+            }
+        }
+    }
+
+    //刷新“撤销”键和“清除全部”键
+    private void updateMenu() {
+        this.mMode.getMenu().findItem(0).setVisible(this.mPoints.size() > 0);
+        this.mMode.getMenu().findItem(2).setVisible(this.mPoints.size() > 0);
+    }
+
+    /**
+     * 显示结果到地图上
+     *
+     * @param x ,y  callout的坐标
+     */
+    private void showResult(float x, float y) {
+        if (this.mResult > 0.0D) {
+            if (this.mCallout == null) {
+                this.mText = new TextView(this.mContext);
+                this.mCallout = this.mMap.getCallout();
+            }
+            this.mText.setText(this.getResultString());
+            android.graphics.Point screenPoint =
+                    new android.graphics.Point(Math.round(x), Math.round(y));
+            Point mapPoint = this.mMap.screenToLocation(screenPoint);
+            this.mCallout.show(mText, mapPoint);
+        } else if (this.mCallout != null && this.mCallout.isShowing()) {
+            this.mCallout.dismiss();
+        }
+    }
+
+    //当已经显示了弹出框,刷新弹出框
+    private void showResult() {
+        if (this.mResult > 0.0D) {
+            this.mText.setText(this.getResultString());
+            this.mCallout.show();
+        } else if (this.mCallout != null && this.mCallout.isShowing()) {
+            this.mCallout.dismiss();
+        }
+
+    }
+
+    /**
+     * 设置测量长度的工具
+     *
+     * @param linearUnits 工具单位数组
+     */
+    public void setLinearUnits(Unit[] linearUnits) {
+        this.mLinearUnits = linearUnits;
+    }
+
+    //获取测量长度的单位
+    Unit getLinearUnit(int position) {
+        return this.mLinearUnits == null ?
+                this.mDefaultLinearUnits[position % mDefaultLinearUnits.length] :
+                this.mLinearUnits[position % mLinearUnits.length];
+    }
+
+    //获取长度单位的数组长度
+    int getLinearUnitSize() {
+        return this.mLinearUnits == null ? this.mDefaultLinearUnits.length : this.mLinearUnits.length;
+    }
+
+    /**
+     * 设置测量面积的单位集合
+     *
+     * @param areaUnits 面积单位数组
+     */
+    public void setAreaUnits(Unit[] areaUnits) {
+        this.mAreaUnits = areaUnits;
+    }
+
+
+    //获取计算面积的单位
+    private Unit getAreaUnit(int position) {
+        return this.mAreaUnits == null ?
+                this.mDefaultAreaUnits[position % mDefaultAreaUnits.length] :
+                this.mAreaUnits[position % mAreaUnits.length];
+    }
+
+
+    //获取测量的面积的单位的数组长度
+    private int getAreaUnitSize() {
+        return this.mAreaUnits == null ? this.mDefaultAreaUnits.length : this.mAreaUnits.length;
+    }
+
+    /**
+     * 设置测量角度的单位集合
+     *
+     * @param angularUnits 角度单位数组
+     */
+    private void setAngularUnits(Unit[] angularUnits) {
+        this.mAngularUnit = angularUnits;
+    }
+
+    //获取计算角度的单位
+    private Unit getAngularUnite(int position) {
+        return this.mAngularUnit == null ?
+                this.mDefaultAngularUnit[position % mDefaultAngularUnit.length] :
+                this.mAngularUnit[position % mAngularUnit.length];
+    }
+
+    //获取测量角度的单位的数组长度
+    private int getAngularUnitSize() {
+        return this.mAngularUnit == null ? this.mDefaultAngularUnit.length : this.mAngularUnit.length;
+    }
+
+
+    //根据当前的模式获取不同单位的数组长度
+    private int getUnitSize() {
+        return this.mMeasureMode == MeasureType.LINEAR ?
+                this.getLinearUnitSize() : this.mMeasureMode == MeasureType.AREA ?
+                this.getAreaUnitSize() : this.getAngularUnitSize();
+    }
+
+    //根据当前的模式选择单位
+    private Unit getUnit(int position) {
+        return this.mMeasureMode == MeasureType.LINEAR ?
+                this.getLinearUnit(position) : this.mMeasureMode == MeasureType.AREA ?
+                this.getAreaUnit(position) : this.getAngularUnite(position);
+    }
+
+    //根据当前的模式获取不同的使用单位
+    private Unit getCurrentUnit() {
+        return this.getUnit(this.mMeasureMode == MeasureType.LINEAR ?
+                this.mCurrentLinearUnit : this.mMeasureMode == MeasureType.AREA ?
+                this.mCurrentAreaUnit : this.mCurrentAngularUnit);
+    }
+
+    private String getUnitDisplayNameCn(Unit unit){
+        String nameCn = unit.getDisplayName();
+        switch (unit.getUnitId()){
+            case 9001:
+                nameCn = "米";
+                break;
+            case 9036:
+                nameCn = "千米";
+                break;
+            case 9002:
+                nameCn = "英尺";
+                break;
+            case 9093:
+                nameCn = "英里";
+                break;
+            case 109404:
+                nameCn = "平方米";
+                break;
+            case 109414:
+                nameCn = "平方千米";
+                break;
+            case 109405:
+                nameCn = "平方英尺";
+                break;
+            case 109439:
+                nameCn = "平方英里";
+                break;
+            case 9102:
+                nameCn = "度";
+                break;
+            case 9101:
+                nameCn = "弧度";
+                break;
+
+        }
+        return  nameCn;
+    }
+
+    /**
+     * 设置绘制的线的样式
+     *
+     * @param symbol 线样式
+     */
+    public void setLineSymbol(LineSymbol symbol) {
+        this.mLineSymbol = symbol;
+    }
+
+    /**
+     * 设置标记点的样式
+     *
+     * @param symbol 标记点样式
+     */
+    public void setMarkerSymbol(MarkerSymbol symbol) {
+        this.mMarkerSymbol = symbol;
+    }
+
+    /**
+     * 设置面积图形的样式
+     *
+     * @param symbol 样式
+     */
+    public void setFillSymbol(FillSymbol symbol) {
+        this.mFillSymbol = symbol;
+    }
+
+    private Geometry getGeometry() {
+        return (this.mMeasureMode == MeasureType.AREA ? this.mPolygon : this.mLine);
+    }
+
+    @SuppressLint("DefaultLocale")
+    private String getResultString() {
+        return this.mResult > 0.0D ?
+                String.format("%.2f", new Object[]{Double.valueOf(this.mResult)})
+                        + " "
+                        + getUnitDisplayNameCn(this.getCurrentUnit())
+                : "";
+    }
+
+    @Override
+    public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
+        this.mMode = mode;
+        this.init();
+        MenuItem item = menu.add(0, 2, 1, "返回");//返回上一次操作
+        item.setIcon(android.R.drawable.ic_menu_revert);
+        item.setVisible(false);
+        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+        item = menu.add(0, 0, 2, "清理全部");//清除全部
+        item.setIcon(android.R.drawable.ic_menu_delete);
+        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+        item.setVisible(false);
+        item = menu.add(0, 1, 3, "参数选择");
+        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+        item.setIcon(android.R.drawable.ic_menu_manage);
+        //item.setActionProvider(new MeasuringTool.Preferences(this.mContext));
+        MenuItemCompat.setActionProvider(item, new Preferences(this.mContext));
+        return true;
+    }
+
+    @Override
+    public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) {
+
+        return false;
+    }
+
+    @Override
+    public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) {
+        switch (item.getItemId()) {
+            case 0:
+                this.deleteAll();
+                break;
+            case 2:
+                this.undo();
+
+            case 1:
+                //我这这里让用户显示
+
+                Log.e("TAG", "onActionItemClicked: =============" );
+
+               // PopWindowUtils.showCENTER_WRAP_CONTENT()
+                break;
+        }
+
+        return false;
+    }
+
+    @Override
+    public void onDestroyActionMode(android.view.ActionMode mode) {
+        this.hideCallout();
+        this.mMap.getGraphicsOverlays().remove(this.mLayer);
+        this.mLayer = null;
+        this.mMap.setOnTouchListener(this.mOldOnSingleTapListener);
+        this.mPoints = null;
+    }
+
+    /**
+     * 设置单位选项的ActionProvider
+     */
+    class Preferences extends ActionProvider {
+        private ImageView imageView;
+
+        public Preferences(Context context) {
+            super(context);
+            this.imageView = new ImageView(MeasuringTool.this.mContext);
+            this.imageView.setImageDrawable(context.getResources().getDrawable(
+                    android.R.drawable.ic_menu_manage));
+        }
+
+        public View onCreateActionView() {
+            Spinner spinner = new Spinner(MeasuringTool.this.mContext);//下拉按钮
+            spinner.setAdapter(new BaseAdapter() {
+
+                public View getView(int position, View convertView, ViewGroup parent) {
+                    return Preferences.this.imageView;
+                }
+
+                public View getDropDownView(int position, View convertView, ViewGroup parent) {
+                    LinearLayout layout;
+                    TextView text;
+                    //选择测量类型
+                    if (position == 0) {
+                        layout = new LinearLayout(MeasuringTool.this.mContext);
+                        layout.setOrientation(LinearLayout.VERTICAL);
+                        text = new TextView(MeasuringTool.this.mContext);
+                        text.setText("选择测量类型");
+                        text.setTextColor(MeasuringTool.this.mContext.getResources().getColor(android.R.color.holo_blue_light));
+                        text.setTextSize(16.0F);
+                        layout.addView(text);
+                        RadioButton varLen = new RadioButton(MeasuringTool.this.mContext);
+                        varLen.setText("长度");
+                        RadioButton varArea = new RadioButton(MeasuringTool.this.mContext);
+                        varArea.setText("面积");
+                        RadioButton varAngu = new RadioButton(MeasuringTool.this.mContext);
+                        varAngu.setText("角度");
+                        RadioGroup geoType = new RadioGroup(MeasuringTool.this.mContext);
+                        geoType.addView(varLen);
+                        geoType.addView(varArea);
+                        geoType.addView(varAngu);
+                        //记录当前选中的测量模式
+                        geoType.check(MeasuringTool.this.mMeasureMode == MeasureType.LINEAR ?
+                                varLen.getId() : MeasuringTool.this.mMeasureMode == MeasureType.AREA ?
+                                varArea.getId() : varAngu.getId());
+                        layout.addView(geoType);
+                        layout.setPadding(10, 10, 10, 10);
+                        geoType.setOnCheckedChangeListener(new OnCheckedChangeListener() {
+                            public void onCheckedChanged(RadioGroup rGroup, int checkedId) {
+                                for (int i = 0; i < rGroup.getChildCount(); ++i) {
+                                    if (rGroup.getChildAt(i).getId() == checkedId) {
+                                        MeasuringTool.this.mMeasureMode = MeasureType.getType(i);
+                                        notifyDataSetChanged();
+                                        MeasuringTool.this.clearAndDraw();
+                                    }
+                                }
+
+                            }
+                        });
+                        return layout;
+                    } else {//选择单位
+                        layout = new LinearLayout(MeasuringTool.this.mContext);
+                        layout.setOrientation(LinearLayout.VERTICAL);
+                        text = new TextView(MeasuringTool.this.mContext);
+                        text.setText("选择单位");
+                        text.setTextColor(MeasuringTool.this.mContext.getResources().getColor(android.R.color.holo_blue_light));
+                        text.setTextSize(16.0F);
+                        layout.addView(text);
+                        RadioGroup group = new RadioGroup(MeasuringTool.this.mContext);
+                        for (int i = 0; i < MeasuringTool.this.getUnitSize(); ++i) {
+                            RadioButton r = new RadioButton(MeasuringTool.this.mContext);
+                            r.setText(getUnitDisplayNameCn(MeasuringTool.this.getUnit(i)));
+                            group.addView(r);
+                            //设置并保存选中的单位
+                            if (i == (MeasuringTool.this.mMeasureMode == MeasureType.LINEAR ?
+                                    MeasuringTool.this.mCurrentLinearUnit : MeasuringTool.this.mMeasureMode == MeasureType.AREA ?
+                                    MeasuringTool.this.mCurrentAreaUnit : MeasuringTool.this.mCurrentAngularUnit)) {
+                                group.check(r.getId());
+                            }
+                        }
+                        //通过选择的单位,设置系统的单位
+                        group.setOnCheckedChangeListener(new OnCheckedChangeListener() {
+                            public void onCheckedChanged(RadioGroup rGroup, int checkedId) {
+                                for (int i = 0; i < rGroup.getChildCount(); ++i) {
+                                    if (rGroup.getChildAt(i).getId() == checkedId) {
+                                        if (MeasuringTool.this.mMeasureMode == MeasureType.LINEAR) {
+                                            if (MeasuringTool.this.mResult > 0.0D) {
+                                                LinearUnit lineUnit = (LinearUnit) MeasuringTool.this.getLinearUnit(MeasuringTool.this.mCurrentLinearUnit);
+                                                MeasuringTool.this.mResult = lineUnit.convertTo((LinearUnit) MeasuringTool.this.getLinearUnit(i), MeasuringTool.this.mResult);
+                                                //MeasuringTool.this.mResult = Unit.convertUnits(MeasuringTool.this.mResult, MeasuringTool.this.getLinearUnit(MeasuringTool.this.mCurrentLinearUnit), MeasuringTool.this.getLinearUnit(i));
+                                                MeasuringTool.this.mCurrentLinearUnit = i;
+                                                MeasuringTool.this.showResult();
+                                            } else {
+                                                MeasuringTool.this.mCurrentLinearUnit = i;
+                                            }
+                                        } else if (MeasuringTool.this.mMeasureMode == MeasureType.AREA) {
+                                            if (MeasuringTool.this.mResult > 0.0D) {
+                                                AreaUnit areaUnit = (AreaUnit) MeasuringTool.this.getAreaUnit(MeasuringTool.this.mCurrentAreaUnit);
+                                                MeasuringTool.this.mResult = areaUnit.convertTo((AreaUnit) MeasuringTool.this.getAreaUnit(i), MeasuringTool.this.mResult);
+                                                //MeasuringTool.this.mResult = Unit.convertUnits(MeasuringTool.this.mResult, MeasuringTool.this.getAreaUnit(MeasuringTool.this.mCurrentAreaUnit), MeasuringTool.this.getAreaUnit(i));
+                                                MeasuringTool.this.mCurrentAreaUnit = i;
+                                                MeasuringTool.this.showResult();
+                                            } else {
+                                                MeasuringTool.this.mCurrentAreaUnit = i;
+                                            }
+                                        } else if (MeasuringTool.this.mMeasureMode == MeasureType.ANGULAR) {
+                                            if (MeasuringTool.this.mResult > 0.0D) {
+                                                AngularUnit angularUnit = (AngularUnit) MeasuringTool.this.getAngularUnite(MeasuringTool.this.mCurrentAngularUnit);
+                                                MeasuringTool.this.mResult = angularUnit.convertTo((AngularUnit) MeasuringTool.this.getAngularUnite(i), MeasuringTool.this.mResult);
+                                                //MeasuringTool.this.mResult = Unit.convertUnits(MeasuringTool.this.mResult, MeasuringTool.this.getAngularUnite(MeasuringTool.this.mCurrentAngularUnit), MeasuringTool.this.getAngularUnite(i));
+                                                MeasuringTool.this.mCurrentAngularUnit = i;
+                                                MeasuringTool.this.showResult();
+                                            } else {
+                                                MeasuringTool.this.mCurrentAngularUnit = i;
+                                            }
+                                        }
+                                    }
+                                }
+
+                            }
+                        });
+                        layout.addView(group);
+                        layout.setPadding(10, 10, 10, 10);
+                        return layout;
+                    }
+                }
+
+                public long getItemId(int position) {
+                    return (long) position;
+                }
+
+                public Object getItem(int position) {
+                    return null;
+                }
+
+                public int getCount() {
+                    return 2;
+                }
+            });
+            return spinner;
+        }
+    }
+
+    public enum MeasureType {
+        LINEAR,//长度模式
+        AREA,//面积模式
+        ANGULAR;//角度模式
+
+        /**
+         * 提供静态方法,供外部获取枚举类型
+         *
+         * @param i 0表示LINEAR长度 1表示AREA面积 2表示角度
+         */
+        public static MeasureType getType(int i) {
+            switch (i) {
+                case 0:
+                    return LINEAR;
+                case 1:
+                    return AREA;
+                case 2:
+                    return ANGULAR;
+                default:
+                    return LINEAR;
+            }
+        }
+    }
+}

+ 24 - 0
app/src/main/java/com/tofly/tyuan/ui/activity/MeterListActivity.java

@@ -2,6 +2,7 @@ package com.tofly.tyuan.ui.activity;
 
 import android.content.Context;
 import android.content.Intent;
+import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.TextView;
@@ -12,8 +13,11 @@ import androidx.appcompat.widget.Toolbar;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.request.RequestOptions;
 import com.google.android.material.appbar.AppBarLayout;
 import com.google.android.material.appbar.CollapsingToolbarLayout;
+import com.makeramen.roundedimageview.RoundedImageView;
 import com.tofly.latte_core.base.LatteActivity;
 import com.tofly.latte_core.base.LatteContract;
 import com.tofly.latte_core.utils.AccountManager;
@@ -37,6 +41,7 @@ import java.util.List;
 import java.util.Map;
 
 import butterknife.BindView;
+import butterknife.ButterKnife;
 import butterknife.OnClick;
 
 /**
@@ -60,6 +65,8 @@ public class MeterListActivity extends LatteActivity {
     AppCompatTextView tvName;
     @BindView(R.id.tv_code)
     AppCompatTextView tvCode;
+    @BindView(R.id.img_user_info_head)
+    RoundedImageView imgUserInfoHead;
 
     private int page = 1;
     // private MeterListAdapter meterListAdapter;
@@ -83,10 +90,18 @@ public class MeterListActivity extends LatteActivity {
         return R.layout.activity_meter_list;
     }
 
+
+
     @Override
     public void initView() {
         initToolBar();
         tvName.setText(AccountManager.getUserRealName());
+
+        //获取用户头像地址
+        Glide.with(this)
+                .load(AccountManager.getUserImage())
+                .apply(new RequestOptions().error(R.mipmap.user_default_icon))
+                .into(imgUserInfoHead);
         initBaseInfo();
 
         //获取当前用户签到状态
@@ -216,6 +231,8 @@ public class MeterListActivity extends LatteActivity {
     @Override
     protected void onResume() {
         super.onResume();
+
+        initBaseInfo();
         page = 1;
         initData();
     }
@@ -290,4 +307,11 @@ public class MeterListActivity extends LatteActivity {
         zoneAdapter.setNewData(cbqyTaskEntityList);
 
     }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        // TODO: add setContentView(...) invocation
+        ButterKnife.bind(this);
+    }
 }

+ 1 - 1
app/src/main/java/com/tofly/tyuan/ui/activity/MeterListZoneActivity.java

@@ -131,7 +131,7 @@ public class MeterListZoneActivity extends LatteActivity {
                 //抄表统计
                 if (isOverTime()) {
                     Intent intent = new Intent(this, MeterTjActivity.class);
-                    intent.putExtra("isGeneral", type);
+                    intent.putExtra("isGeneral", Integer.valueOf(type));
                     startActivity(intent);
                 }
                 break;

+ 19 - 2
app/src/main/java/com/tofly/tyuan/ui/activity/MeterPCListActivity.java

@@ -2,6 +2,7 @@ package com.tofly.tyuan.ui.activity;
 
 import android.content.Context;
 import android.content.Intent;
+import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.TextView;
@@ -12,8 +13,11 @@ import androidx.appcompat.widget.Toolbar;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.request.RequestOptions;
 import com.google.android.material.appbar.AppBarLayout;
 import com.google.android.material.appbar.CollapsingToolbarLayout;
+import com.makeramen.roundedimageview.RoundedImageView;
 import com.tofly.latte_core.base.LatteActivity;
 import com.tofly.latte_core.base.LatteContract;
 import com.tofly.latte_core.utils.AccountManager;
@@ -37,6 +41,7 @@ import java.util.List;
 import java.util.Map;
 
 import butterknife.BindView;
+import butterknife.ButterKnife;
 import butterknife.OnClick;
 
 /**
@@ -59,6 +64,8 @@ public class MeterPCListActivity extends LatteActivity {
     AppCompatTextView tvName;
     @BindView(R.id.tv_code)
     AppCompatTextView tvCode;
+    @BindView(R.id.img_user_info_head)
+    RoundedImageView imgUserInfoHead;
 
     private int page = 1;
     //   private MeterListAdapter meterListAdapter;
@@ -84,7 +91,10 @@ public class MeterPCListActivity extends LatteActivity {
     public void initView() {
         initToolBar();
         tvName.setText(AccountManager.getUserRealName());
-
+        Glide.with(this)
+                .load(AccountManager.getUserImage())
+                .apply(new RequestOptions().error(R.mipmap.user_default_icon))
+                .into(imgUserInfoHead);
         initBaseInfo();
 
 
@@ -246,7 +256,7 @@ public class MeterPCListActivity extends LatteActivity {
             Integer pages = result.getPages();
             List<CbyhEntity> cbyhEntities = result.getRecords();
             if (cbyhEntities.size() > 0) {
-                for (CbyhEntity e : cbyhEntities ) {
+                for (CbyhEntity e : cbyhEntities) {
                     e.setIsGeneral("1");
                 }
                 DaoUtilsStore.getInstance().getCbyhUtils().insertMulti(cbyhEntities, false);
@@ -275,4 +285,11 @@ public class MeterPCListActivity extends LatteActivity {
         zoneAdapter.setNewData(cbqyTaskEntityList);
 
     }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        // TODO: add setContentView(...) invocation
+        ButterKnife.bind(this);
+    }
 }

+ 10 - 8
app/src/main/java/com/tofly/tyuan/ui/activity/RepairjgczActivity.java

@@ -991,26 +991,28 @@ public class RepairjgczActivity extends TakePhotoActivity {
                         //获取前一个状态----- 回显上一个状态 部门和人员的多选
                         //在本地修改回显时候的数据取值即可
                         //1.工单登记,2.认证处置3.认证审核4.认证质检5.结果处置6.结果审核7.工单归档)
+                        String subDeptName = deptNames.toString().substring(1, deptNames.toString().length() - 1);
+                        String subPersonName = personNames.toString().substring(1, personNames.toString().length() - 1);
                         switch (split[i - 1]) {
                             case "1":
                                 // 受理部门 受理人员
-                                ywgdBean.setSlbmName(deptNames.toString());
-                                ywgdBean.setSlryName(personNames.toString());
+                                ywgdBean.setSlbmName(subDeptName);
+                                ywgdBean.setSlryName(subPersonName);
                                 break;
                             case "2":
                                 //处置部门 处置人员
-                                ywgdBean.setCzbmName(deptNames.toString());
-                                ywgdBean.setCzryName(personNames.toString());
+                                ywgdBean.setCzbmName(subDeptName);
+                                ywgdBean.setCzryName(subPersonName);
                                 break;
                             case "3":
                                 //认证部门/人员
-                                ywgdBean.setShbmName(deptNames.toString());
-                                ywgdBean.setShryName(personNames.toString());
+                                ywgdBean.setShbmName(subDeptName);
+                                ywgdBean.setShryName(subPersonName);
                                 break;
                             case "4":
                                 //质检部门/人员
-                                ywgdBean.setZjbmName(deptNames.toString().substring(1, deptNames.toString().length() - 1));
-                                ywgdBean.setZjczryName(personNames.toString().substring(1, personNames.toString().length() - 1));
+                                ywgdBean.setZjbmName(subDeptName);
+                                ywgdBean.setZjczryName(subPersonName);
                                 break;
                         }
 

+ 2 - 1
app/src/main/java/com/tofly/tyuan/ui/activity/TaskActivity.java

@@ -60,6 +60,7 @@ public class TaskActivity extends LatteActivity {
         initToolBar();
         initRecylerView();
         initListener();
+        loadData();
     }
 
     private void initListener() {
@@ -110,7 +111,7 @@ public class TaskActivity extends LatteActivity {
     @Override
     protected void onResume() {
         super.onResume();
-        loadData();
+
     }
 
     private void loadData() {

+ 2 - 0
app/src/main/java/com/tofly/tyuan/ui/adapter/MeterListZoneAdapter.java

@@ -52,6 +52,8 @@ public class MeterListZoneAdapter extends BaseQuickAdapter<CbqyTaskEntity, BaseV
 
         if (show) {
             // 区域情况 item
+            helper.setText(R.id.tv_cbqydName,"抄表区段:");
+
             if (!TextUtils.isEmpty(item.getCbqyMc())) {
                 helper.setText(R.id.tv_region, item.getCbqyMc());
             } else {

+ 1 - 0
app/src/main/java/com/tofly/tyuan/ui/imp/MeterListImpl.java

@@ -125,6 +125,7 @@ public class MeterListImpl extends LattePresenterImpl {
                                         getView().getResultThree(result);
 
                                     } else {
+                                        getView().hideLoading();
                                         ToastUtil.showToast(demo.getMessage());
                                     }
                                 }

+ 6 - 6
app/src/main/java/com/tofly/tyuan/utils/MeterExcepterUtils.java

@@ -152,12 +152,12 @@ public class MeterExcepterUtils {
             //非居民
             default:
 
-                entityList = systemConfigExceptionEntityDaoUtils.queryAll();
-//                entityList = systemConfigExceptionEntityDaoUtils.queryByQueryBuilder(SystemConfigExceptionEntityDao.Properties.IsForbidden.eq("1"),
-//                        SystemConfigExceptionEntityDao.Properties.ArithType.eq("非居民用水"),
-//                        SystemConfigExceptionEntityDao.Properties.StartKjcode.le(substring),
-//                        SystemConfigExceptionEntityDao.Properties.EndKjcode.ge(substring)
-//                );
+               // entityList = systemConfigExceptionEntityDaoUtils.queryAll();
+                entityList = systemConfigExceptionEntityDaoUtils.queryByQueryBuilder(SystemConfigExceptionEntityDao.Properties.IsForbidden.eq("1"),
+                        SystemConfigExceptionEntityDao.Properties.ArithType.eq("非居民用水"),
+                        SystemConfigExceptionEntityDao.Properties.StartKjcode.le(substring),
+                        SystemConfigExceptionEntityDao.Properties.EndKjcode.ge(substring)
+                );
                 break;
         }
 

+ 5 - 0
app/src/main/res/drawable/main_menu_exu.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@mipmap/ic_ex" android:state_pressed="true"/>
+    <item android:drawable="@mipmap/ic_ex_false"/>
+</selector>

+ 1 - 0
app/src/main/res/layout/activity_meter_list.xml

@@ -43,6 +43,7 @@
                 app:layout_collapseParallaxMultiplier="0.2">
 
                 <com.makeramen.roundedimageview.RoundedImageView
+                    android:id="@+id/img_user_info_head"
                     android:layout_width="55dp"
                     android:layout_height="55dp"
                     android:layout_gravity="center"

+ 8 - 1
app/src/main/res/layout/item_rv_meter_zone.xml

@@ -58,6 +58,7 @@
                         android:orientation="horizontal">
 
                         <TextView
+                            android:id="@+id/tv_cbqydName"
                             android:layout_width="wrap_content"
                             android:layout_height="@dimen/dp_26"
                             android:layout_marginStart="@dimen/dp_5"
@@ -76,7 +77,10 @@
                             android:gravity="center_vertical"
                             android:textColor="@color/color_23c471"
                             android:textSize="@dimen/sp_12"
-                            tools:text="250户" />
+                            android:maxLength="5"
+                            android:maxLines="1"
+                            android:ellipsize="end"
+                            tools:text="户户户户户" />
 
                         <View
                             android:layout_width="@dimen/dp_10"
@@ -158,6 +162,9 @@
                         android:gravity="center_vertical"
                         android:textColor="@color/color_23c471"
                         android:textSize="@dimen/sp_12"
+                        android:maxLength="5"
+                        android:maxLines="1"
+                        android:ellipsize="end"
                         tools:text="250户" />
 
                     <View

+ 66 - 29
app/src/main/res/layout/ui_maptool.xml

@@ -5,6 +5,42 @@
     android:background="@color/white"
     android:orientation="vertical">
 
+    <com.google.android.material.appbar.AppBarLayout
+        android:id="@+id/layout_app_bar"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:fitsSystemWindows="true"
+        android:theme="@style/AppTheme.AppBarOverlay">
+
+        <com.google.android.material.appbar.CollapsingToolbarLayout
+            android:id="@+id/toolbar_layout"
+            android:layout_width="match_parent"
+            android:layout_height="79.5dp"
+            android:visibility="gone"
+            android:fitsSystemWindows="true"
+            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
+            app:statusBarScrim="@android:color/transparent"
+            app:titleEnabled="false">
+            <!-- 标题栏 -->
+            <androidx.appcompat.widget.Toolbar
+                android:id="@+id/main_toolbar"
+                android:layout_width="match_parent"
+                android:layout_height="?attr/actionBarSize"
+                android:layout_marginTop="25dp"
+                app:layout_collapseMode="pin"
+                android:fitsSystemWindows="true"
+                app:popupTheme="@style/AppTheme.PopupOverlay" />
+            <ImageView
+                android:id="@+id/image_main_top_bg"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:background="@drawable/icon_meter_book_bg"
+                app:layout_collapseMode="parallax"
+                app:layout_collapseParallaxMultiplier="0.7"
+                android:fitsSystemWindows="true"/>
+        </com.google.android.material.appbar.CollapsingToolbarLayout>
+    </com.google.android.material.appbar.AppBarLayout>
+
     <RelativeLayout
         android:layout_width="match_parent"
         android:layout_height="74dp"
@@ -14,35 +50,35 @@
             android:id="@+id/text_toolbar_title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="地图工具"
-            android:textSize="@dimen/sp_18"
-            android:layout_centerVertical="true"
             android:layout_alignParentLeft="true"
+            android:layout_centerVertical="true"
             android:paddingLeft="@dimen/dp_20"
+            android:paddingTop="20dp"
+            android:text="地图工具"
             android:textColor="@color/color_white"
-            android:textStyle="bold"
-            android:paddingTop="20dp"/>
+            android:textSize="@dimen/sp_18"
+            android:textStyle="bold" />
 
         <ImageView
             android:id="@+id/image_sketch"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:background="@drawable/main_menu_sketch"
+            android:layout_width="@dimen/dp_20"
+            android:layout_height="@dimen/dp_20"
             android:layout_alignBottom="@id/text_toolbar_title"
             android:layout_alignParentRight="true"
             android:layout_marginTop="@dimen/dp_20"
-            android:layout_marginRight="16dp"/>
-    </RelativeLayout>
+            android:layout_marginRight="16dp"
+            android:background="@drawable/main_menu_sketch" />
 
-<!--    &lt;!&ndash; 标题栏 &ndash;&gt;
-    <androidx.appcompat.widget.Toolbar
-        android:id="@+id/main_toolbar"
-        android:layout_width="match_parent"
-        android:layout_height="74dp"
-        android:background="@drawable/icon_index_bg"
-        app:layout_collapseMode="pin"
-        android:fitsSystemWindows="true"
-        app:popupTheme="@style/AppTheme.PopupOverlay" />-->
+        <ImageView
+            android:id="@+id/image_exu"
+            android:layout_width="@dimen/dp_20"
+            android:layout_height="@dimen/dp_20"
+            android:layout_alignBottom="@id/text_toolbar_title"
+            android:layout_alignParentRight="true"
+            android:layout_marginTop="@dimen/dp_20"
+            android:layout_marginRight="56dp"
+            android:background="@drawable/main_menu_exu" />
+    </RelativeLayout>
 
     <RelativeLayout
         android:layout_width="match_parent"
@@ -68,8 +104,8 @@
                     android:id="@+id/maptool_location_ll"
                     android:layout_width="30dp"
                     android:layout_height="30dp"
-                    android:layout_gravity="left|bottom"
                     android:layout_alignParentBottom="true"
+                    android:layout_gravity="left|bottom"
                     android:layout_marginLeft="16dp"
                     android:layout_marginBottom="10dp"
                     android:background="@drawable/bg_main_float_btn"
@@ -89,13 +125,13 @@
                 android:id="@+id/pipe_analyze_bottom_sheet"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:visibility="gone"/>
+                android:visibility="gone" />
         </LinearLayout>
 
         <include
-            android:visibility="gone"
             android:id="@+id/layout_top_error"
-            layout="@layout/layout_top_error" />
+            layout="@layout/layout_top_error"
+            android:visibility="gone" />
 
         <com.tofly.route.ui.view.FloatAddressSearchBar
             android:id="@+id/layout_float_search"
@@ -112,22 +148,23 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_below="@id/layout_top_error"
-            android:layout_marginTop="60dp"
-            android:layout_marginLeft="15dp" />
+            android:layout_marginLeft="15dp"
+            android:layout_marginTop="60dp" />
 
         <androidx.cardview.widget.CardView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_below="@id/layout_top_error"
             android:layout_alignParentRight="true"
+            android:layout_marginLeft="15dp"
             android:layout_marginTop="60dp"
             android:layout_marginRight="15dp"
-            android:layout_marginLeft="15dp"
+            android:foreground="?android:selectableItemBackground"
+            android:stateListAnimator="@anim/anim_touch_raise"
             app:cardCornerRadius="4dp"
             app:cardPreventCornerOverlap="false"
-            app:cardUseCompatPadding="true"
-            android:foreground="?android:selectableItemBackground"
-            android:stateListAnimator="@anim/anim_touch_raise">
+            app:cardUseCompatPadding="true">
+
             <LinearLayout
                 android:id="@+id/layout_float_area"
                 android:layout_width="wrap_content"

+ 16 - 0
app/src/main/res/menu/menu_main_and_ex.xml

@@ -0,0 +1,16 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:app="http://schemas.android.com/apk/res-auto"
+      xmlns:tools="http://schemas.android.com/apk/res-auto">
+
+
+    <item
+        android:id="@+id/action_ex"
+        android:icon="@drawable/main_menu_exu"
+        android:title="@string/action_measure"
+        app:showAsAction="always" />
+    <item
+        android:id="@+id/action_sketch"
+        android:icon="@drawable/main_menu_exu"
+        android:title="@string/action_sketch"
+        app:showAsAction="always" />
+</menu>

BIN
app/src/main/res/mipmap-xxhdpi/ic_ex.png


BIN
app/src/main/res/mipmap-xxhdpi/ic_ex_false.png