From f5be8d917c32cde8054b377af1eccd685a2a2645 Mon Sep 17 00:00:00 2001 From: huangwei <983142558@qq.com> Date: Sat, 10 Aug 2024 17:50:28 +0800 Subject: [PATCH] =?UTF-8?q?=E7=82=B9=E6=B5=8B=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/libs/colorpickerview-release.aar | Bin 0 -> 29347 bytes .../survey/dialog/CustomLineChartDialog.java | 3 + .../pointmeasure/measure/AddCodeActivity.java | 310 ++++++++++ .../measure/CodeLibraryActivity.java | 250 ++++++++ .../measure/CodeStylePointLineActivity.java | 165 ++++++ .../measure/ControlRecordListActivity.java | 52 ++ .../measure/PickerColorActivity.java | 107 ++++ .../measure/PointSurveyNewActivity.java | 68 ++- .../measure/PointSurveySettingActivity.java | 559 ++++++++++++++++++ .../measure/adapter/CodeLibraryAdapter.java | 136 +++++ .../adapter/ControlRecordListAdapter.java | 68 +++ .../measure/util/CodeConsUtils.java | 72 +++ .../ui/pointmeasure/measure/util/SFUtils.java | 256 ++++++++ .../util/SurveyToolBarClickListenerUtils.java | 111 ++++ .../com/project/survey/util/CommonUtils.java | 161 ++++- .../util/SurveyDevicePoleHrHeightUtils.java | 118 ++++ .../project/survey/util/SurveyUIUtils.java | 122 ++++ .../bingce/dragdrop/DefaultItemCallback.java | 52 ++ .../dragdrop/DefaultItemTouchHelper.java | 9 + .../bingce/dragdrop/FunctionAdapter.java | 144 +++++ .../bingce/dragdrop/FunctionBlockAdapter.java | 133 +++++ .../widget/bingce/dragdrop/FunctionItem.java | 38 ++ .../bingce/dragdrop/FunctionItemID.java | 37 ++ .../dragdrop/ItemTouchHelperAdapter.java | 15 + .../bingce/dragdrop/SpaceItemDecoration.java | 33 ++ .../bingce/dragdrop/SquareRelativeLayout.java | 27 + .../widget/bingce/dragdrop/TabItem.java | 45 ++ .../gaode/GaoDeBottomSheetBehavior.java | 3 +- .../widget/bingce/gaode/GaoDeBtnBehavior.java | 3 +- app/src/main/res/anim/down_anim.xml | 20 + app/src/main/res/drawable/bg_block_tab.xml | 5 + app/src/main/res/drawable/bg_grid_press.xml | 13 + app/src/main/res/drawable/ic_block_add.xml | 9 + app/src/main/res/drawable/ic_block_delete.xml | 9 + .../main/res/drawable/ic_block_selected.xml | 9 + .../res/drawable/icon_black_line_more.xml | 10 + .../res/drawable/icon_code_center_circle.xml | 8 + .../res/drawable/icon_code_circle_empty.xml | 7 + .../res/drawable/icon_code_circle_full.xml | 5 + .../res/drawable/icon_code_color_palette.xml | 5 + .../res/drawable/icon_code_rhombus_empty.xml | 7 + .../res/drawable/icon_code_rhombus_full.xml | 5 + .../drawable/icon_code_rounded_five_star.xml | 5 + .../res/drawable/icon_code_square_empty.xml | 7 + .../res/drawable/icon_code_square_full.xml | 5 + .../drawable/icon_code_straight_five_star.xml | 5 + .../icon_code_triangle_down_empty.xml | 7 + .../drawable/icon_code_triangle_down_full.xml | 5 + .../drawable/icon_code_triangle_up_empty.xml | 7 + .../drawable/icon_code_triangle_up_full.xml | 5 + .../icon_location_information_earth.xml | 15 + .../icon_location_information_earth_gray.xml | 15 + .../main/res/drawable/icon_remark_green.xml | 15 + .../main/res/drawable/icon_survey_paused.xml | 9 + app/src/main/res/drawable/shape_line_dp1.xml | 10 + app/src/main/res/layout/activity_add_code.xml | 254 ++++++++ .../main/res/layout/activity_code_library.xml | 154 +++++ .../layout/activity_control_record_list.xml | 13 + .../main/res/layout/activity_picker_color.xml | 111 ++++ .../layout/activity_point_survey_setting.xml | 463 +++++++++++++++ .../layout_base_survey_staking_setting.xml | 222 +++++++ .../res/layout/layout_code_library_item.xml | 78 +++ .../res/layout/layout_control_record_item.xml | 120 ++++ .../res/layout/layout_dragging_button.xml | 41 ++ .../main/res/layout/layout_function_text.xml | 38 ++ app/src/main/res/layout/layout_grid_item.xml | 53 ++ .../res/layout/layout_linechart_dialog.xml | 81 +++ .../main/res/layout/layout_pole_hr_height.xml | 26 + .../mipmap-xxhdpi/ic_block_tab_checked.png | Bin 0 -> 982 bytes .../mipmap-xxhdpi/ic_block_tab_unchecked.png | Bin 0 -> 949 bytes .../icon_checkbox_select_ovel.png | Bin 0 -> 5454 bytes .../icon_checkbox_unselect_ovel.png | Bin 0 -> 4323 bytes .../res/mipmap-xxhdpi/icon_import_green.png | Bin 0 -> 2016 bytes app/src/main/res/values/attr.xml | 9 + app/src/main/res/values/strings.xml | 73 +++ app/src/main/res/values/styles.xml | 8 + 76 files changed, 5031 insertions(+), 32 deletions(-) create mode 100644 app/libs/colorpickerview-release.aar create mode 100644 app/src/main/java/com/project/survey/ui/pointmeasure/measure/AddCodeActivity.java create mode 100644 app/src/main/java/com/project/survey/ui/pointmeasure/measure/CodeLibraryActivity.java create mode 100644 app/src/main/java/com/project/survey/ui/pointmeasure/measure/CodeStylePointLineActivity.java create mode 100644 app/src/main/java/com/project/survey/ui/pointmeasure/measure/ControlRecordListActivity.java create mode 100644 app/src/main/java/com/project/survey/ui/pointmeasure/measure/PickerColorActivity.java create mode 100644 app/src/main/java/com/project/survey/ui/pointmeasure/measure/PointSurveySettingActivity.java create mode 100644 app/src/main/java/com/project/survey/ui/pointmeasure/measure/adapter/CodeLibraryAdapter.java create mode 100644 app/src/main/java/com/project/survey/ui/pointmeasure/measure/adapter/ControlRecordListAdapter.java create mode 100644 app/src/main/java/com/project/survey/ui/pointmeasure/measure/util/CodeConsUtils.java create mode 100644 app/src/main/java/com/project/survey/ui/pointmeasure/measure/util/SFUtils.java create mode 100644 app/src/main/java/com/project/survey/ui/pointmeasure/measure/util/SurveyToolBarClickListenerUtils.java create mode 100644 app/src/main/java/com/project/survey/util/SurveyDevicePoleHrHeightUtils.java create mode 100644 app/src/main/java/com/project/survey/util/SurveyUIUtils.java create mode 100644 app/src/main/java/com/project/survey/widget/bingce/dragdrop/DefaultItemCallback.java create mode 100644 app/src/main/java/com/project/survey/widget/bingce/dragdrop/DefaultItemTouchHelper.java create mode 100644 app/src/main/java/com/project/survey/widget/bingce/dragdrop/FunctionAdapter.java create mode 100644 app/src/main/java/com/project/survey/widget/bingce/dragdrop/FunctionBlockAdapter.java create mode 100644 app/src/main/java/com/project/survey/widget/bingce/dragdrop/FunctionItem.java create mode 100644 app/src/main/java/com/project/survey/widget/bingce/dragdrop/FunctionItemID.java create mode 100644 app/src/main/java/com/project/survey/widget/bingce/dragdrop/ItemTouchHelperAdapter.java create mode 100644 app/src/main/java/com/project/survey/widget/bingce/dragdrop/SpaceItemDecoration.java create mode 100644 app/src/main/java/com/project/survey/widget/bingce/dragdrop/SquareRelativeLayout.java create mode 100644 app/src/main/java/com/project/survey/widget/bingce/dragdrop/TabItem.java create mode 100644 app/src/main/res/anim/down_anim.xml create mode 100644 app/src/main/res/drawable/bg_block_tab.xml create mode 100644 app/src/main/res/drawable/bg_grid_press.xml create mode 100644 app/src/main/res/drawable/ic_block_add.xml create mode 100644 app/src/main/res/drawable/ic_block_delete.xml create mode 100644 app/src/main/res/drawable/ic_block_selected.xml create mode 100644 app/src/main/res/drawable/icon_black_line_more.xml create mode 100644 app/src/main/res/drawable/icon_code_center_circle.xml create mode 100644 app/src/main/res/drawable/icon_code_circle_empty.xml create mode 100644 app/src/main/res/drawable/icon_code_circle_full.xml create mode 100644 app/src/main/res/drawable/icon_code_color_palette.xml create mode 100644 app/src/main/res/drawable/icon_code_rhombus_empty.xml create mode 100644 app/src/main/res/drawable/icon_code_rhombus_full.xml create mode 100644 app/src/main/res/drawable/icon_code_rounded_five_star.xml create mode 100644 app/src/main/res/drawable/icon_code_square_empty.xml create mode 100644 app/src/main/res/drawable/icon_code_square_full.xml create mode 100644 app/src/main/res/drawable/icon_code_straight_five_star.xml create mode 100644 app/src/main/res/drawable/icon_code_triangle_down_empty.xml create mode 100644 app/src/main/res/drawable/icon_code_triangle_down_full.xml create mode 100644 app/src/main/res/drawable/icon_code_triangle_up_empty.xml create mode 100644 app/src/main/res/drawable/icon_code_triangle_up_full.xml create mode 100644 app/src/main/res/drawable/icon_location_information_earth.xml create mode 100644 app/src/main/res/drawable/icon_location_information_earth_gray.xml create mode 100644 app/src/main/res/drawable/icon_remark_green.xml create mode 100644 app/src/main/res/drawable/icon_survey_paused.xml create mode 100644 app/src/main/res/drawable/shape_line_dp1.xml create mode 100644 app/src/main/res/layout/activity_add_code.xml create mode 100644 app/src/main/res/layout/activity_code_library.xml create mode 100644 app/src/main/res/layout/activity_control_record_list.xml create mode 100644 app/src/main/res/layout/activity_picker_color.xml create mode 100644 app/src/main/res/layout/activity_point_survey_setting.xml create mode 100644 app/src/main/res/layout/layout_base_survey_staking_setting.xml create mode 100644 app/src/main/res/layout/layout_code_library_item.xml create mode 100644 app/src/main/res/layout/layout_control_record_item.xml create mode 100644 app/src/main/res/layout/layout_dragging_button.xml create mode 100644 app/src/main/res/layout/layout_function_text.xml create mode 100644 app/src/main/res/layout/layout_grid_item.xml create mode 100644 app/src/main/res/layout/layout_linechart_dialog.xml create mode 100644 app/src/main/res/layout/layout_pole_hr_height.xml create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_block_tab_checked.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_block_tab_unchecked.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_checkbox_select_ovel.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_checkbox_unselect_ovel.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_import_green.png diff --git a/app/libs/colorpickerview-release.aar b/app/libs/colorpickerview-release.aar new file mode 100644 index 0000000000000000000000000000000000000000..5a44ce6459d4a423c629734f6687a39186d71851 GIT binary patch literal 29347 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 codeTypeList = new ArrayList<>(); + private int codeShapeTypeIndex = 0;//0:点,1:线,2:面 + private int codeShapeColor;//点和线的颜色,面的填充色。 + private int codeShapeSizeIndex = 0;//点、线和面的轮廓线的尺寸大小。 + private int codeStyleIndexPoint = 0;//点的默认选中的下坐标。 + private int codeStyleIndexLine = 0;//线的默认选中的下坐标。 + private int contourColor;//面的轮廓颜色。 + private String codeId; + + @Override + public View getContentView() { + binding = ActivityAddCodeBinding.inflate(getLayoutInflater()); + return binding.getRoot(); + } + + @Override + protected void initView() { + setTitle(getString(R.string.add) + getString(R.string.point_code)); + } + + @Override + protected void initData() { + + String json = IntentUtil.stringExtra(this, CODE_RECORD); + + if (!TextUtils.isEmpty(json)){ + CodeRecord codeRecord = new Gson().fromJson(json, CodeRecord.class); + codeId = codeRecord.id; + codeShapeTypeIndex = codeRecord.codeGroupType; + binding.etCodeName.setText(codeRecord.codeName); + binding.etCode.setText(codeRecord.code); + codeShapeSizeIndex = codeRecord.codeSizeShape; + switch (codeRecord.codeGroupType){ + case SHAPE_TYPE_POINT: + codeStyleIndexPoint = codeRecord.codeFeatureShape; + codeShapeColor = codeRecord.colorShape; + contourColor = codeRecord.colorShape; + break; + case SHAPE_TYPE_LINE: + codeStyleIndexLine = codeRecord.codeFeatureShape; + codeShapeColor = codeRecord.colorShape; + contourColor = codeRecord.colorShape; + break; + case SHAPE_TYPE_SURFACE: + codeStyleIndexLine = codeRecord.codeFeatureShape; + codeShapeColor = codeRecord.colorShape; + contourColor = codeRecord.codeColorContour; + break; + } + }else { + codeId = IdUtils.getUUID(); + codeShapeTypeIndex = PreferencesUtil.getAddCodeTypeIndex(); + codeShapeColor = getResources().getColor(R.color.theme_green); + contourColor = codeShapeColor; + } + + codeTypeList.add(getString(R.string.point)); + codeTypeList.add(getString(R.string.line)); + codeTypeList.add(getString(R.string.surface)); + + setCodeStyle(codeShapeTypeIndex, codeShapeColor); + + binding.ivCodeColorPalette.setImageDrawable(DrawableUtils.tintModifyColorDrawable(getDrawable(R.drawable.icon_code_color_palette),codeShapeColor)); + + binding.rlCodeType.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + CustomRecycleDialog.showDialog(AddCodeActivity.this, R.string.type, codeTypeList, codeShapeTypeIndex, false, new CustomRecycleDialog.IClickCallback() { + @Override + public void onItemSelected(int index, String itemString) { + codeShapeTypeIndex = index; + setCodeStyle(index, codeShapeColor); + PreferencesUtil.putPreference(ConstUtils.preferConst.addCodeTypeIndex, index); + } + }); + } + }); + + binding.rlCodeColor.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + PickerColorActivity.start(launcher, AddCodeActivity.this, codeShapeColor); + } + }); + + binding.rlCodeStyle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (codeShapeTypeIndex == SHAPE_TYPE_POINT || codeShapeTypeIndex == SHAPE_TYPE_LINE){ + CodeStylePointLineActivity.start(launcher, AddCodeActivity.this, codeShapeTypeIndex, codeShapeColor, codeShapeSizeIndex, codeStyleIndexPoint,codeStyleIndexLine); + }else if (codeShapeTypeIndex == SHAPE_TYPE_SURFACE){ + CodeStyleSurfaceActivity.start(launcher,AddCodeActivity.this,codeShapeColor,contourColor,codeShapeSizeIndex,codeStyleIndexLine); + } + } + }); + + binding.addCodeBtnConfirm.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String codeName = binding.etCodeName.getText().toString(); + String code = binding.etCode.getText().toString(); + if (TextUtils.isEmpty(codeName)){ + ToastUtils.showShort(getString(R.string.enter_code_name)); + return; + } + if (TextUtils.isEmpty(code)){ + ToastUtils.showShort(getString(R.string.enter_code)); + return; + } + ThreadPoolUtil.execute(new Runnable() { + @Override + public void run() { + + CodeRecord codeRecord = new CodeRecord(); + codeRecord.id = codeId; + codeRecord.codeGroupType = codeShapeTypeIndex; + codeRecord.codeName = codeName; + codeRecord.code = code; + codeRecord.colorShape = codeShapeColor; + codeRecord.codeSizeShape = codeShapeSizeIndex; + switch (codeShapeTypeIndex){ + case SHAPE_TYPE_POINT: + codeRecord.codeFeatureShape = codeStyleIndexPoint; + codeRecord.codeColorContour = codeShapeColor;//点线时候轮廓线默认为colorShape + break; + case SHAPE_TYPE_LINE: + codeRecord.codeFeatureShape = codeStyleIndexLine; + codeRecord.codeColorContour = codeShapeColor;//点线时候轮廓线默认为colorShape + break; + case SHAPE_TYPE_SURFACE: + codeRecord.codeFeatureShape = codeStyleIndexLine; + codeRecord.codeColorContour = contourColor;//面的时候使用 + break; + } + + CodeDb.getInstance().save(codeRecord); + ToastUtils.showShort(getString(R.string.add_success)); + Intent intent = new Intent(); + intent.putExtra(ConstUtils.intentConst.keyUpdateCodeRecord, new Gson().toJson(codeRecord)); + setResult(LauncherEvent.launcher_code_library_update,intent); + finish(); + } + }); + } + }); + } + + /** + * 样式 + * @param index + */ + private void setCodeStyle(int index,int color) { + binding.tvCodeType.setText(codeTypeList.get(index)); + switch (index){ + case SHAPE_TYPE_POINT://点 + binding.poinView.setVisibility(View.VISIBLE); + binding.lineView.setVisibility(View.GONE); + binding.faceView.setVisibility(View.GONE); + binding.rlCodeColor.setVisibility(View.VISIBLE); + + ViewGroup.LayoutParams params = binding.poinView.getLayoutParams(); + switch (codeShapeSizeIndex){ + case 0://小尺寸 + params.width = CommonUtils.dip2px(5); + params.height = CommonUtils.dip2px(5); + break; + case 1://中尺寸 + params.width = CommonUtils.dip2px(10); + params.height = CommonUtils.dip2px(10); + break; + case 2://大尺寸 + params.width = CommonUtils.dip2px(15); + params.height = CommonUtils.dip2px(15); + break; + } + binding.poinView.setLayoutParams(params); + + binding.poinView.setImageDrawable(DrawableUtils.tintModifyColorDrawable(getDrawable(CodeConsUtils.showPointIcon(codeStyleIndexPoint)),color)); + break; + + case SHAPE_TYPE_LINE://线 + binding.poinView.setVisibility(View.GONE); + binding.lineView.setVisibility(View.VISIBLE); + binding.faceView.setVisibility(View.GONE); + binding.rlCodeColor.setVisibility(View.VISIBLE); + + GradientDrawable gdLine = (GradientDrawable)binding.lineView.getBackground(); + int lineWidth = 0; + switch (codeShapeSizeIndex){ + case 0: + lineWidth = CommonUtils.dip2px(0.8f); + break; + case 1: + lineWidth = CommonUtils.dip2px(1.3f); + break; + case 2: + lineWidth = CommonUtils.dip2px(1.8f); + break; + } + gdLine.setStroke(lineWidth,color,CommonUtils.dip2px(codeStyleIndexLine + codeStyleIndexLine * 2),CommonUtils.dip2px(codeStyleIndexLine + codeStyleIndexLine * 2)); + break; + + case SHAPE_TYPE_SURFACE://面 + binding.poinView.setVisibility(View.GONE); + binding.lineView.setVisibility(View.GONE); + binding.faceView.setVisibility(View.VISIBLE); + binding.rlCodeColor.setVisibility(View.GONE); + + GradientDrawable gradientDrawable = (GradientDrawable)binding.faceView.getBackground(); + int conturLineWidth = 0; + switch (codeShapeSizeIndex){ + case 0: + conturLineWidth = CommonUtils.dip2px(0.8f); + break; + case 1: + conturLineWidth = CommonUtils.dip2px(1.3f); + break; + case 2: + conturLineWidth = CommonUtils.dip2px(1.8f); + break; + } + gradientDrawable.setStroke(conturLineWidth, contourColor,CommonUtils.dip2px(codeStyleIndexLine + codeStyleIndexLine * 2),CommonUtils.dip2px(codeStyleIndexLine + codeStyleIndexLine * 2)); + gradientDrawable.setColor(color); + + break; + } + } + + private static String CODE_RECORD = "codeRecord"; + + public static void start(ActivityResultLauncher launcher,Context context,String codeRecordJson){ + Intent intent = new Intent(context, AddCodeActivity.class); + intent.putExtra(CODE_RECORD,codeRecordJson); + launcher.launch(intent); + } + + public final ActivityResultLauncher launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result != null) { + switch (result.getResultCode()){ + case LauncherEvent.launcher_add_code_color: + int color = result.getData().getIntExtra(ConstUtils.intentConst.keyAddCodeColor, -1); + codeShapeColor = color; + setCodeStyle(codeShapeTypeIndex,color); + binding.ivCodeColorPalette.setImageDrawable(DrawableUtils.tintModifyColorDrawable(getDrawable(R.drawable.icon_code_color_palette),color)); + break; + case LauncherEvent.launcher_code_style: + codeStyleIndexPoint = result.getData().getIntExtra(ConstUtils.intentConst.keyCodeStyleIndexPoint,0); + codeStyleIndexLine = result.getData().getIntExtra(ConstUtils.intentConst.keyCodeStyleIndexLine,0); + codeShapeSizeIndex = result.getData().getIntExtra(ConstUtils.intentConst.keyCodeShapeSize,0); + setCodeStyle(codeShapeTypeIndex, codeShapeColor); + break; + case LauncherEvent.launcher_code_shape_surface: + codeStyleIndexLine = result.getData().getIntExtra(ConstUtils.intentConst.keyCodeStyleIndexLine,0); + codeShapeSizeIndex = result.getData().getIntExtra(ConstUtils.intentConst.keyCodeShapeSize,0); + contourColor = result.getData().getIntExtra(ConstUtils.intentConst.keyCodeShapeContourColor, -1); + int fillColor = result.getData().getIntExtra(ConstUtils.intentConst.keyCodeShapeFillColor, -1); + codeShapeColor = fillColor; + setCodeStyle(codeShapeTypeIndex, codeShapeColor); + binding.ivCodeColorPalette.setImageDrawable(DrawableUtils.tintModifyColorDrawable(getDrawable(R.drawable.icon_code_color_palette),codeShapeColor)); + break; + } + } + }); +} diff --git a/app/src/main/java/com/project/survey/ui/pointmeasure/measure/CodeLibraryActivity.java b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/CodeLibraryActivity.java new file mode 100644 index 0000000..a3bb3b9 --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/CodeLibraryActivity.java @@ -0,0 +1,250 @@ +package com.project.survey.ui.pointmeasure.measure; + +import static androidx.recyclerview.widget.LinearLayoutManager.VERTICAL; +import static com.bingce.data.database.DBQueryConstant.AND; +import static com.bingce.data.database.DBQueryConstant.FROM_BIG_2_SMALL; +import static com.bingce.data.database.DBQueryConstant.NOT_DELETED; +import static com.bingce.data.database.DBQueryConstant.OR; +import static com.bingce.data.database.DBQueryConstant.ORDER_BY; +import static com.bingce.data.database.DBQueryConstant.SELECT_FROM; +import static com.bingce.data.database.DBQueryConstant.WHERE; + +import android.content.Context; +import android.content.Intent; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.View; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.lifecycle.Observer; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.sqlite.db.SimpleSQLiteQuery; + +import com.bingce.data.BingCeDbConstant; +import com.bingce.data.database.CodeDb; +import com.bingce.data.database.DBQueryConstant; +import com.bingce.data.surveyor.surveydata.code.CodeConstants; +import com.bingce.data.surveyor.surveydata.code.CodeRecord; + +import com.bingce.surveyor.util.ConstUtils; +import com.bingce.surveyor.util.dialog.CustomDialog; +import com.bingce.utils.ThreadPoolUtil; +import com.project.survey.App; +import com.project.survey.R; +import com.project.survey.databinding.ActivityCodeLibraryBinding; +import com.project.survey.ui.base.BaseSurveyNewActivity; +import com.project.survey.ui.pointmeasure.measure.adapter.CodeLibraryAdapter; + +import java.util.List; + +import blankj.utilcode.util.ToastUtils; +import blankj.utilcode.util.Utils; + +public class CodeLibraryActivity extends BaseSurveyNewActivity { + + private ActivityCodeLibraryBinding binding; + private CodeLibraryAdapter adapter; + private int selectPosition; + private List codeRecordList; + + @Override + public View getContentView() { + binding = ActivityCodeLibraryBinding.inflate(getLayoutInflater()); + return binding.getRoot(); + } + + @Override + protected void initView() { + setTitle(getString(R.string.code_library), getString(R.string.clear)); + + if (((App) Utils.getApp()).isThemeDark) { + binding.topLayout.setBackgroundColor(getColor(R.color.theme_dark_black)); + binding.tvNumber.setTextColor(getColor(R.color.white)); + binding.tvImport.setTextColor(getColor(R.color.white)); + } + + selectPosition = getIntent().getIntExtra(CODE_INDEX, -1); + binding.codeLibraryBtnNew.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AddCodeActivity.start(launcher, CodeLibraryActivity.this, ""); + } + }); + binding.codeLibraryBtnEdit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (codeRecordList == null || selectPosition == -1) { + ToastUtils.showShort(getString(R.string.select_code_edit)); + return; + } + AddCodeActivity.start(launcher, CodeLibraryActivity.this, new Gson().toJson(codeRecordList.get(selectPosition))); + } + }); + binding.codeLibraryBtnDelete.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (codeRecordList == null || selectPosition == -1) { + ToastUtils.showShort(getString(R.string.select_code_delete)); + return; + } + new CustomDialog.Builder(CodeLibraryActivity.this).setContent("是否要删除编码" + "“" + codeRecordList.get(selectPosition).codeName + "[" + codeRecordList.get(selectPosition).code + "]”?").setButtonConfirm(new View.OnClickListener() { + @Override + public void onClick(View v) { + ThreadPoolUtil.execute(new Runnable() { + @Override + public void run() { + CodeDb.getInstance().delete(codeRecordList.get(selectPosition)); + runOnUiThread(new Runnable() { + @Override + public void run() { + codeRecordList.remove(selectPosition); + adapter.notifyItemRemoved(selectPosition); + selectPosition = -1; + } + }); + ToastUtils.showShort(getString(R.string.delete_success)); + } + }); + } + }).create().show(); + } + }); + binding.codeLibraryBtnApply.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (codeRecordList == null || selectPosition == -1) { + ToastUtils.showShort(getString(R.string.select_code_apply)); + return; + } + Intent intent = new Intent(); + intent.putExtra(ConstUtils.intentConst.keyApplyIndexCodeRecord, codeRecordList.get(selectPosition).id); + setResult(LauncherEvent.launcher_code_apply_id, intent); + finish(); + } + }); + binding.llImport.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + CodeModelLibraryActivity.start(launcher, CodeLibraryActivity.this); + } + }); + + binding.etEnterNameCode.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + selectPosition = -1; + String s1 = SELECT_FROM + CodeConstants.DB_NAME + WHERE + NOT_DELETED + AND + "(code like '%" + s.toString() + "%'" + OR + "codeName like '%" + s.toString() + "%')" + ORDER_BY + BingCeDbConstant.DB_KEY_CREATED_DATE + FROM_BIG_2_SMALL; + ThreadPoolUtil.execute(new Runnable() { + @Override + public void run() { + codeRecordList = CodeDb.getInstance() + .rawQueryListData(new SimpleSQLiteQuery(s1)); + runOnUiThread(new Runnable() { + @Override + public void run() { + updateUI(); + } + }); + } + }); + } + }); + } + + @Override + protected void initData() { + CodeDb.getInstance() + .rawQueryListLiveData(DBQueryConstant.findListByJob(CodeConstants.DB_NAME, "")) + .observe(this, new Observer>() { + @Override + public void onChanged(List codeList) { + codeRecordList = codeList; + updateUI(); + } + }); + } + + private void updateUI() { + binding.tvCodeNumber.setText(String.valueOf(codeRecordList.size())); + adapter = new CodeLibraryAdapter(CodeLibraryActivity.this, codeRecordList, selectPosition); + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(CodeLibraryActivity.this); + linearLayoutManager.setOrientation(VERTICAL); + binding.recyclerView.setLayoutManager(linearLayoutManager); + binding.recyclerView.setAdapter(adapter); + + adapter.setOnItemClickListener(new CodeLibraryAdapter.OnItemClickListener() { + @Override + public void onItemClickListener(int position) { + if (codeRecordList != null) { + selectPosition = position; + adapter.setSelectedPosition(position); + } + } + }); + } + + @Override + protected void onCommonRightClicked(View view) { + if (codeRecordList != null && codeRecordList.size() > 0) { + new CustomDialog.Builder(this).setContent(getString(R.string.want_to_empty_code_library)).setButtonConfirm(new View.OnClickListener() { + @Override + public void onClick(View v) { + ThreadPoolUtil.execute(new Runnable() { + @Override + public void run() { + CodeDb.getInstance().delete(codeRecordList); + runOnUiThread(new Runnable() { + @Override + public void run() { + codeRecordList.clear(); + adapter.setData(codeRecordList); + setResult(LauncherEvent.launcher_delete_point_lib); + } + }); + } + }); + } + }).create().show(); + } else { + ToastUtils.showShort(getString(R.string.no_data_clear)); + } + } + + private static String CODE_INDEX = "codeIndex"; + + public static void start(ActivityResultLauncher launcher, Context context, int codeIndex) { + Intent intent = new Intent(context, CodeLibraryActivity.class); + intent.putExtra(CODE_INDEX, codeIndex); + launcher.launch(intent); + } + + public static void start(Context context) { + Intent intent = new Intent(context, CodeLibraryActivity.class); + context.startActivity(intent); + } + + public final ActivityResultLauncher launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result != null) { + switch (result.getResultCode()) { + case LauncherEvent.launcher_code_library_update: + CodeRecord codeRecord = new Gson().fromJson(result.getData().getStringExtra(ConstUtils.intentConst.keyUpdateCodeRecord), CodeRecord.class); + if (codeRecordList != null && selectPosition != -1) { + codeRecordList.set(selectPosition, codeRecord); + adapter.setSelectedPosition(selectPosition); + } + break; + } + } + }); +} \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/ui/pointmeasure/measure/CodeStylePointLineActivity.java b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/CodeStylePointLineActivity.java new file mode 100644 index 0000000..d3a771c --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/CodeStylePointLineActivity.java @@ -0,0 +1,165 @@ +package com.project.survey.ui.pointmeasure.measure; + + + +import android.content.Context; +import android.content.Intent; +import android.view.View; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.recyclerview.widget.LinearLayoutManager; + + +import com.bingce.surveyor.util.ConstUtils; + +import com.bingce.surveyor.util.dialog.CustomRecycleDialog; +import com.bingce.utils.IntentUtil; +import com.project.survey.ui.base.BaseSurveyNewActivity; + +import java.util.ArrayList; +import java.util.List; + + +public class CodeStylePointLineActivity extends BaseSurveyNewActivity { + + private ActivityCodeStylePointLineBinding binding; + private CodeStyleAdapter adapter; + private int codeShapeType = 0;//点、线、面形状类型 + private int codeShapeSizeIndex = 0;//尺寸大小index + private int codeShapeColor = 0;//颜色 + + private int codeStyleIndex = 0;//临时的点线面index + private int codeStyleIndexPoint = 0;//点列表index + private int codeStyleIndexLine = 0;//线列表index + + @Override + public View getContentView() { + binding = ActivityCodeStylePointLineBinding.inflate(getLayoutInflater()); + return binding.getRoot(); + } + + @Override + protected void initView() { + setTitle(getString(R.string.style)); + } + + @Override + protected void initData() { + + codeShapeType = IntentUtil.intExtra(getIntent(), CODE_SHAPE_TYPE); + codeShapeColor = IntentUtil.intExtra(getIntent(), CODE_SHAPE_COLOR); + codeShapeSizeIndex = IntentUtil.intExtra(getIntent(), CODE_SHAPE_SIZE); + + codeStyleIndexPoint = IntentUtil.intExtra(getIntent(), CODE_STYLE_INDEX_POINT); + codeStyleIndexLine = IntentUtil.intExtra(getIntent(), CODE_STYLE_INDEX_LINE); + + List list = new ArrayList<>(); + + List sizeList = new ArrayList<>(); + + switch (codeShapeType){ + case SHAPE_TYPE_POINT: + + sizeList.add(getString(R.string.small_size)); + sizeList.add(getString(R.string.medium_size)); + sizeList.add(getString(R.string.big_size)); + + list.add(SHAPE_CIRCLE_FULL); + list.add(SHAPE_CIRCLE_EMPTY); + list.add(SHAPE_SQUARE_FULL); + list.add(SHAPE_SQUARE_EMPTY); + list.add(SHAPE_TRIANGLE_UP_FULL); + list.add(SHAPE_TRIANGLE_UP_EMPTY); + list.add(SHAPE_TRIANGLE_DOWN_FULL); + list.add(SHAPE_TRIANGLE_DOWN_EMPTY); + list.add(SHAPE_RHOMBUS_FULL); + list.add(SHAPE_RHOMBUS_EMPTY); + list.add(SHAPE_ROUNDED_FIVE_STAR); + list.add(SHAPE_STRAIGHT_FIVE_STAR); + list.add(SHAPE_CENTER_CIRCLE); + + codeStyleIndex = codeStyleIndexPoint; + + break; + + case SHAPE_TYPE_LINE: + + sizeList.add(getString(R.string.thin_size)); + sizeList.add(getString(R.string.medium_size)); + sizeList.add(getString(R.string.coarse_size)); + + list.add(0); + list.add(1); + list.add(2); + list.add(3); + + codeStyleIndex = codeStyleIndexLine; + + break; + } + + adapter = new CodeStyleAdapter(CodeStylePointLineActivity.this, codeStyleIndex, list, codeShapeType,codeShapeColor, codeShapeSizeIndex); + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(CodeStylePointLineActivity.this); + linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); + binding.recyclerView.setLayoutManager(linearLayoutManager); + binding.recyclerView.setAdapter(adapter); + adapter.setOnItemClickListener(new CodeStyleAdapter.OnItemClickListener() { + @Override + public void onItemClickListener(int position) { + switch (codeShapeType){ + case SHAPE_TYPE_POINT: + codeStyleIndexPoint = position; + break; + case SHAPE_TYPE_LINE: + codeStyleIndexLine = position; + break; + } + adapter.setSelectedPosition(position); + } + }); + + binding.tvSize.setText(sizeList.get(codeShapeSizeIndex)); + + binding.rlSize.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + CustomRecycleDialog.showDialog(CodeStylePointLineActivity.this, R.string.choose_instrument_type, sizeList, codeShapeSizeIndex, false, new CustomRecycleDialog.IClickCallback() { + @Override + public void onItemSelected(int index, String itemString) { + codeShapeSizeIndex = index; + binding.tvSize.setText(sizeList.get(index)); + adapter.setShapeSize(list,index); + } + }); + } + }); + + binding.styleCodeBtnConfirm.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(); + intent.putExtra(ConstUtils.intentConst.keyCodeStyleIndexPoint, codeStyleIndexPoint); + intent.putExtra(ConstUtils.intentConst.keyCodeStyleIndexLine, codeStyleIndexLine); + intent.putExtra(ConstUtils.intentConst.keyCodeShapeSize, codeShapeSizeIndex); + setResult(LauncherEvent.launcher_code_style,intent); + finish(); + } + }); + } + + private static String CODE_SHAPE_TYPE = "codeShapeType"; + private static String CODE_SHAPE_COLOR = "codeShapeColor"; + private static String CODE_SHAPE_SIZE = "codeShapeSize"; + private static String CODE_STYLE_INDEX_POINT = "codeStyleIndexPoint"; + private static String CODE_STYLE_INDEX_LINE = "codeStyleIndexLine"; + + public static void start(ActivityResultLauncher launcher, Context context,int codeShapeType, int codeShapeColor,int codeShapeSize,int codeStyleIndexPoint,int codeStyleIndexLine){ + Intent intent = new Intent(context, CodeStylePointLineActivity.class); + intent.putExtra(CODE_SHAPE_TYPE,codeShapeType); + intent.putExtra(CODE_SHAPE_COLOR,codeShapeColor); + intent.putExtra(CODE_SHAPE_SIZE,codeShapeSize); + intent.putExtra(CODE_STYLE_INDEX_POINT,codeStyleIndexPoint); + intent.putExtra(CODE_STYLE_INDEX_LINE,codeStyleIndexLine); + launcher.launch(intent); + } +} diff --git a/app/src/main/java/com/project/survey/ui/pointmeasure/measure/ControlRecordListActivity.java b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/ControlRecordListActivity.java new file mode 100644 index 0000000..4ea0cef --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/ControlRecordListActivity.java @@ -0,0 +1,52 @@ +package com.project.survey.ui.pointmeasure.measure; + +import android.content.Context; +import android.content.Intent; +import android.view.View; + +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.project.survey.R; +import com.project.survey.databinding.ActivityControlRecordListBinding; +import com.project.survey.model.ControlRecord; +import com.project.survey.ui.base.BaseSurveyNewActivity; +import com.project.survey.ui.pointmeasure.measure.adapter.ControlRecordListAdapter; + +import java.io.Serializable; +import java.util.List; + +public class ControlRecordListActivity extends BaseSurveyNewActivity { + + private ActivityControlRecordListBinding binding; + + @Override + public View getContentView() { + binding = ActivityControlRecordListBinding.inflate(getLayoutInflater()); + return binding.getRoot(); + } + + @Override + protected void initView() { + setTitle(getString(R.string.record_list)); + } + + @Override + protected void initData() { + ControlRecordListAdapter adapter = new ControlRecordListAdapter(ControlRecordListActivity.this, (List) getIntent().getSerializableExtra(POINT_INFO)); + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(ControlRecordListActivity.this); + linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); + binding.recyclerView.setLayoutManager(linearLayoutManager); + binding.recyclerView.setAdapter(adapter); + binding.recyclerView.setItemAnimator(new DefaultItemAnimator()); + } + + + private static String POINT_INFO = "control_point_list_info"; + + public static void start(Context context, List pointList){ + Intent intent = new Intent(context, ControlRecordListActivity.class); + intent.putExtra(POINT_INFO, (Serializable) pointList); + context.startActivity(intent); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/ui/pointmeasure/measure/PickerColorActivity.java b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/PickerColorActivity.java new file mode 100644 index 0000000..b2a0691 --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/PickerColorActivity.java @@ -0,0 +1,107 @@ +package com.project.survey.ui.pointmeasure.measure; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Color; +import android.view.View; + +import androidx.activity.result.ActivityResultLauncher; + +import com.bingce.surveyor.util.ConstUtils; + +import com.bingce.utils.IntentUtil; +import com.project.survey.R; +import com.project.survey.databinding.ActivityPickerColorBinding; +import com.project.survey.ui.base.BaseSurveyNewActivity; +import com.project.survey.ui.instrument.setupstation.LauncherEvent; +import com.project.survey.util.DrawableUtils; +import com.shixia.colorpickerview.OnColorChangeListener; + + +public class PickerColorActivity extends BaseSurveyNewActivity { + + private ActivityPickerColorBinding binding; + private int selectColor; + + @Override + public View getContentView() { + binding = ActivityPickerColorBinding.inflate(getLayoutInflater()); + return binding.getRoot(); + } + + @Override + protected void initView() { + setTitle(getString(R.string.picker_color)); + + binding.pickerCodeBtnConfirm.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(); + intent.putExtra(ConstUtils.intentConst.keyAddCodeColor, selectColor); + setResult(LauncherEvent.launcher_add_code_color,intent); + finish(); + } + }); + + int defultColor = IntentUtil.intExtra(getIntent(), DEFULT_COLOR); + selectColor = defultColor; + binding.ivCodeColorPalette.setImageDrawable(DrawableUtils.tintModifyColorDrawable(getDrawable(R.drawable.icon_code_color_palette),defultColor)); + + binding.cpvColor.setOnColorChangeListener(new OnColorChangeListener() { + @Override + public void colorChanged(int color) { + selectColor = color; + binding.ivCodeColorPalette.setImageDrawable(DrawableUtils.tintModifyColorDrawable(getDrawable(R.drawable.icon_code_color_palette),color)); + + binding.tvColorRgb.setText("R:" + Color.red(color) + " G:" + Color.green(color) + " B:" + Color.blue(color)); + binding.tvColorXml.setText(toHexEncoding(color,false)); + binding.tvColorXml16.setText(toHexEncoding(color,true)); + + binding.tvColorRgb.setTextColor(color); + binding.tvColorXml.setTextColor(color); + binding.tvColorXml16.setTextColor(color); + } + }); + } + + /** + * 获取十进制和十六进制色值 + * @param color + * @param isXml16 是否获取16进制 + * @return + */ + public static String toHexEncoding(int color,boolean isXml16) { + String A, R, G, B; + StringBuilder sb = new StringBuilder(); + A = Integer.toHexString(Color.alpha(color)); + R = Integer.toHexString(Color.red(color)); + G = Integer.toHexString(Color.green(color)); + B = Integer.toHexString(Color.blue(color)); + //判断获取到的A,R,G,B值的长度 如果长度等于1 给A,R,G,B值的前边添0 + A = A.length() == 1 ? "0" + A : A; + R = R.length() == 1 ? "0" + R : R; + G = G.length() == 1 ? "0" + G : G; + B = B.length() == 1 ? "0" + B : B; + sb.append("#"); + if (isXml16){ + sb.append(A); + } + sb.append(R); + sb.append(G); + sb.append(B); + return sb.toString(); + } + + @Override + protected void initData() { + + } + + private static String DEFULT_COLOR = "defultColor"; + + public static void start(ActivityResultLauncher launcher,Context context,int defultColor){ + Intent intent = new Intent(context, PickerColorActivity.class); + intent.putExtra(DEFULT_COLOR,defultColor); + launcher.launch(intent); + } +} diff --git a/app/src/main/java/com/project/survey/ui/pointmeasure/measure/PointSurveyNewActivity.java b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/PointSurveyNewActivity.java index c85ec2e..530531b 100644 --- a/app/src/main/java/com/project/survey/ui/pointmeasure/measure/PointSurveyNewActivity.java +++ b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/PointSurveyNewActivity.java @@ -7,6 +7,7 @@ import static com.bingce.surveyor.util.ConstUtils.pointConst.POINT_TYPE_DX; import static com.bingce.surveyor.util.ConstUtils.pointConst.POINT_TYPE_KS; import static com.bingce.surveyor.util.ConstUtils.pointConst.POINT_TYPE_KZ; import static com.bingce.surveyor.util.ConstUtils.pointConst.POINT_TYPE_LX; +import static com.project.survey.util.DrawableUtils.RADIUS_TOP; import android.annotation.SuppressLint; import android.app.Activity; @@ -57,32 +58,41 @@ import com.bingce.device.util.DeviceUtils; import com.bingce.error.BingCeErrorCode; import com.bingce.rtk.gnss.Gnss; import com.bingce.rtk.model.GnssPosition; - import com.bingce.surveyor.agentweb.HelpWebActivity; - - import com.bingce.surveyor.util.ConstUtils; import com.bingce.surveyor.util.DeviceConnectUtil; - import com.bingce.surveyor.util.PreferencesUtil; import com.bingce.surveyor.util.SurveyRemarksUtils; -import com.bingce.surveyor.util.SurveyToolBarClickListenerUtils; -import com.bingce.surveyor.util.SurveyUIUtils; import com.bingce.surveyor.util.dialog.CustomDialog; - import com.bingce.surveyor.util.dialog.CustomRecycleDialog; - import com.bingce.totalstation.TsConfig; import com.bingce.utils.ColorUtil; import com.bingce.utils.IntentUtil; import com.bingce.utils.PointUtils; - import com.bingce.utils.SoundPoolUtil; import com.bingce.utils.ThreadPoolUtil; import com.bingce.utils.Util; +import com.project.survey.App; +import com.project.survey.R; import com.project.survey.databinding.ActivityPointSurveyNewBinding; import com.project.survey.dialog.CustomLineChartDialog; +import com.project.survey.model.ControlRecord; import com.project.survey.ui.base.BaseSurveyNewActivity; +import com.project.survey.ui.instrument.setupstation.CoordinatePointsLibraryActivity; +import com.project.survey.ui.instrument.setupstation.LauncherEvent; +import com.project.survey.ui.pointmeasure.measure.util.SFUtils; +import com.project.survey.ui.pointmeasure.measure.util.SurveyToolBarClickListenerUtils; +import com.project.survey.util.CommonUtils; +import com.project.survey.util.DrawableUtils; +import com.project.survey.util.SurveyUIUtils; +import com.project.survey.widget.bingce.dragdrop.DefaultItemCallback; +import com.project.survey.widget.bingce.dragdrop.DefaultItemTouchHelper; +import com.project.survey.widget.bingce.dragdrop.FunctionAdapter; +import com.project.survey.widget.bingce.dragdrop.FunctionBlockAdapter; +import com.project.survey.widget.bingce.dragdrop.FunctionItem; +import com.project.survey.widget.bingce.dragdrop.FunctionItemID; +import com.project.survey.widget.bingce.dragdrop.SpaceItemDecoration; +import com.project.survey.widget.bingce.gaode.GaoDeBottomSheetBehavior; import java.util.ArrayList; import java.util.List; @@ -90,9 +100,11 @@ import java.util.Objects; import blankj.utilcode.util.ToastUtils; import blankj.utilcode.util.Utils; - import cn.liuyanbing.surveyor.model.base.BasePoint; import lecho.hellocharts.model.Line; +import lecho.hellocharts.model.LineChartData; +import lecho.hellocharts.model.PointValue; +import lecho.hellocharts.renderer.LineChartRenderer; public class PointSurveyNewActivity extends BaseSurveyNewActivity implements View.OnClickListener { @@ -136,7 +148,6 @@ public class PointSurveyNewActivity extends BaseSurveyNewActivity implements Vie @SuppressLint("SetTextI18n") @Override protected void initView() { - if (((App) Utils.getApp()).isThemeDark) { binding.topLayout.setBackgroundColor(getResources().getColor(R.color.theme_dark_black)); binding.layoutPoleHrHeight.tvPoleHrHeight.setTextColor(getColor(R.color.white)); @@ -521,17 +532,17 @@ public class PointSurveyNewActivity extends BaseSurveyNewActivity implements Vie } //formatDouble2Double防止四舍五入误差 - if (Util.formatDouble2Double(gnssPosition.getHrms(), ((App) Utils.getApp()).notNumber()) > rtkHrmsLimitValue) { + if (Util.formatDouble2Double(gnssPosition.getHrms(), 6) > rtkHrmsLimitValue) { indexNum = indexNum + 1; - stringBuilder.append("\n").append(indexNum).append(".").append(getString(R.string.limiting_conditions)).append(getString(R.string.colon)).append("HRMS ≤ ").append(rtkHrmsLimitValue).append(",").append(getString(R.string.current)).append(getString(R.string.colon)).append(Util.formatDouble2Double(gnssPosition.getHrms(), ((App) Utils.getApp()).notNumber())); + stringBuilder.append("\n").append(indexNum).append(".").append(getString(R.string.limiting_conditions)).append(getString(R.string.colon)).append("HRMS ≤ ").append(rtkHrmsLimitValue).append(",").append(getString(R.string.current)).append(getString(R.string.colon)).append(Util.formatDouble2Double(gnssPosition.getHrms(), 6)); } - if (Util.formatDouble2Double(gnssPosition.getVrms(), ((App) Utils.getApp()).notNumber()) > rtkVrmsLimitValue) { + if (Util.formatDouble2Double(gnssPosition.getVrms(), 6) > rtkVrmsLimitValue) { indexNum = indexNum + 1; - stringBuilder.append("\n").append(indexNum).append(".").append(getString(R.string.limiting_conditions)).append(getString(R.string.colon)).append("VRMS ≤ ").append(rtkVrmsLimitValue).append(",").append(getString(R.string.current)).append(getString(R.string.colon)).append(Util.formatDouble2Double(gnssPosition.getVrms(), ((App) Utils.getApp()).notNumber())); + stringBuilder.append("\n").append(indexNum).append(".").append(getString(R.string.limiting_conditions)).append(getString(R.string.colon)).append("VRMS ≤ ").append(rtkVrmsLimitValue).append(",").append(getString(R.string.current)).append(getString(R.string.colon)).append(Util.formatDouble2Double(gnssPosition.getVrms(), 6)); } - if (Util.formatDouble2Double(gnssPosition.getPdop(), ((App) Utils.getApp()).notNumber()) > rtkPdopLimitValue) { + if (Util.formatDouble2Double(gnssPosition.getPdop(), 6) > rtkPdopLimitValue) { indexNum = indexNum + 1; - stringBuilder.append("\n").append(indexNum).append(".").append(getString(R.string.limiting_conditions)).append(getString(R.string.colon)).append("PDOP ≤ ").append(rtkPdopLimitValue).append(",").append(getString(R.string.current)).append(getString(R.string.colon)).append(Util.formatDouble2Double(gnssPosition.getPdop(), ((App) Utils.getApp()).notNumber())); + stringBuilder.append("\n").append(indexNum).append(".").append(getString(R.string.limiting_conditions)).append(getString(R.string.colon)).append("PDOP ≤ ").append(rtkPdopLimitValue).append(",").append(getString(R.string.current)).append(getString(R.string.colon)).append(Util.formatDouble2Double(gnssPosition.getPdop(), 6)); } if (gnssPosition.getDiffAge() > rtkDiffAgeLimitValue) { indexNum = indexNum + 1; @@ -877,17 +888,17 @@ public class PointSurveyNewActivity extends BaseSurveyNewActivity implements Vie switch (Integer.parseInt(id)) { case FunctionItemID.POINT_SURVEY_ID.SURVEY_X_ID: if (coordinate != null) { - info = Util.formatDouble2String(coordinate.getX(), ((App) Utils.getApp()).notNumber()); + info = Util.formatDouble2String(coordinate.getX(), 6); } break; case FunctionItemID.POINT_SURVEY_ID.SURVEY_Y_ID: if (coordinate != null) { - info = Util.formatDouble2String(coordinate.getY(), ((App) Utils.getApp()).notNumber()); + info = Util.formatDouble2String(coordinate.getY(), 6); } break; case FunctionItemID.POINT_SURVEY_ID.SURVEY_Z_ID: if (coordinate != null) { - info = Util.formatDouble2String(coordinate.getZ(), ((App) Utils.getApp()).notNumber()); + info = Util.formatDouble2String(coordinate.getZ(), 6); } break; case FunctionItemID.POINT_SURVEY_ID.SURVEY_LAT_ID: @@ -906,7 +917,7 @@ public class PointSurveyNewActivity extends BaseSurveyNewActivity implements Vie break; case FunctionItemID.POINT_SURVEY_ID.SURVEY_ALT_ID: if (blh != null) { - info = Util.formatDouble2String(blh.getAltitude(), ((App) Utils.getApp()).notNumber()) + "m"; + info = Util.formatDouble2String(blh.getAltitude(), 6) + "m"; } else { info = "*"; } @@ -920,7 +931,7 @@ public class PointSurveyNewActivity extends BaseSurveyNewActivity implements Vie break; case FunctionItemID.POINT_SURVEY_ID.SURVEY_SIT_DISTANCE_ID: if (GnssPosition.getInstance().getBaseInfo().isReceivedBase()) { - info = CoordUtil.formatDouble2String(GnssPosition.getInstance().baseInfo.getDistanceToBase(), ((App) Utils.getApp()).notNumber()) + "m"; + info = CoordUtil.formatDouble2String(GnssPosition.getInstance().baseInfo.getDistanceToBase(), 6) + "m"; } else { info = getString(R.string.base_info_not_received); } @@ -933,7 +944,7 @@ public class PointSurveyNewActivity extends BaseSurveyNewActivity implements Vie double distance = PointUtils.getDistance2D(new BasePoint(coordinate.getX(), coordinate.getY()), new BasePoint(lastRTKBackSurveyPoint.getX(), lastRTKBackSurveyPoint.getY())); double currdTime = System.currentTimeMillis(); double time = (currdTime - lastTimeStamp) / 1000; - info = Util.formatDouble2String(distance / time, ((App) Utils.getApp()).notNumber()); + info = Util.formatDouble2String(distance / time, 6); } } break; @@ -943,7 +954,7 @@ public class PointSurveyNewActivity extends BaseSurveyNewActivity implements Vie } else { if (coordinate != null) { float mTargetAzimuth = (float) Math.toDegrees(PointUtils.getDirectionDegrees(new BasePoint(coordinate.getX(), coordinate.getY()), new BasePoint(lastRTKBackSurveyPoint.getX(), lastRTKBackSurveyPoint.getY()))); - info = Util.radianToDmsString(Math.toRadians(mTargetAzimuth), ((App) Utils.getApp()).notNumber(), true); + info = Util.radianToDmsString(Math.toRadians(mTargetAzimuth), 6, true); } } break; @@ -952,7 +963,7 @@ public class PointSurveyNewActivity extends BaseSurveyNewActivity implements Vie if (coordinate != null) { PointRecord pointSurveyData = surveyBaseRecordPointList.get(surveyBaseRecordPointList.size() - 1); double distance2D = PointUtils.getDistance2D(new BasePoint(pointSurveyData.x, pointSurveyData.y), new BasePoint(coordinate.getX(), coordinate.getY())); - info = Util.formatDouble2String(distance2D, ((App) Utils.getApp()).notNumber()) + "m"; + info = Util.formatDouble2String(distance2D, 6) + "m"; } } else { info = "*"; @@ -963,7 +974,7 @@ public class PointSurveyNewActivity extends BaseSurveyNewActivity implements Vie if (coordinate != null) { PointRecord pointSurveyData = surveyBaseRecordPointList.get(surveyBaseRecordPointList.size() - 1); double distance3D = PointUtils.getDistance3D(new BasePoint(pointSurveyData.x, pointSurveyData.y, pointSurveyData.h), new BasePoint(coordinate.getX(), coordinate.getY(), coordinate.getZ())); - info = Util.formatDouble2String(distance3D, ((App) Utils.getApp()).notNumber()) + "m"; + info = Util.formatDouble2String(distance3D, 6) + "m"; } } else { info = "*"; @@ -989,7 +1000,7 @@ public class PointSurveyNewActivity extends BaseSurveyNewActivity implements Vie } } } - return Util.formatDouble2Double(total_distance_2d, ((App) Utils.getApp()).notNumber()); + return Util.formatDouble2Double(total_distance_2d, 6); } private double getAccumulat3D() { @@ -1002,7 +1013,7 @@ public class PointSurveyNewActivity extends BaseSurveyNewActivity implements Vie } } } - return Util.formatDouble2Double(total_distance_3d, ((App) Utils.getApp()).notNumber()); + return Util.formatDouble2Double(total_distance_3d, 6); } /** @@ -1027,7 +1038,6 @@ public class PointSurveyNewActivity extends BaseSurveyNewActivity implements Vie if (result.getData() == null) { return; } - ; String applyCodeId = result.getData().getStringExtra(ConstUtils.intentConst.keyApplyIndexCodeRecord); getCodeDb(applyCodeId); break; diff --git a/app/src/main/java/com/project/survey/ui/pointmeasure/measure/PointSurveySettingActivity.java b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/PointSurveySettingActivity.java new file mode 100644 index 0000000..fb36c75 --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/PointSurveySettingActivity.java @@ -0,0 +1,559 @@ +package com.project.survey.ui.pointmeasure.measure; + +import static com.bingce.surveyor.util.ConstUtils.pointConst.POINT_TYPE_DX; +import static com.bingce.surveyor.util.ConstUtils.pointConst.POINT_TYPE_KS; +import static com.bingce.surveyor.util.ConstUtils.pointConst.POINT_TYPE_KZ; +import static com.bingce.surveyor.util.ConstUtils.pointConst.POINT_TYPE_LX; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.view.View; +import android.widget.CompoundButton; + +import com.bingce.device.Device; +import com.bingce.device.enums.DeviceTypeEnum; +import com.bingce.surveyor.util.ConstUtils; +import com.bingce.surveyor.util.PreferencesUtil; +import com.bingce.surveyor.util.dialog.CustomRecycleDialog; +import com.bingce.utils.IntentUtil; +import com.bingce.utils.Util; +import com.project.survey.R; +import com.project.survey.databinding.ActivityPointSurveySettingBinding; +import com.project.survey.ui.base.BaseSurveyNewActivity; + +import java.util.ArrayList; +import java.util.List; + +public class PointSurveySettingActivity extends BaseSurveyNewActivity { + private ActivityPointSurveySettingBinding binding; + private int limitHrmsIndex = -1; + private int limitVrmsIndex = -1; + private int limitPdopIndex = -1; + private int limitAgeIndex = -1; + private int limitAddStepNameIndex = -1; + private int limitSmoothPointNumberIndex = -1; + private int limitSmoothPointNumberIndexDx = -1; + private int limitContinueTimeIntervalIndex = -1; + private int limitContinueDistanceIntervalIndex = -1; + private int pointType; + private String pointTypeName; + private int limitStatusIndex; + private float limitHrmsValue,limitVrmsValue,pdopLimitValue,ageLimitValue; + + @Override + public View getContentView() { + binding = ActivityPointSurveySettingBinding.inflate(getLayoutInflater()); + return binding.getRoot(); + } + + @Override + protected void initView() { + pointType = IntentUtil.intExtra(getIntent(),POINT_TYPE); + } + + @Override + protected void initData() { + + boolean isOnlyCommLimit = IntentUtil.boolExtra(getIntent(), IS_ONLY_COMM_LIMIT); + + if (Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_TS) { + setTitle(getString(R.string.ts_survey_setting)); + if (isOnlyCommLimit) { + binding.llLayoutSetting.setVisibility(View.GONE); + } else { + binding.rlStatusLimit.setVisibility(View.GONE); + binding.llHvpd.setVisibility(View.GONE); + binding.rlSmoothPointNumberLimit.setVisibility(View.GONE); + binding.rlContinueSurveyTimeInterval.setVisibility(View.GONE); + binding.rlContinueSurveyDistanceInterval.setVisibility(View.GONE); + binding.lineSmoothPointNumber.setVisibility(View.GONE); + binding.lineContinueSurveyTimeInterval.setVisibility(View.GONE); + binding.lineContinueSurveyDistanceInterval.setVisibility(View.GONE); + } + } else { + if (pointType == POINT_TYPE_DX){ + pointTypeName = getString(R.string.topographic_point); + binding.rlSmoothPointNumberLimit.setVisibility(View.VISIBLE); + binding.rlContinueSurveyTimeInterval.setVisibility(View.GONE); + binding.rlContinueSurveyDistanceInterval.setVisibility(View.GONE); + binding.lineSmoothPointNumber.setVisibility(View.VISIBLE); + binding.lineContinueSurveyTimeInterval.setVisibility(View.GONE); + binding.lineContinueSurveyDistanceInterval.setVisibility(View.GONE); + } else if (pointType == POINT_TYPE_KS) { + pointTypeName = getString(R.string.quick_point); + if (isOnlyCommLimit) { + binding.llSpecialtySetting.setVisibility(View.GONE); + } else { + binding.rlSmoothPointNumberLimit.setVisibility(View.GONE); + binding.rlContinueSurveyTimeInterval.setVisibility(View.GONE); + binding.rlContinueSurveyDistanceInterval.setVisibility(View.GONE); + binding.lineSmoothPointNumber.setVisibility(View.GONE); + binding.lineContinueSurveyTimeInterval.setVisibility(View.GONE); + binding.lineContinueSurveyDistanceInterval.setVisibility(View.GONE); + } + }else if (pointType == POINT_TYPE_KZ){ + if (isOnlyCommLimit) { + binding.llSpecialtySetting.setVisibility(View.GONE); + } else { + pointTypeName = getString(R.string.control_point); + binding.rlSmoothPointNumberLimit.setVisibility(View.VISIBLE); + binding.rlContinueSurveyTimeInterval.setVisibility(View.GONE); + binding.rlContinueSurveyDistanceInterval.setVisibility(View.GONE); + binding.lineSmoothPointNumber.setVisibility(View.VISIBLE); + binding.lineContinueSurveyTimeInterval.setVisibility(View.GONE); + binding.lineContinueSurveyDistanceInterval.setVisibility(View.GONE); + } + }else if (pointType == POINT_TYPE_LX){ + if (isOnlyCommLimit) { + binding.llSpecialtySetting.setVisibility(View.GONE); + } else { + pointTypeName = getString(R.string.continuity_point); + binding.rlSmoothPointNumberLimit.setVisibility(View.GONE); + binding.rlContinueSurveyTimeInterval.setVisibility(View.VISIBLE); + binding.rlContinueSurveyDistanceInterval.setVisibility(View.VISIBLE); + binding.lineSmoothPointNumber.setVisibility(View.GONE); + binding.lineContinueSurveyTimeInterval.setVisibility(View.VISIBLE); + binding.lineContinueSurveyDistanceInterval.setVisibility(View.VISIBLE); + } + } + setTitle(getString(R.string.rtk_survey) + " - " + pointTypeName + getString(R.string.settings)); + } + + limitStatus(); + limitHrms(); + limitVrms(); + limitPdop(); + limitAge(); + allowRepeatName(); + limitAddStepName(); + if (pointType == POINT_TYPE_KZ){ + limitSmoothPointNumberKZ(); + }else if (pointType == POINT_TYPE_DX){ + limitSmoothPointNumberDX(); + } + limitContinueTimeInterval(); + limitContinueDistanceInterval(); + } + + /** + * 状态解 + */ + private void limitStatus() { + List limitStatusList = new ArrayList<>(); + limitStatusList.add(getString(R.string.rtk_state_fixed)); + limitStatusList.add(getString(R.string.rtk_state_diff_3D)); + limitStatusList.add(getString(R.string.rtk_state_float)); + limitStatusList.add(getString(R.string.rtk_state_single)); + if (pointType == POINT_TYPE_DX){ + limitStatusIndex = PreferencesUtil.getPreferenceInt(ConstUtils.preferConst.rtkStatusLimitTopographicPointIndex,0); + } else if (pointType == POINT_TYPE_KS) { + limitStatusIndex = PreferencesUtil.getPreferenceInt(ConstUtils.preferConst.rtkStatusLimitQuickPointIndex,0); + }else if (pointType == POINT_TYPE_KZ){ + limitStatusIndex = PreferencesUtil.getPreferenceInt(ConstUtils.preferConst.rtkStatusLimitControlPointIndex,0); + }else if (pointType == POINT_TYPE_LX){ + limitStatusIndex = PreferencesUtil.getPreferenceInt(ConstUtils.preferConst.rtkStatusLimitContinuityPointIndex,0); + } + binding.tvStatusLimit.setText(limitStatusList.get(limitStatusIndex)); + binding.rlStatusLimit.setOnClickListener(view -> CustomRecycleDialog.showDialog(PointSurveySettingActivity.this, R.string.solution_status_limit, limitStatusList, limitStatusIndex, false, (index, itemString) -> { + limitStatusIndex = index; + binding.tvStatusLimit.setText(limitStatusList.get(index)); + if (pointType == POINT_TYPE_DX){ + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkStatusLimitTopographicPointIndex, index); + } else if (pointType == POINT_TYPE_KS) { + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkStatusLimitQuickPointIndex, index); + }else if (pointType == POINT_TYPE_KZ){ + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkStatusLimitControlPointIndex, index); + }else if (pointType == POINT_TYPE_LX){ + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkStatusLimitContinuityPointIndex, index); + } + })); + } + + /** + * Hrms + */ + @SuppressLint("SetTextI18n") + private void limitHrms() { + List limitHrmsList = new ArrayList<>(); + limitHrmsList.add("0.05"); + limitHrmsList.add("0.10"); + limitHrmsList.add("0.20"); + limitHrmsList.add("0.30"); + + if (pointType == POINT_TYPE_DX){ + limitHrmsValue = PreferencesUtil.getPreferenceFloat(ConstUtils.preferConst.rtkHrmsLimitTopographicPointValue,0.05f); + } else if (pointType == POINT_TYPE_KS) { + limitHrmsValue = PreferencesUtil.getPreferenceFloat(ConstUtils.preferConst.rtkHrmsLimitQuickPointValue,0.20f); + }else if (pointType == POINT_TYPE_KZ){ + limitHrmsValue = PreferencesUtil.getPreferenceFloat(ConstUtils.preferConst.rtkHrmsLimitControlPointValue,0.05f); + }else if (pointType == POINT_TYPE_LX){ + limitHrmsValue = PreferencesUtil.getPreferenceFloat(ConstUtils.preferConst.rtkHrmsLimitContinuityPointIValue,0.05f); + } + for (int i = 0; i < limitHrmsList.size(); i++) { + if (limitHrmsValue == Float.parseFloat(limitHrmsList.get(i))){ + limitHrmsIndex = i; + } + } + binding.tvHrmsLimit.setText(limitHrmsValue + getString(R.string.meter)); + binding.rlHrmsLimit.setOnClickListener(view -> CustomRecycleDialog.showDialog(PointSurveySettingActivity.this, R.string.hrms_limit, limitHrmsList, limitHrmsIndex, CustomRecycleDialog.Builder.INPUT_TYPE_DECIMAL,true, Util.formatDouble2StringDotAuto(limitHrmsValue), new CustomRecycleDialog.IClickCallback() { + @Override + public void onItemSelected(int index, String itemString) { + limitHrmsIndex = index; + if (index != -1){ + binding.tvHrmsLimit.setText(limitHrmsList.get(index) + getString(R.string.meter)); + limitHrmsValue = Float.parseFloat(limitHrmsList.get(index)); + }else { + binding.tvHrmsLimit.setText(itemString + getString(R.string.meter)); + limitHrmsValue = Float.parseFloat(itemString); + } + if (pointType == POINT_TYPE_DX){ + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkHrmsLimitTopographicPointValue, limitHrmsValue); + } else if (pointType == POINT_TYPE_KS) { + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkHrmsLimitQuickPointValue, limitHrmsValue); + }else if (pointType == POINT_TYPE_KZ){ + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkHrmsLimitControlPointValue, limitHrmsValue); + }else if (pointType == POINT_TYPE_LX){ + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkHrmsLimitContinuityPointIValue, limitHrmsValue); + } + } + })); + } + + /** + * Vrms + */ + @SuppressLint("SetTextI18n") + private void limitVrms() { + List limitVrmsList = new ArrayList<>(); + limitVrmsList.add("0.05"); + limitVrmsList.add("0.10"); + limitVrmsList.add("0.20"); + limitVrmsList.add("0.30"); + + if (pointType == POINT_TYPE_DX){ + limitVrmsValue = PreferencesUtil.getPreferenceFloat(ConstUtils.preferConst.rtkVrmsLimitTopographicPointValue,0.10f); + } else if (pointType == POINT_TYPE_KS) { + limitVrmsValue = PreferencesUtil.getPreferenceFloat(ConstUtils.preferConst.rtkVrmsLimitQuickPointValue,0.30f); + }else if (pointType == POINT_TYPE_KZ){ + limitVrmsValue = PreferencesUtil.getPreferenceFloat(ConstUtils.preferConst.rtkVrmsLimitControlPointValue,0.10f); + }else if (pointType == POINT_TYPE_LX){ + limitVrmsValue = PreferencesUtil.getPreferenceFloat(ConstUtils.preferConst.rtkVrmsLimitContinuityPointIValue,0.10f); + } + for (int i = 0; i < limitVrmsList.size(); i++) { + if (limitVrmsValue == Float.parseFloat(limitVrmsList.get(i))){ + limitVrmsIndex = i; + } + } + + binding.tvVrmsLimit.setText(limitVrmsValue + getString(R.string.meter)); + binding.rlVrmsLimit.setOnClickListener(new View.OnClickListener() { + @SuppressLint("SetTextI18n") + @Override + public void onClick(View view) { + CustomRecycleDialog.showDialog(PointSurveySettingActivity.this, R.string.vrms_limit, limitVrmsList, limitVrmsIndex, CustomRecycleDialog.Builder.INPUT_TYPE_DECIMAL,true,Util.formatDouble2StringDotAuto(limitVrmsValue), (index, itemString) -> { + limitVrmsIndex = index; + if (index != -1){ + binding.tvVrmsLimit.setText(limitVrmsList.get(index) + getString(R.string.meter)); + limitVrmsValue = Float.parseFloat(limitVrmsList.get(index)); + }else { + binding.tvVrmsLimit.setText(itemString + getString(R.string.meter)); + limitVrmsValue = Float.parseFloat(itemString); + } + if (pointType == POINT_TYPE_DX){ + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkVrmsLimitTopographicPointValue, limitVrmsValue); + } else if (pointType == POINT_TYPE_KS) { + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkVrmsLimitQuickPointValue, limitVrmsValue); + }else if (pointType == POINT_TYPE_KZ){ + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkVrmsLimitControlPointValue, limitVrmsValue); + }else if (pointType == POINT_TYPE_LX){ + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkVrmsLimitContinuityPointIValue, limitVrmsValue); + } + }); + } + }); + } + + /** + * Pdop + */ + private void limitPdop() { + List limitPdopList = new ArrayList<>(); + limitPdopList.add("5.00"); + limitPdopList.add("20.00"); + limitPdopList.add("50.00"); + limitPdopList.add("100.00"); + + if (pointType == POINT_TYPE_DX){ + pdopLimitValue = PreferencesUtil.getPreferenceFloat(ConstUtils.preferConst.rtkPdopLimitTopographicPointValue,5f); + } else if (pointType == POINT_TYPE_KS) { + pdopLimitValue = PreferencesUtil.getPreferenceFloat(ConstUtils.preferConst.rtkPdopLimitQuickPointValue,5f); + }else if (pointType == POINT_TYPE_KZ){ + pdopLimitValue = PreferencesUtil.getPreferenceFloat(ConstUtils.preferConst.rtkPdopLimitControlPointValue,5f); + }else if (pointType == POINT_TYPE_LX){ + pdopLimitValue = PreferencesUtil.getPreferenceFloat(ConstUtils.preferConst.rtkPdopLimitContinuityPointIValue,5f); + } + + for (int i = 0; i < limitPdopList.size(); i++) { + if (pdopLimitValue == Float.parseFloat(limitPdopList.get(i))){ + limitPdopIndex = i; + } + } + + binding.tvPdopLimit.setText(Util.formatDouble2StringDotAuto(pdopLimitValue)); + binding.rlPdopLimit.setOnClickListener(view -> CustomRecycleDialog.showDialog(PointSurveySettingActivity.this, R.string.pdop_limit, limitPdopList, limitPdopIndex, CustomRecycleDialog.Builder.INPUT_TYPE_DECIMAL,true, Util.formatDouble2StringDotAuto(pdopLimitValue), new CustomRecycleDialog.IClickCallback() { + @Override + public void onItemSelected(int index, String itemString) { + limitPdopIndex = index; + if (index != -1){ + binding.tvPdopLimit.setText(limitPdopList.get(index)); + pdopLimitValue = Float.parseFloat(limitPdopList.get(index)); + }else { + binding.tvPdopLimit.setText(itemString); + pdopLimitValue = Float.parseFloat(itemString); + } + if (pointType == POINT_TYPE_DX){ + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkPdopLimitTopographicPointValue, pdopLimitValue); + } else if (pointType == POINT_TYPE_KS) { + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkPdopLimitQuickPointValue, pdopLimitValue); + }else if (pointType == POINT_TYPE_KZ){ + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkPdopLimitControlPointValue, pdopLimitValue); + }else if (pointType == POINT_TYPE_LX){ + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkPdopLimitContinuityPointIValue, pdopLimitValue); + } + } + })); + } + + @SuppressLint("SetTextI18n") + private void limitAge() { + List limitAgeList = new ArrayList<>(); + limitAgeList.add("5"); + limitAgeList.add("10"); + limitAgeList.add("15"); + limitAgeList.add("25"); + + if (pointType == POINT_TYPE_DX){ + ageLimitValue = PreferencesUtil.getPreferenceFloat(ConstUtils.preferConst.rtkDiffAgeLimitTopographicPointValue,5f); + } else if (pointType == POINT_TYPE_KS) { + ageLimitValue = PreferencesUtil.getPreferenceFloat(ConstUtils.preferConst.rtkDiffAgeLimitQuickPointValue,10f); + }else if (pointType == POINT_TYPE_KZ){ + ageLimitValue = PreferencesUtil.getPreferenceFloat(ConstUtils.preferConst.rtkDiffAgeLimitControlPointValue,5f); + }else if (pointType == POINT_TYPE_LX){ + ageLimitValue = PreferencesUtil.getPreferenceFloat(ConstUtils.preferConst.rtkDiffAgeLimitContinuityPointIValue,5f); + } + + for (int i = 0; i < limitAgeList.size(); i++) { + if (ageLimitValue == Integer.parseInt(limitAgeList.get(i))){ + limitAgeIndex = i; + } + } + + binding.tvAgeLimit.setText(Util.formatDouble2StringDotAuto(ageLimitValue) + getString(R.string.sec)); + binding.rlAgeLimit.setOnClickListener(view -> CustomRecycleDialog.showDialog(PointSurveySettingActivity.this, R.string.diff_age_limit, limitAgeList, limitAgeIndex, CustomRecycleDialog.Builder.INPUT_TYPE_INTEGER,true,Util.formatDouble2StringDotAuto(ageLimitValue), new CustomRecycleDialog.IClickCallback() { + @SuppressLint("SetTextI18n") + @Override + public void onItemSelected(int index, String itemString) { + limitAgeIndex = index; + if (index != -1){ + binding.tvAgeLimit.setText(limitAgeList.get(index) + getString(R.string.sec)); + ageLimitValue = Integer.parseInt(limitAgeList.get(index)); + }else { + binding.tvAgeLimit.setText(itemString + getString(R.string.sec)); + ageLimitValue = Integer.parseInt(itemString); + } + if (pointType == POINT_TYPE_DX){ + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkDiffAgeLimitTopographicPointValue, ageLimitValue); + } else if (pointType == POINT_TYPE_KS) { + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkDiffAgeLimitQuickPointValue, ageLimitValue); + }else if (pointType == POINT_TYPE_KZ){ + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkDiffAgeLimitControlPointValue, ageLimitValue); + }else if (pointType == POINT_TYPE_LX){ + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkDiffAgeLimitContinuityPointIValue, ageLimitValue); + } + } + })); + } + + private void allowRepeatName() { + binding.switchAllowRepeatName.setChecked(Device.getInstance().rtkAllowRepeatName); + binding.switchAllowRepeatName.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { + Device.getInstance().rtkAllowRepeatName = isChecked; + Util.putPreference(ConstUtils.preferConst.rtkAllowRepeatName, Device.getInstance().rtkAllowRepeatName); + } + }); + } + + public void limitAddStepName(){ + List limitAddStepNameList = new ArrayList<>(); + limitAddStepNameList.add("1"); + limitAddStepNameList.add("2"); + limitAddStepNameList.add("5"); + limitAddStepNameList.add("10"); + for (int i = 0; i < limitAddStepNameList.size(); i++) { + if (Device.getInstance().rtkPointNameAddStep == Integer.parseInt(limitAddStepNameList.get(i))){ + limitAddStepNameIndex = i; + } + } + + binding.tvAddStepNameLimit.setText(String.valueOf(Device.getInstance().rtkPointNameAddStep)); + binding.rlAddStepNameLimit.setOnClickListener(view -> CustomRecycleDialog.showDialog(PointSurveySettingActivity.this, R.string.point_name_add_step, limitAddStepNameList, limitAddStepNameIndex, CustomRecycleDialog.Builder.INPUT_TYPE_INTEGER,true,Util.formatDouble2StringDotAuto(Device.getInstance().rtkPointNameAddStep), new CustomRecycleDialog.IClickCallback() { + @Override + public void onItemSelected(int index, String itemString) { + Device.getInstance().rtkPointNameAddStep = Integer.parseInt(itemString); + limitAddStepNameIndex = index; + if (index != -1){ + binding.tvAddStepNameLimit.setText(limitAddStepNameList.get(index)); + }else { + binding.tvAddStepNameLimit.setText(itemString); + } + Util.putPreference(ConstUtils.preferConst.rtkPointNameAddStep, Device.getInstance().rtkPointNameAddStep); + } + })); + } + + private void limitSmoothPointNumberKZ() { + List limitSmoothPointNumberList = new ArrayList<>(); + limitSmoothPointNumberList.add("1"); + limitSmoothPointNumberList.add("2"); + limitSmoothPointNumberList.add("5"); + limitSmoothPointNumberList.add("10"); + for (int i = 0; i < limitSmoothPointNumberList.size(); i++) { + if (Device.getInstance().rtkSmoothPointsNumber == Integer.parseInt(limitSmoothPointNumberList.get(i))){ + limitSmoothPointNumberIndex = i; + } + } + + binding.tvSmoothPointNumberLimit.setText(String.valueOf(Device.getInstance().rtkSmoothPointsNumber)); + binding.rlSmoothPointNumberLimit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + CustomRecycleDialog.showDialog(PointSurveySettingActivity.this, R.string.smooth_points_number, limitSmoothPointNumberList, limitSmoothPointNumberIndex, CustomRecycleDialog.Builder.INPUT_TYPE_INTEGER,true,Util.formatDouble2StringDotAuto(Device.getInstance().rtkSmoothPointsNumber), new CustomRecycleDialog.IClickCallback() { + @Override + public void onItemSelected(int index, String itemString) { + Device.getInstance().rtkSmoothPointsNumber = Integer.parseInt(itemString); + limitSmoothPointNumberIndex = index; + if (index != -1){ + binding.tvSmoothPointNumberLimit.setText(limitSmoothPointNumberList.get(index)); + }else { + binding.tvSmoothPointNumberLimit.setText(itemString); + } + Util.putPreference(ConstUtils.preferConst.rtkSmoothPointsNumber, Device.getInstance().rtkSmoothPointsNumber); + } + }); + } + }); + } + + private void limitSmoothPointNumberDX(){ + List limitSmoothPointNumberList = new ArrayList<>(); + limitSmoothPointNumberList.add("1"); + limitSmoothPointNumberList.add("2"); + limitSmoothPointNumberList.add("5"); + limitSmoothPointNumberList.add("10"); + for (int i = 0; i < limitSmoothPointNumberList.size(); i++) { + if (PreferencesUtil.getPreferenceInt(ConstUtils.preferConst.rtkSmoothPointsNumberTopographicPoint,5) == Integer.parseInt(limitSmoothPointNumberList.get(i))){ + limitSmoothPointNumberIndexDx = i; + } + } + binding.tvSmoothPointNumberLimit.setText(String.valueOf(PreferencesUtil.getPreferenceInt(ConstUtils.preferConst.rtkSmoothPointsNumberTopographicPoint,5))); + binding.rlSmoothPointNumberLimit.setOnClickListener(view -> CustomRecycleDialog.showDialog(PointSurveySettingActivity.this, R.string.smooth_points_number, limitSmoothPointNumberList, limitSmoothPointNumberIndexDx, CustomRecycleDialog.Builder.INPUT_TYPE_INTEGER,true,Util.formatDouble2StringDotAuto(PreferencesUtil.getPreferenceInt(ConstUtils.preferConst.rtkSmoothPointsNumberTopographicPoint,5)), new CustomRecycleDialog.IClickCallback() { + @Override + public void onItemSelected(int index, String itemString) { + limitSmoothPointNumberIndexDx = index; + if (index != -1){ + binding.tvSmoothPointNumberLimit.setText(limitSmoothPointNumberList.get(index)); + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkSmoothPointsNumberTopographicPoint, Integer.parseInt(limitSmoothPointNumberList.get(index))); + }else { + binding.tvSmoothPointNumberLimit.setText(itemString); + PreferencesUtil.putPreference(ConstUtils.preferConst.rtkSmoothPointsNumberTopographicPoint, Integer.parseInt(itemString)); + } + } + })); + } + + @SuppressLint("SetTextI18n") + private void limitContinueTimeInterval() { + List limitContinueTimeList = new ArrayList<>(); + limitContinueTimeList.add("1"); + limitContinueTimeList.add("2"); + limitContinueTimeList.add("5"); + limitContinueTimeList.add("10"); + for (int i = 0; i < limitContinueTimeList.size(); i++) { + if (Device.getInstance().rtkContinueTimeInterval == Integer.parseInt(limitContinueTimeList.get(i))){ + limitContinueTimeIntervalIndex = i; + } + } + + binding.tvContinueSurveyTimeInterval.setText(Device.getInstance().rtkContinueTimeInterval + getString(R.string.sec)); + binding.rlContinueSurveyTimeInterval.setOnClickListener(view -> CustomRecycleDialog.showDialog(PointSurveySettingActivity.this, R.string.continuous_survey_time_interval, limitContinueTimeList, limitContinueTimeIntervalIndex, CustomRecycleDialog.Builder.INPUT_TYPE_INTEGER,true,Util.formatDouble2StringDotAuto(Device.getInstance().rtkContinueTimeInterval), new CustomRecycleDialog.IClickCallback() { + @SuppressLint("SetTextI18n") + @Override + public void onItemSelected(int index, String itemString) { + Device.getInstance().rtkContinueTimeInterval = Integer.parseInt(itemString); + limitContinueTimeIntervalIndex = index; + if (index != -1){ + binding.tvContinueSurveyTimeInterval.setText(limitContinueTimeList.get(index) + getString(R.string.sec)); + }else { + binding.tvContinueSurveyTimeInterval.setText(itemString + getString(R.string.sec)); + } + Util.putPreference(ConstUtils.preferConst.rtkContinueTimeInterval, Device.getInstance().rtkContinueTimeInterval); + } + })); + } + + @SuppressLint("SetTextI18n") + private void limitContinueDistanceInterval() { + List limitContinueDistanceList = new ArrayList<>(); + limitContinueDistanceList.add("1.00"); + limitContinueDistanceList.add("2.00"); + limitContinueDistanceList.add("10.00"); + limitContinueDistanceList.add("50.00"); + for (int i = 0; i < limitContinueDistanceList.size(); i++) { + if (Device.getInstance().rtkContinueDistanceInterval == Double.parseDouble(limitContinueDistanceList.get(i))){ + limitContinueDistanceIntervalIndex = i; + } + } + + binding.tvContinueSurveyDistanceInterval.setText(Device.getInstance().rtkContinueDistanceInterval + getString(R.string.meter)); + binding.rlContinueSurveyDistanceInterval.setOnClickListener(view -> CustomRecycleDialog.showDialog(PointSurveySettingActivity.this, R.string.continuous_survey_distance_interval, limitContinueDistanceList, limitContinueDistanceIntervalIndex, CustomRecycleDialog.Builder.INPUT_TYPE_DECIMAL,true,Util.formatDouble2StringDotAuto(Device.getInstance().rtkContinueDistanceInterval), new CustomRecycleDialog.IClickCallback() { + @SuppressLint("SetTextI18n") + @Override + public void onItemSelected(int index, String itemString) { + Device.getInstance().rtkContinueDistanceInterval = Float.parseFloat(itemString); + limitContinueDistanceIntervalIndex = index; + if (index != -1){ + binding.tvContinueSurveyDistanceInterval.setText(limitContinueDistanceList.get(index) + getString(R.string.meter)); + }else { + binding.tvContinueSurveyDistanceInterval.setText(itemString + getString(R.string.meter)); + } + Util.putPreference(ConstUtils.preferConst.rtkContinueDistanceInterval, Device.getInstance().rtkContinueDistanceInterval); + } + })); + } + + private static final String POINT_TYPE = "pointType"; + private static final String IS_ONLY_COMM_LIMIT = "isOnlyCommLimit"; + + public static void start(Context context) { + start(context, POINT_TYPE_KS, false); + } + public static void start(Context context, int pointType) { + start(context, pointType, false); + } + + /** + * @param isOnlyCommLimit 是否只显示常规限制(状态限制、hrms限制、vrms限制、pdop限制、延迟限制) 默认为false + */ + public static void start(Context context, boolean isOnlyCommLimit){ + start(context, POINT_TYPE_KS, isOnlyCommLimit); + } + public static void start(Context context, int pointType, boolean isOnlyCommLimit){ + Intent intent = new Intent(context,PointSurveySettingActivity.class); + intent.putExtra(POINT_TYPE,pointType); + intent.putExtra(IS_ONLY_COMM_LIMIT,isOnlyCommLimit); + context.startActivity(intent); + } +} diff --git a/app/src/main/java/com/project/survey/ui/pointmeasure/measure/adapter/CodeLibraryAdapter.java b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/adapter/CodeLibraryAdapter.java new file mode 100644 index 0000000..75524f1 --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/adapter/CodeLibraryAdapter.java @@ -0,0 +1,136 @@ +package com.project.survey.ui.pointmeasure.measure.adapter; + +import static com.project.survey.ui.pointmeasure.measure.util.CodeConsUtils.SHAPE_TYPE_LINE; +import static com.project.survey.ui.pointmeasure.measure.util.CodeConsUtils.SHAPE_TYPE_POINT; +import static com.project.survey.ui.pointmeasure.measure.util.CodeConsUtils.SHAPE_TYPE_SURFACE; + +import android.content.Context; +import android.graphics.drawable.GradientDrawable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.data.surveyor.surveydata.code.CodeRecord; +import com.project.survey.R; +import com.project.survey.ui.pointmeasure.measure.util.CodeConsUtils; +import com.project.survey.util.CommonUtils; +import com.project.survey.util.DrawableUtils; + +import java.util.List; + + +public class CodeLibraryAdapter extends RecyclerView.Adapter { + + private Context context; + private List codeRecordList; + private int selectPosition; + private OnItemClickListener mOnItemClickListener; + + public CodeLibraryAdapter(Context context, List codeRecordList, int defaultPosition) { + this.context = context; + this.codeRecordList = codeRecordList; + this.selectPosition = defaultPosition; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + ViewHolder holder = new ViewHolder(LayoutInflater.from( + context).inflate(R.layout.layout_code_library_item, parent, + false)); + return holder; + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + holder.tv_code_name.setText(codeRecordList.get(position).codeName); + holder.tv_code.setText("[" + codeRecordList.get(position).code + "]"); + switch (codeRecordList.get(position).codeGroupType) { + case SHAPE_TYPE_POINT: + holder.poinView.setVisibility(View.VISIBLE); + holder.lineView.setVisibility(View.GONE); + holder.faceView.setVisibility(View.GONE); + holder.poinView.setImageDrawable(DrawableUtils.tintModifyColorDrawable(context.getDrawable(CodeConsUtils.showPointIcon(codeRecordList.get(position).codeFeatureShape)), codeRecordList.get(position).colorShape)); + break; + case SHAPE_TYPE_LINE: + holder.poinView.setVisibility(View.GONE); + holder.lineView.setVisibility(View.VISIBLE); + holder.faceView.setVisibility(View.GONE); + GradientDrawable gdLine = (GradientDrawable) holder.lineView.getBackground(); + gdLine.setStroke(CommonUtils.dip2px(1f), codeRecordList.get(position).colorShape, CommonUtils.dip2px(codeRecordList.get(position).codeFeatureShape + codeRecordList.get(position).codeFeatureShape * 2), CommonUtils.dip2px(codeRecordList.get(position).codeFeatureShape + codeRecordList.get(position).codeFeatureShape * 2)); + break; + case SHAPE_TYPE_SURFACE: + holder.poinView.setVisibility(View.GONE); + holder.lineView.setVisibility(View.GONE); + holder.faceView.setVisibility(View.VISIBLE); + GradientDrawable gdFace = (GradientDrawable) holder.faceView.getBackground(); + gdFace.setStroke(CommonUtils.dip2px(1f), codeRecordList.get(position).codeColorContour); + gdFace.setColor(codeRecordList.get(position).colorShape); + break; + } + + if (selectPosition == position) { + holder.iv_checkbox.setImageResource(R.mipmap.icon_checkbox_select_ovel); + holder.tv_code_name.setTextColor(context.getColor(R.color.theme_green)); + holder.tv_code.setTextColor(context.getColor(R.color.theme_green)); + } else { + holder.tv_code_name.setTextColor(context.getColor(R.color.color_575757)); + holder.tv_code.setTextColor(context.getColor(R.color.color_999999)); + holder.iv_checkbox.setImageResource(R.mipmap.icon_checkbox_unselect_ovel); + } + + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mOnItemClickListener.onItemClickListener(holder.getAdapterPosition()); + } + }); + } + + public void setData(List data) { + this.codeRecordList = data; + notifyDataSetChanged(); + } + + public void setSelectedPosition(int defaultPosition) { + this.selectPosition = defaultPosition; + notifyDataSetChanged(); + } + + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + this.mOnItemClickListener = onItemClickListener; + } + + public interface OnItemClickListener { + void onItemClickListener(int position); + } + + @Override + public int getItemCount() { + return codeRecordList == null ? 0 : codeRecordList.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + ImageView poinView, iv_checkbox; + View lineView; + TextView faceView, tv_code_name, tv_code; + RelativeLayout rl_item_view; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + rl_item_view = itemView.findViewById(R.id.rl_item_view); + poinView = itemView.findViewById(R.id.poinView); + lineView = itemView.findViewById(R.id.lineView); + faceView = itemView.findViewById(R.id.faceView); + tv_code_name = itemView.findViewById(R.id.tv_code_name); + tv_code = itemView.findViewById(R.id.tv_code); + iv_checkbox = itemView.findViewById(R.id.iv_checkbox); + } + } +} diff --git a/app/src/main/java/com/project/survey/ui/pointmeasure/measure/adapter/ControlRecordListAdapter.java b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/adapter/ControlRecordListAdapter.java new file mode 100644 index 0000000..57ce3e3 --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/adapter/ControlRecordListAdapter.java @@ -0,0 +1,68 @@ +package com.project.survey.ui.pointmeasure.measure.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.utils.Util; +import com.project.survey.R; +import com.project.survey.model.ControlRecord; + +import java.util.List; + +public class ControlRecordListAdapter extends RecyclerView.Adapter { + + private Context mContext; + private List list; + + public ControlRecordListAdapter(Context context, List list) { + this.mContext = context; + this.list = list; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.layout_control_record_item, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + holder.tv_point_name.setText(list.get(position).getPointName()); + if (position == 0) { + holder.tv_prompt.setText(mContext.getString(R.string.average_coordinates_calculation_way)); + } + holder.tv_x.setText("X:" + Util.formatDouble2String(list.get(position).getX(), 6)); + holder.tv_y.setText("Y:" + Util.formatDouble2String(list.get(position).getY(), 6)); + holder.tv_z.setText("Z:" + Util.formatDouble2String(list.get(position).getZ(), 6)); + holder.tv_latitude.setText(mContext.getString(R.string.latitude) + ":" + Util.formatDouble2String(list.get(position).getLatitude(), 6)); + holder.tv_longitude.setText(mContext.getString(R.string.longitude) + ":" + Util.formatDouble2String(list.get(position).getLongitude(), 6)); + holder.tv_altitude.setText(mContext.getString(R.string.altitude) + ":" + Util.formatDouble2String(list.get(position).getAltitude(), 6)); + } + + @Override + public int getItemCount() { + return list == null ? 0 : list.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + TextView tv_x, tv_y, tv_z, tv_latitude, tv_longitude, tv_altitude, tv_point_name, tv_prompt; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + tv_x = itemView.findViewById(R.id.tv_x); + tv_y = itemView.findViewById(R.id.tv_y); + tv_z = itemView.findViewById(R.id.tv_z); + tv_latitude = itemView.findViewById(R.id.tv_latitude); + tv_longitude = itemView.findViewById(R.id.tv_longitude); + tv_altitude = itemView.findViewById(R.id.tv_altitude); + tv_point_name = itemView.findViewById(R.id.tv_point_name); + tv_prompt = itemView.findViewById(R.id.tv_prompt); + } + } +} diff --git a/app/src/main/java/com/project/survey/ui/pointmeasure/measure/util/CodeConsUtils.java b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/util/CodeConsUtils.java new file mode 100644 index 0000000..374b916 --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/util/CodeConsUtils.java @@ -0,0 +1,72 @@ +package com.project.survey.ui.pointmeasure.measure.util; + + +import com.project.survey.R; + +public class CodeConsUtils { + + public final static int SHAPE_CIRCLE_FULL = 0; + public final static int SHAPE_CIRCLE_EMPTY = SHAPE_CIRCLE_FULL + 1; + public final static int SHAPE_SQUARE_FULL = SHAPE_CIRCLE_EMPTY + 1; + public final static int SHAPE_SQUARE_EMPTY = SHAPE_SQUARE_FULL + 1; + public final static int SHAPE_TRIANGLE_UP_FULL = SHAPE_SQUARE_EMPTY + 1; + public final static int SHAPE_TRIANGLE_UP_EMPTY = SHAPE_TRIANGLE_UP_FULL + 1; + public final static int SHAPE_TRIANGLE_DOWN_FULL = SHAPE_TRIANGLE_UP_EMPTY + 1; + public final static int SHAPE_TRIANGLE_DOWN_EMPTY = SHAPE_TRIANGLE_DOWN_FULL + 1; + public final static int SHAPE_RHOMBUS_FULL = SHAPE_TRIANGLE_DOWN_EMPTY + 1; + public final static int SHAPE_RHOMBUS_EMPTY = SHAPE_RHOMBUS_FULL + 1; + public final static int SHAPE_ROUNDED_FIVE_STAR = SHAPE_RHOMBUS_EMPTY + 1; + public final static int SHAPE_STRAIGHT_FIVE_STAR = SHAPE_ROUNDED_FIVE_STAR + 1; + public final static int SHAPE_CENTER_CIRCLE = SHAPE_STRAIGHT_FIVE_STAR + 1; + + public static int showPointIcon(int index){ + int showIcon = SHAPE_CIRCLE_FULL; + switch (index){ + case SHAPE_CIRCLE_FULL: + showIcon = R.drawable.icon_code_circle_full; + break; + case SHAPE_CIRCLE_EMPTY: + showIcon = R.drawable.icon_code_circle_empty; + break; + case SHAPE_SQUARE_FULL: + showIcon = R.drawable.icon_code_square_full; + break; + case SHAPE_SQUARE_EMPTY: + showIcon = R.drawable.icon_code_square_empty; + break; + case SHAPE_TRIANGLE_UP_FULL: + showIcon = R.drawable.icon_code_triangle_up_full; + break; + case SHAPE_TRIANGLE_UP_EMPTY: + showIcon = R.drawable.icon_code_triangle_up_empty; + break; + case SHAPE_TRIANGLE_DOWN_FULL: + showIcon = R.drawable.icon_code_triangle_down_full; + break; + case SHAPE_TRIANGLE_DOWN_EMPTY: + showIcon = R.drawable.icon_code_triangle_down_empty; + break; + case SHAPE_RHOMBUS_FULL: + showIcon = R.drawable.icon_code_rhombus_full; + break; + case SHAPE_RHOMBUS_EMPTY: + showIcon = R.drawable.icon_code_rhombus_empty; + break; + case SHAPE_ROUNDED_FIVE_STAR: + showIcon = R.drawable.icon_code_rounded_five_star; + break; + case SHAPE_STRAIGHT_FIVE_STAR: + showIcon = R.drawable.icon_code_straight_five_star; + break; + case SHAPE_CENTER_CIRCLE: + showIcon = R.drawable.icon_code_center_circle; + break; + + } + return showIcon; + } + + public final static int SHAPE_TYPE_POINT = 0; + public final static int SHAPE_TYPE_LINE = SHAPE_TYPE_POINT + 1; + public final static int SHAPE_TYPE_SURFACE = SHAPE_TYPE_LINE + 1; +} diff --git a/app/src/main/java/com/project/survey/ui/pointmeasure/measure/util/SFUtils.java b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/util/SFUtils.java new file mode 100644 index 0000000..9e6a309 --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/util/SFUtils.java @@ -0,0 +1,256 @@ +package com.project.survey.ui.pointmeasure.measure.util; + +import android.content.Context; +import android.content.SharedPreferences; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.project.survey.R; +import com.project.survey.widget.bingce.dragdrop.FunctionItem; +import com.project.survey.widget.bingce.dragdrop.TabItem; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + + +/** + * Created by xulc on 2018/6/29. + */ + +public class SFUtils { + private Context context; + private String xmlFileName; + private String preferAllDataKey; + private String preferSelDataKey; + private String str; + private SharedPreferences sp = null; + + public SFUtils(Context context, String xmlFileName, String preferAllDataKey, String preferSelDataKey, String strDefultDataValue) { + this.context = context; + this.xmlFileName = xmlFileName; + this.preferAllDataKey = preferAllDataKey; + this.preferSelDataKey = preferSelDataKey; + this.str = strDefultDataValue; + sp = context.getSharedPreferences("survey_bottom_all_information", Context.MODE_PRIVATE); + } + + public List getAllFunctionWithState() { + String allData = sp.getString(preferAllDataKey, ""); + List functionItems = new ArrayList<>(); + List tabItems = null; + if ("".equals(allData)) { + try { + InputStream is = context.getAssets().open(xmlFileName + ".xml"); + InputStreamReader isr = new InputStreamReader(is); + BufferedReader br = new BufferedReader(isr); + String str = null; + StringBuffer sbuffer = new StringBuffer(); + while ((str = br.readLine()) != null) { + sbuffer.append(str); + } + br.close(); + isr.close(); + is.close(); + allData = sbuffer.toString(); + Gson gson = new Gson(); + tabItems = gson.fromJson(allData, new TypeToken>() { + }.getType()); + if (tabItems != null) { + for (int i = 0; i < tabItems.size(); i++) { + FunctionItem functionItem = new FunctionItem(tabItems.get(i).getTabName(), tabItems.get(i).getTabTip(), true); + functionItems.add(functionItem); + functionItems.addAll(tabItems.get(i).getFunctionItems()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } else { + Gson gson = new Gson(); + functionItems = gson.fromJson(allData, new TypeToken>() { + }.getType()); + } + return functionItems; + } + + public List getSelectFunctionItem() { + String selData = sp.getString(preferSelDataKey, str); + List functionItems = null; + if ("".equals(selData)) { + functionItems = new ArrayList<>(); + } else { + Gson gson = new Gson(); + functionItems = gson.fromJson(selData, new TypeToken>() { + }.getType()); + } + return functionItems; + } + + public List getTabNames() { + String allData = sp.getString(preferAllDataKey, ""); + List functionItems = new ArrayList<>(); + List tabItems = null; + if ("".equals(allData)) { + try { + InputStream is = context.getAssets().open(xmlFileName + ".txt"); + InputStreamReader isr = new InputStreamReader(is); + BufferedReader br = new BufferedReader(isr); + String str = null; + StringBuffer sbuffer = new StringBuffer(); + while ((str = br.readLine()) != null) { + sbuffer.append(str); + } + br.close(); + isr.close(); + is.close(); + allData = sbuffer.toString(); + Gson gson = new Gson(); + tabItems = gson.fromJson(allData, new TypeToken>() { + }.getType()); + if (tabItems != null) { + int tabItemsCount = 0; //用于标记之后滑动的位置 + for (int i = 0; i < tabItems.size(); i++) { + FunctionItem functionItem = new FunctionItem(tabItems.get(i).getTabName(), tabItems.get(i).getTabTip(), true, tabItemsCount); + tabItemsCount = tabItemsCount + tabItems.get(i).getFunctionItems().size() + 1; + functionItems.add(functionItem); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return functionItems; + } + + public void saveSelectFunctionItem(List selData) { + Gson gson = new Gson(); + sp.edit().putString(preferSelDataKey, gson.toJson(selData)).apply(); + } + + public void saveAllFunctionWithState(List allData) { + Gson gson = new Gson(); + sp.edit().putString(preferAllDataKey, gson.toJson(allData)).apply(); + } + + public static String getFunctionJsonNameLanguage(Context context, String jsonName) { + String showText = ""; + switch (jsonName) { + case "坐标信息": + showText = context.getString(R.string.coordinate_information); + break; + case "基站信息": + showText = context.getString(R.string.base_information); + break; + case "测量信息": + showText = context.getString(R.string.survey_information); + break; + case "投影距离:与上一个点的投影距离。(空间距离同理)": + showText = context.getString(R.string.projection_space_distance_comment); + break; + case "X": + showText = "X"; + break; + case "Y": + showText = "Y"; + break; + case "Z": + showText = "Z"; + break; + case "纬度": + showText = context.getString(R.string.latitude); + break; + case "经度": + showText = context.getString(R.string.longitude); + break; + case "海拔": + showText = context.getString(R.string.altitude); + break; + case "基站ID": + showText = context.getString(R.string.base_id); + break; + case "基站距离": + showText = context.getString(R.string.base_distance); + break; + case "速度": + showText = context.getString(R.string.speed); + break; + case "前进方位": + showText = context.getString(R.string.forward_angle); + break; + case "投影距离": + showText = context.getString(R.string.projection_distance); + break; + case "空间距离": + showText = context.getString(R.string.space_distance); + break; + case "计算信息": + showText = context.getString(R.string.computational_information); + break; + case "累计平距": + showText = context.getString(R.string.add_up_plane_distance); + break; + case "累计斜距": + showText = context.getString(R.string.add_up_space_distance); + break; + case "目标信息": + showText = context.getString(R.string.target_information); + break; + case "实测信息": + showText = context.getString(R.string.measured_information); + break; + case "距离信息": + showText = context.getString(R.string.distance_information); + break; + case "(请注意仅用于选线放样功能)": + showText = context.getString(R.string.please_note_select_line_function); + break; + case "目标 X": + showText = context.getString(R.string.target_x); + break; + case "目标 Y": + showText = context.getString(R.string.target_y); + break; + case "目标 Z": + showText = context.getString(R.string.target_z); + break; + case "目标里程": + showText = context.getString(R.string.target_mileage); + break; + case "目标偏距": + showText = context.getString(R.string.target_offset); + break; + case "设计标高": + showText = context.getString(R.string.design_height); + break; + case "实测 X": + showText = context.getString(R.string.survey_x); + break; + case "实测 Y": + showText = context.getString(R.string.survey_y); + break; + case "实测 Z": + showText = context.getString(R.string.survey_z); + break; + case "实测里程": + showText = context.getString(R.string.survey_mileage); + break; + case "实测偏距": + showText = context.getString(R.string.survey_offset); + break; + case "起点距": + showText = context.getString(R.string.start_distance); + break; + case "终点距": + showText = context.getString(R.string.end_distance); + break; + case "垂距": + showText = context.getString(R.string.vertical_distance); + break; + } + return showText; + } +} diff --git a/app/src/main/java/com/project/survey/ui/pointmeasure/measure/util/SurveyToolBarClickListenerUtils.java b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/util/SurveyToolBarClickListenerUtils.java new file mode 100644 index 0000000..7aa1809 --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/util/SurveyToolBarClickListenerUtils.java @@ -0,0 +1,111 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.project.survey.ui.pointmeasure.measure.util; + +import android.content.Context; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bingce.coordlib.util.CoordUtil; +import com.bingce.device.Device; +import com.bingce.device.enums.DeviceTypeEnum; +import com.bingce.rtk.command.RTK; +import com.bingce.rtk.gnss.Gnss; +import com.bingce.surveyor.util.DeviceConnectUtil; +import com.bingce.surveyor.util.dialog.CustomDialog; +import com.bingce.surveyorBase.R.string; +import com.bingce.surveyorBase.databinding.ActivityBaseSurveyNewBinding; +import com.bingce.utils.Util; +import com.project.survey.databinding.LayoutBaseSurveyStakingSettingBinding; + +import blankj.utilcode.util.ToastUtils; +import lecho.hellocharts.view.LineChartView; + +public class SurveyToolBarClickListenerUtils { + public SurveyToolBarClickListenerUtils() { + } + + public static void setOnClickListener(Context context, boolean isShowSettingConnectTipsDialog, + boolean isStakingPager, ActivityBaseSurveyNewBinding activityBaseSurveyBinding, + LayoutBaseSurveyStakingSettingBinding stakingSettingBinding, + IToolBarClickListener callBack) { + stakingSettingBinding.llSet.setOnClickListener((v) -> { + if (isShowSettingConnectTipsDialog) { + if (DeviceConnectUtil.isDeviceConnectSelectDialog(context, activityBaseSurveyBinding)) { + callBack.onSettingClickListener(); + } + } else { + callBack.onSettingClickListener(); + } + + }); + stakingSettingBinding.rlPositionCenter.setOnClickListener((v) -> { + if (isStakingPager) { + callBack.onPositionCenterClickListener(); + } else if (DeviceConnectUtil.isDeviceConnectSelectDialog(context, activityBaseSurveyBinding)) { + callBack.onPositionCenterClickListener(); + } + + }); + stakingSettingBinding.rlFullScreen.setOnClickListener((v) -> { + callBack.onFullScreenClickListener(); + }); + stakingSettingBinding.rlTiltPrimAuto.setOnClickListener((v) -> { + if (DeviceConnectUtil.isDeviceConnectSelectDialog(context, activityBaseSurveyBinding)) { + if (Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_TS) { + callBack.onAutoPrimsClickListener(); + } else { + if (!Gnss.getInstance().getDevice().isSupportTilt()) { + ToastUtils.showShort(string.current_device_not_support_tilt); + return; + } + + if (Gnss.getInstance().getDevice().isTiltOpen()) { + RTK.getInstance().sendCloseTiltCmd(); + } else if (Device.getInstance().remindAntBeforeTilt) { + (new CustomDialog.Builder(context)).setTitle(context.getString(string.prompt)).setContent(context.getString(string.current_ploe_high_lever) + context.getString(string.colon) + CoordUtil.formatDouble2String(Gnss.getInstance().getDevice().getPoleHeight(), 3) + "m\n" + context.getString(string.check_whether_pole_height_correct)).setButtonConfirm((v1) -> { + RTK.getInstance().sendOpenTiltCmd(); + }).create().show(); + } else { + RTK.getInstance().sendOpenTiltCmd(); + } + } + } + + }); + } + + public static void setScaleViewOnClickListener(LineChartView lineChartView, TextView tvScale, ImageView ivScale) { + lineChartView.setViewportChangeListener((viewport) -> { + if (!Double.isNaN(viewport.left) && !Double.isNaN(viewport.right) && !Double.isNaN(viewport.top) && !Double.isNaN(viewport.bottom)) { + double width = Math.abs(viewport.left - viewport.right); + int chartViewWidth = lineChartView.getWidth(); + int scaleViewWith = ivScale.getWidth(); + double value = width / (double) chartViewWidth * (double) scaleViewWith; + String string; + if (value > 1.0) { + string = Util.formatDouble2String(value, 1) + "m"; + } else { + string = Util.formatDouble2String(value, 3) + "m"; + } + + tvScale.setText(string); + } else { + tvScale.setText("*"); + } + }); + } + + public interface IToolBarClickListener { + void onSettingClickListener(); + + void onPositionCenterClickListener(); + + void onFullScreenClickListener(); + + void onAutoPrimsClickListener(); + } +} diff --git a/app/src/main/java/com/project/survey/util/CommonUtils.java b/app/src/main/java/com/project/survey/util/CommonUtils.java index cd23035..168763b 100644 --- a/app/src/main/java/com/project/survey/util/CommonUtils.java +++ b/app/src/main/java/com/project/survey/util/CommonUtils.java @@ -4,9 +4,12 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.DashPathEffect; +import android.graphics.Rect; import android.text.TextUtils; import android.view.View; +import com.bingce.chart.ChartViewUtils; import com.bingce.coordlib.model.Coordinate; import com.bingce.data.surveyor.surveydata.pointsurvey.PointConstants; import com.bingce.data.surveyor.surveydata.pointsurvey.PointRecord; @@ -43,6 +46,11 @@ import cn.liuyanbing.surveyor.model.horizontalcurve.JDElement; import cn.liuyanbing.surveyor.model.horizontalcurve.JDFiveCurveElement; import cn.liuyanbing.surveyor.model.horizontalcurve.XJDCurveElement; import cn.liuyanbing.surveyor.model.horizontalcurve.XYCurveElement; +import lecho.hellocharts.model.Axis; +import lecho.hellocharts.model.Line; +import lecho.hellocharts.model.LineChartData; +import lecho.hellocharts.model.PointValue; +import lecho.hellocharts.view.LineChartView; public class CommonUtils { @@ -164,6 +172,127 @@ public class CommonUtils { return result; } + /** + * 设置chartview数据 + * + * @param chart view + * @param datas 线 + * @param hasAxis 是否设置边框 + * @param isMirror 是否镜像 + * @param referLineOffset 参考线的x坐标,例如设计线、隧道中线 + */ + public static void mChartViewSetLineChartDatas(LineChartView chart, List datas, boolean hasAxis, boolean isMirror, double... referLineOffset) { + ChartViewUtils.mChartViewSetLineChartDatas(chart, datas, hasAxis, isMirror, referLineOffset); + } + + /** + * 设置chartview数据 + * + * @param chart view + * @param datas 线 + * @param hasAxis 是否设置边框 + * @param isMirror 是否镜像 + * @param referLineOffset 参考线的x坐标,例如设计线、隧道中线 + */ + public static void mChartViewSetAndLableLineChartDatas(LineChartView chart, List datas, boolean hasAxis, boolean isMirror, double... referLineOffset) { + if (datas != null) { + double left = Double.POSITIVE_INFINITY, top = Double.NEGATIVE_INFINITY, right = Double.NEGATIVE_INFINITY, bottom = Double.POSITIVE_INFINITY; + Rect contentRectMinusAll = chart.getChartComputator().getContentRectMinusAllMargins(); + //总的线路集合 + ArrayList lines = new ArrayList<>(); + //判断数据是否为空 + boolean hasLine = false; + //计算边界值和设计线 + for (int i = 0; i < datas.size(); i++) { + for (Line line : datas.get(i).getLines()) { + // Calculate max and min for viewport. + for (PointValue pointValue : line.getValues()) { + if (pointValue.getX() < left) { + left = pointValue.getX(); + } + if (pointValue.getX() > right) { + right = pointValue.getX(); + } + if (pointValue.getY() < bottom) { + bottom = pointValue.getY(); + } + if (pointValue.getY() > top) { + top = pointValue.getY(); + } + } + hasLine = true; + } + } + if (hasLine && referLineOffset.length != 0) { + //计算边界时参考线也要考虑在内 + for (int i = 0; i < referLineOffset.length; i++) { + if (referLineOffset[i] < left) { + left = referLineOffset[i]; + } + if (referLineOffset[i] > right) { + right = referLineOffset[i]; + } + } + + double width = right - left, height = top - bottom; + if (contentRectMinusAll.height() / height >= contentRectMinusAll.width() / width) { + // Y轴增量 + double deltaY = width / contentRectMinusAll.width() * contentRectMinusAll.height() - height; + //Log.i(TAG, "Y增量:" + deltaY); + //后面/30是在编辑加入缓存区,以免图形显示不全 + for (int i = 0; i < referLineOffset.length; i++) { + List lineValues = new ArrayList<>(); + lineValues.add(new PointValue(referLineOffset[i], top + deltaY / 2)); + lineValues.add(new PointValue(referLineOffset[i], bottom - deltaY / 2)); + Line line = new Line(lineValues).setPointColor(Color.MAGENTA).setHasLabels(true).setStrokeWidth(1).setPointRadius(2); + line.setPathEffect(new DashPathEffect(new float[]{2, 4, 8, 16}, 1)); + lines.add(line); + } + } else { + for (int i = 0; i < referLineOffset.length; i++) { + List lineValues = new ArrayList<>(); + lineValues.add(new PointValue(referLineOffset[i], top)); + lineValues.add(new PointValue(referLineOffset[i], bottom)); + Line line = new Line(lineValues).setPointColor(Color.MAGENTA).setHasLabels(true).setStrokeWidth(1).setPointRadius(2); + line.setPathEffect(new DashPathEffect(new float[]{2, 4, 8, 16}, 1)); + lines.add(line); + } + } + } + //把参数datas集成 + for (int i = 0; i < datas.size(); i++) { + lines.addAll(datas.get(i).getLines()); + } + + //镜像 + if (isMirror) { + for (Line line : lines) { + for (PointValue pointValue : line.getValues()) { + pointValue.set(-1 * pointValue.getX(), pointValue.getY()); + } + } + } + + LineChartData resultData = new LineChartData(lines); + if (hasAxis) { + resultData.setAxisYLeft(new Axis().setHasLines(false).setHasSeparationLine(true)); + resultData.setAxisYRight(new Axis().setHasLines(false).setHasSeparationLine(true)); + resultData.setAxisXBottom(new Axis().setHasLines(false).setHasSeparationLine(true)); + resultData.setAxisXTop(new Axis().setHasLines(false).setHasSeparationLine(true)); + } else { + resultData.setAxisYLeft(null); + resultData.setAxisYRight(null); + resultData.setAxisXBottom(null); + resultData.setAxisXTop(null); + } + resultData.setValueLabelBackgroundEnabled(true);//隐藏label背景,放到这里设置是因为这是最后一关,不会被其他data的背景色覆盖 + resultData.setValueLabelsTextColor(Color.WHITE); + chart.setLineChartData(resultData); + chart.setValueSelectionEnabled(true); + } else { + chart.setLineChartData(null); + } + } /** * 导入exl文件 @@ -301,6 +430,36 @@ public class CommonUtils { } } + public static LineChartData mCircleChartDatas(int color, double centerX, double centerY, double radius, double anglePlus) { + Line circleLine = new Line(CalCirclePathPoints(centerX, centerY, radius, anglePlus)); + circleLine.setStrokeWidth(1); + circleLine.setHasPoints(false); + circleLine.setCubic(true); + circleLine.setColor(color); + circleLine.setHasLines(true); + circleLine.setHasLabels(false); + LineChartData data = new LineChartData(); + data.getLines().add(circleLine); + return data; + } + + private static ArrayList CalCirclePathPoints(double centerX, double centerY, double radius, double anglePlus) { + ArrayList result = new ArrayList(); + result.add(new PointValue(centerY, centerX + radius)); + double center2BeginAngle = 0.0D; + double angle = Math.toRadians(Math.abs(anglePlus)); + + for (int i = 1; angle * (double) i < 6.283185307179586D; ++i) { + double x = centerX + radius * Math.cos(center2BeginAngle + angle * (double) i); + double y = centerY + radius * Math.sin(center2BeginAngle + angle * (double) i); + PointValue pv = new PointValue(((float) y), ((float) x)); + result.add(pv); + } + + result.add(new PointValue(centerY, centerX + radius)); + return result; + } + /** * huo * @@ -425,7 +584,7 @@ public class CommonUtils { * @return */ public static int dip2px(float dpValue) { - final float scale = Utils.getApp().getResources().getDisplayMetrics().density; + final float scale = (Utils.getApp()).getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } diff --git a/app/src/main/java/com/project/survey/util/SurveyDevicePoleHrHeightUtils.java b/app/src/main/java/com/project/survey/util/SurveyDevicePoleHrHeightUtils.java new file mode 100644 index 0000000..1d46b14 --- /dev/null +++ b/app/src/main/java/com/project/survey/util/SurveyDevicePoleHrHeightUtils.java @@ -0,0 +1,118 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.project.survey.util; + +import android.text.TextUtils; +import android.widget.ImageView; +import android.widget.LinearLayout; + +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentActivity; +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleEventObserver; +import androidx.lifecycle.LifecycleOwner; + +import com.bingce.BaseApp; +import com.bingce.device.Device; +import com.bingce.device.enums.DeviceTypeEnum; +import com.bingce.device.ui.widget.BingCeTextView; +import com.bingce.rtk.command.RTK; +import com.bingce.rtk.gnss.Gnss; +import com.bingce.surveyor.util.dialog.CustomInputDialog; +import com.bingce.surveyor.util.dialog.CustomInputDialog.Builder; +import com.bingce.surveyorBase.R.drawable; +import com.bingce.surveyorBase.R.string; +import com.bingce.totalstation.TotalStation; +import com.bingce.totalstation.TsConfig; +import com.bingce.totalstation.TsListener; +import com.bingce.utils.Util; +import com.project.survey.databinding.LayoutPoleHrHeightBinding; + +import blankj.utilcode.util.ToastUtils; +import blankj.utilcode.util.Utils; + +public class SurveyDevicePoleHrHeightUtils { + public SurveyDevicePoleHrHeightUtils() { + } + + public static void initDevicePoleHrHigh(FragmentActivity activity, + final LayoutPoleHrHeightBinding layoutPoleHrHeightBinding) { + activity.getLifecycle().addObserver(new LifecycleEventObserver() { + public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) { + TsListener.ChangeHrListener changeHrListener = new TsListener.ChangeHrListener() { + public void onChangeHrSuccess(double hr) { + ToastUtils.showShort(string.edit_hr_successful); + layoutPoleHrHeightBinding.tvPoleHrHeight.setText(Util.formatDouble2String(hr, 3) + "m"); + } + + public void onChangeHrFailed(String errorMsg) { + ToastUtils.showShort(errorMsg); + } + }; + switch (event) { + case ON_CREATE: + TsListener.getInstance().addChangeHrRespListener(changeHrListener); + break; + case ON_DESTROY: + TsListener.getInstance().removeChangeHrRespListener(changeHrListener); + } + + } + }); + setDevicePoleHrHigh(activity, layoutPoleHrHeightBinding.llPoleHrHeight, layoutPoleHrHeightBinding.ivPoleHrHeight, layoutPoleHrHeightBinding.tvPoleHrHeight, false); + } + + public static void setDevicePoleHrHigh(FragmentActivity activity, LinearLayout llPoleHrHeight, + ImageView ivPoleHrHeight, BingCeTextView tvPoleHrHeight, + boolean isTitleBar) { + int notNumber = 3; + if (Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_TS) { + ivPoleHrHeight.setImageDrawable(Utils.getApp().getDrawable(isTitleBar ? drawable.icon_hr_high_white : (((BaseApp) Utils.getApp()).isThemeDark() ? drawable.icon_hr_high_white : drawable.icon_hr_high))); + tvPoleHrHeight.setText(Util.formatDouble2String(TsConfig.getInstance().getHr(), notNumber) + "m"); + } else { + ivPoleHrHeight.setImageDrawable(Utils.getApp().getDrawable(isTitleBar ? drawable.icon_pole_high_white : (((BaseApp) Utils.getApp()).isThemeDark() ? drawable.icon_pole_high_white : drawable.icon_pole_high))); + tvPoleHrHeight.setText(Util.formatDouble2String(Gnss.getInstance().getDevice().getPoleHeight(), notNumber) + "m"); + } + + llPoleHrHeight.setOnClickListener((v) -> { + double inputPH; + String title; + if (Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_TS) { + title = Utils.getApp().getString(string.edit_ts_hr); + inputPH = TsConfig.getInstance().getHr(); + } else { + title = Utils.getApp().getString(string.edit_antenna_height); + inputPH = Gnss.getInstance().getDevice().getPoleHeight(); + } + + (new CustomInputDialog.Builder(activity)).setTitle(title).setInputText(Utils.getApp().getString(string.enter_pole_height)).setInputText(Util.formatDouble2String(inputPH, notNumber)).setInputFormat(Builder.INPUT_TYPE_PM_DECIMAL).setButtonConfirm(new CustomInputDialog.setOnConfirmClickListener() { + public void OnConfirmClick(String editText) { + if (TextUtils.isEmpty(editText)) { + editText = "0"; + } + + if (Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_TS) { + this.saveHrHigh(editText); + } else { + this.saveRTKHigh(editText); + } + + tvPoleHrHeight.setText(Util.formatDouble2String(Double.parseDouble(editText), notNumber) + "m"); + } + + private void saveHrHigh(String editText) { + TotalStation.getInstance().requestChangeHr(Double.parseDouble(editText)); + } + + private void saveRTKHigh(String editText) { + Gnss.getInstance().getDevice().setPoleHeight(Double.parseDouble(editText)); + Gnss.getInstance().save(); + RTK.getInstance().sendSetPoleHeightCmd(); + } + }).create().show(); + }); + } +} diff --git a/app/src/main/java/com/project/survey/util/SurveyUIUtils.java b/app/src/main/java/com/project/survey/util/SurveyUIUtils.java new file mode 100644 index 0000000..9fafac5 --- /dev/null +++ b/app/src/main/java/com/project/survey/util/SurveyUIUtils.java @@ -0,0 +1,122 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.project.survey.util; + +import android.view.View; + +import com.bingce.device.Device; +import com.bingce.device.enums.DeviceTypeEnum; +import com.bingce.rtk.gnss.Gnss; +import com.bingce.surveyorBase.R.color; +import com.bingce.surveyorBase.R.drawable; +import com.bingce.surveyorBase.R.mipmap; +import com.bingce.surveyorBase.R.string; +import com.bingce.totalstation.TotalStation; +import com.bingce.utils.SoundPoolUtil; +import com.project.survey.databinding.LayoutBaseSurveyStakingSettingBinding; +import com.project.survey.databinding.LayoutDraggingButtonBinding; +import com.project.survey.databinding.LayoutPoleHrHeightBinding; +import com.project.survey.ui.pointmeasure.measure.PointSurveyNewActivity; + +import blankj.utilcode.util.StringUtils; +import blankj.utilcode.util.Utils; + +public class SurveyUIUtils { + public SurveyUIUtils() { + } + + public static void stopSoundPool() { + SoundPoolUtil.getInstance().stop(); + } + + private static int dip2px(float dpValue) { + float scale = Utils.getApp().getResources().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5F); + } + + public static void updatePoleHrHeightDraggingToolBarLayout(PointSurveyNewActivity activity, boolean isExpand, LayoutPoleHrHeightBinding layoutPoleHrHeightBinding, + LayoutDraggingButtonBinding layoutDraggingButtonBinding, + LayoutBaseSurveyStakingSettingBinding layoutBaseSurveyStakingSettingBinding, + boolean isJudgeIvSettingStatus, boolean isStakingPager, Object currentCoordinate) { + SurveyDevicePoleHrHeightUtils.initDevicePoleHrHigh(activity, layoutPoleHrHeightBinding); + if (Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_TS) { + layoutDraggingButtonBinding.drWatchSurvey.setVisibility(View.VISIBLE); + if (isStakingPager) { + layoutDraggingButtonBinding.drWatchSurveyRecord.setText(StringUtils.getString(string.record)); + } else { + layoutDraggingButtonBinding.drWatchSurveyRecord.setText(StringUtils.getString(string.measure_and_record)); + } + } else { + layoutDraggingButtonBinding.drWatchSurvey.setVisibility(View.GONE); + layoutDraggingButtonBinding.drWatchSurveyRecord.setText(StringUtils.getString(string.record)); + } + + layoutBaseSurveyStakingSettingBinding.expandLayout.setRetractHeight((float) dip2px(25.0F)); + layoutBaseSurveyStakingSettingBinding.expandLayout.initExpand(isExpand); + layoutBaseSurveyStakingSettingBinding.llTopTool.setOnClickListener((v) -> { + if (layoutBaseSurveyStakingSettingBinding.expandLayout.isExpand()) { + layoutBaseSurveyStakingSettingBinding.ivTool.setImageResource(mipmap.icon_new_up_gray_arrow); + } else { + layoutBaseSurveyStakingSettingBinding.ivTool.setImageResource(mipmap.icon_new_down_gray_arrow); + } + + layoutBaseSurveyStakingSettingBinding.expandLayout.toggleExpand(); + }); + if (isJudgeIvSettingStatus) { + if (!Device.getInstance().isDeviceConnected()) { + layoutBaseSurveyStakingSettingBinding.ivSurveySetting.setImageResource(drawable.icon_survey_setting_gray); + } else { + layoutBaseSurveyStakingSettingBinding.ivSurveySetting.setImageResource(drawable.icon_survey_setting_black); + } + } else { + layoutBaseSurveyStakingSettingBinding.ivSurveySetting.setImageResource(drawable.icon_survey_setting_black); + } + + if (!Device.getInstance().isDeviceConnected() && currentCoordinate == null) { + layoutBaseSurveyStakingSettingBinding.ivPositionCenter.setImageResource(drawable.icon_survey_position_center_gray); + layoutBaseSurveyStakingSettingBinding.tvPositionCenter.setTextColor(activity.getColor(color.color_BCBCBC)); + } else { + layoutBaseSurveyStakingSettingBinding.ivPositionCenter.setImageResource(drawable.icon_survey_position_center_black); + layoutBaseSurveyStakingSettingBinding.tvPositionCenter.setTextColor(activity.getColor(color.black)); + } + + if (isStakingPager) { + layoutBaseSurveyStakingSettingBinding.rlInputCurrentPoint.setVisibility(View.VISIBLE); + } else { + layoutBaseSurveyStakingSettingBinding.rlInputCurrentPoint.setVisibility(View.GONE); + } + + if (Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_TS) { + if (isStakingPager) { + layoutBaseSurveyStakingSettingBinding.rlTiltPrimAuto.setVisibility(View.VISIBLE); + } else { + layoutBaseSurveyStakingSettingBinding.rlTiltPrimAuto.setVisibility(View.GONE); + } + + if (Device.getInstance().isDeviceConnected() && TotalStation.getInstance().isSupportMotor()) { + layoutBaseSurveyStakingSettingBinding.ivTiltPrimAuto.setImageResource(drawable.icon_auto_look_prim_black); + layoutBaseSurveyStakingSettingBinding.tvTiltPrimAuto.setTextColor(activity.getColor(color.black)); + } else { + layoutBaseSurveyStakingSettingBinding.ivTiltPrimAuto.setImageResource(drawable.icon_auto_look_prim_gray); + layoutBaseSurveyStakingSettingBinding.tvTiltPrimAuto.setTextColor(activity.getColor(color.color_BCBCBC)); + } + + layoutBaseSurveyStakingSettingBinding.tvTiltPrimAuto.setText(activity.getString(string.auto_trun)); + } else { + if (Gnss.getInstance().getDevice().isTiltOpen() && Gnss.getInstance().getDevice().isSupportTilt()) { + layoutBaseSurveyStakingSettingBinding.ivTiltPrimAuto.setImageResource(drawable.icon_survey_tilt_black); + layoutBaseSurveyStakingSettingBinding.tvTiltPrimAuto.setTextColor(activity.getColor(color.black)); + } else { + layoutBaseSurveyStakingSettingBinding.ivTiltPrimAuto.setImageResource(drawable.icon_survey_tilt_gray); + layoutBaseSurveyStakingSettingBinding.tvTiltPrimAuto.setTextColor(activity.getColor(color.color_BCBCBC)); + } + + layoutBaseSurveyStakingSettingBinding.tvTiltPrimAuto.setText(activity.getString(string.tilt)); + layoutBaseSurveyStakingSettingBinding.rlTiltPrimAuto.setVisibility(View.VISIBLE); + } + + } +} diff --git a/app/src/main/java/com/project/survey/widget/bingce/dragdrop/DefaultItemCallback.java b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/DefaultItemCallback.java new file mode 100644 index 0000000..9e897e2 --- /dev/null +++ b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/DefaultItemCallback.java @@ -0,0 +1,52 @@ +package com.project.survey.widget.bingce.dragdrop; + + +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; + +public class DefaultItemCallback extends ItemTouchHelper.Callback { + + private ItemTouchHelperAdapter touchHelperAdapter; + + public DefaultItemCallback(ItemTouchHelperAdapter touchHelperAdapter) { + this.touchHelperAdapter = touchHelperAdapter; + } + @Override + public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { + int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; //允许上下左右的拖动 + return makeMovementFlags(dragFlags, 0); + } + + @Override + public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { + touchHelperAdapter.onItemMove(viewHolder, viewHolder.getAdapterPosition(), target.getAdapterPosition()); + return true; + } + + @Override + public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { + if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) + touchHelperAdapter.onItemSelect(viewHolder); + } + + @Override + public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { + if (!recyclerView.isComputingLayout()) + touchHelperAdapter.onItemClear(viewHolder); + } + + @Override + public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { + + } + + @Override + public boolean isLongPressDragEnabled() { + return true; + } + + @Override + public boolean isItemViewSwipeEnabled() { + return false; + } +} diff --git a/app/src/main/java/com/project/survey/widget/bingce/dragdrop/DefaultItemTouchHelper.java b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/DefaultItemTouchHelper.java new file mode 100644 index 0000000..44389b2 --- /dev/null +++ b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/DefaultItemTouchHelper.java @@ -0,0 +1,9 @@ +package com.project.survey.widget.bingce.dragdrop; + +import androidx.recyclerview.widget.ItemTouchHelper; + +public class DefaultItemTouchHelper extends ItemTouchHelper { + public DefaultItemTouchHelper(Callback callback) { + super(callback); + } +} diff --git a/app/src/main/java/com/project/survey/widget/bingce/dragdrop/FunctionAdapter.java b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/FunctionAdapter.java new file mode 100644 index 0000000..f40e296 --- /dev/null +++ b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/FunctionAdapter.java @@ -0,0 +1,144 @@ +package com.project.survey.widget.bingce.dragdrop; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + + +import com.project.survey.App; +import com.project.survey.R; +import com.project.survey.ui.pointmeasure.measure.util.SFUtils; + +import java.util.ArrayList; +import java.util.List; + +import blankj.utilcode.util.Utils; + + +public class FunctionAdapter extends RecyclerView.Adapter { + + private List data = new ArrayList<>(); + + private LayoutInflater inflater; + private Context context; + + public FunctionAdapter(Context context, @NonNull List data) { + this.context = context; + if (data != null) { + this.data = data; + } + inflater = LayoutInflater.from(context); + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + RecyclerView.ViewHolder holder; + if (0 == viewType) { + holder = new TitleViewHolder(inflater.inflate(R.layout.layout_function_text, parent, false)); + } else { + holder = new FunctionViewHolder(inflater.inflate(R.layout.layout_grid_item, parent, false)); + } + return holder; + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { + if (0 == getItemViewType(position)) { + TitleViewHolder holder = (TitleViewHolder) viewHolder; + holder.title.setText(SFUtils.getFunctionJsonNameLanguage(context, data.get(position).name)); + holder.tip.setText(SFUtils.getFunctionJsonNameLanguage(context, data.get(position).tip)); + if (((App) Utils.getApp()).isThemeDark) { + holder.title.setTextColor(context.getColor(R.color.white)); + holder.tip.setTextColor(context.getColor(R.color.white)); + } + } else { + final int index = position; + FunctionViewHolder holder = (FunctionViewHolder) viewHolder; + FunctionItem fi = data.get(position); +// setImage(fi.imageUrl,holder.iv); + if (((App) Utils.getApp()).isThemeDark) { + holder.squareRelativeLayout.setBackgroundColor(context.getColor(R.color.dark)); + holder.text.setTextColor(context.getColor(R.color.white)); + } + holder.text.setText(SFUtils.getFunctionJsonNameLanguage(context, fi.name)); + holder.iv.setImageResource(fi.isSelect ? R.drawable.icon_location_information_earth_gray : R.drawable.icon_location_information_earth); + holder.btn.setImageResource(fi.isSelect ? R.drawable.ic_block_selected : R.drawable.ic_block_add); + holder.btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + FunctionItem f = data.get(index); + if (!f.isSelect) { + if (listener != null) { + if (listener.add(f)) { + f.isSelect = true; + notifyDataSetChanged(); + } + } + } + } + }); + } + } + + public void setImage(String url, ImageView iv) { + try { + int rid = context.getResources().getIdentifier(url, "drawable", context.getPackageName()); + iv.setImageResource(rid); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public int getItemViewType(int position) { + return data.get(position).isTitle ? 0 : 1; + } + + @Override + public int getItemCount() { + return data.size(); + } + + private class TitleViewHolder extends RecyclerView.ViewHolder { + + private TextView title, tip; + + public TitleViewHolder(View itemView) { + super(itemView); + title = itemView.findViewById(R.id.title); + tip = itemView.findViewById(R.id.tip); + } + } + + private class FunctionViewHolder extends RecyclerView.ViewHolder { + + private ImageView iv, btn; + private TextView text; + private SquareRelativeLayout squareRelativeLayout; + + public FunctionViewHolder(View itemView) { + super(itemView); + iv = itemView.findViewById(R.id.iv); + text = itemView.findViewById(R.id.text); + btn = itemView.findViewById(R.id.btn); + squareRelativeLayout = itemView.findViewById(R.id.squareRelativeLayout); + } + } + + public interface OnItemAddListener { + boolean add(FunctionItem item); + } + + private OnItemAddListener listener; + + public void setOnItemAddListener(OnItemAddListener listener) { + this.listener = listener; + } + +} diff --git a/app/src/main/java/com/project/survey/widget/bingce/dragdrop/FunctionBlockAdapter.java b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/FunctionBlockAdapter.java new file mode 100644 index 0000000..4bf1e1c --- /dev/null +++ b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/FunctionBlockAdapter.java @@ -0,0 +1,133 @@ +package com.project.survey.widget.bingce.dragdrop; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + + +import com.project.survey.App; +import com.project.survey.R; +import com.project.survey.ui.pointmeasure.measure.util.SFUtils; + +import java.util.ArrayList; +import java.util.List; + +import blankj.utilcode.util.Utils; + +public class FunctionBlockAdapter extends RecyclerView.Adapter implements ItemTouchHelperAdapter { + private List data = new ArrayList<>(); + private LayoutInflater inflater; + private Context context; + private DragICallback mDragCallback; + + public FunctionBlockAdapter(Context context, @NonNull List data) { + this.context = context; + inflater = LayoutInflater.from(context); + if (data != null) { + this.data = data; + } + } + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + return new ViewHolder(inflater.inflate(R.layout.layout_grid_item, parent, false)); + } + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + final int index = position; + FunctionItem fi = data.get(position); + setImage(fi.imageUrl, holder.iv); + holder.text.setText(SFUtils.getFunctionJsonNameLanguage(context,fi.name)); + holder.btn.setImageResource(R.drawable.ic_block_delete); + if (((App) Utils.getApp()).isThemeDark) { + holder.squareRelativeLayout.setBackgroundColor(context.getColor(R.color.dark)); + holder.text.setTextColor(context.getColor(R.color.white)); + } + holder.btn.setOnClickListener(v -> { + FunctionItem fi1 = data.remove(index); + if (listener != null) { + listener.remove(fi1); + } + notifyDataSetChanged(); + }); + } + + public void updateDataSetChanged(List data) { + this.data = data; + notifyDataSetChanged(); + } + + public void setImage(String url, ImageView iv) { + try { + int rid = context.getResources().getIdentifier(url,"drawable",context.getPackageName()); + iv.setImageResource(rid); + } catch (Exception e) { + e.printStackTrace(); + } + } + @Override + public int getItemCount() { + return data.size(); + } + @Override + public void onItemMove(RecyclerView.ViewHolder holder, int fromPosition, int targetPosition) { + if (fromPosition < data.size() && targetPosition < data.size()) { + FunctionItem moveItem = data.get(fromPosition); + data.remove(fromPosition); + data.add(targetPosition, moveItem); + notifyItemMoved(fromPosition, targetPosition); + } + } + @Override + public void onItemSelect(RecyclerView.ViewHolder holder) { + holder.itemView.setScaleX(0.8f); + holder.itemView.setScaleY(0.8f); + } + + @Override + public void onItemClear(RecyclerView.ViewHolder holder) { + holder.itemView.setScaleX(1.0f); + holder.itemView.setScaleY(1.0f); + mDragCallback.dragChanged(data); + } + + @Override + public void onItemDismiss(RecyclerView.ViewHolder holder) { + + } + public class ViewHolder extends RecyclerView.ViewHolder { + private ImageView iv, btn; + private TextView text; + private SquareRelativeLayout squareRelativeLayout; + public ViewHolder(View itemView) { + super(itemView); + iv = itemView.findViewById(R.id.iv); + text = itemView.findViewById(R.id.text); + btn = itemView.findViewById(R.id.btn); + squareRelativeLayout = itemView.findViewById(R.id.squareRelativeLayout); + } + } + + public interface OnItemRemoveListener { + void remove(FunctionItem item); + } + + private OnItemRemoveListener listener; + + public void setOnItemRemoveListener(OnItemRemoveListener listener) { + this.listener = listener; + } + + public interface DragICallback { + void dragChanged(List data); + } + + public void addDragChangedListener(DragICallback callback) { + mDragCallback = callback; + } +} diff --git a/app/src/main/java/com/project/survey/widget/bingce/dragdrop/FunctionItem.java b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/FunctionItem.java new file mode 100644 index 0000000..66e2006 --- /dev/null +++ b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/FunctionItem.java @@ -0,0 +1,38 @@ +package com.project.survey.widget.bingce.dragdrop; + +import androidx.annotation.Keep; + +@Keep +public class FunctionItem { + + public String id; + public String name; + public String tip; + public boolean isSelect = false; + public String imageUrl = ""; + public String background =""; + public boolean isTitle = false; + public int subItemCount = 0; + + public FunctionItem(String name, boolean isSelect, String imageUrl, String background) { + this.name = name; + this.tip = tip; + this.isSelect = isSelect; + this.imageUrl = imageUrl; + this.background = background; + } + + public FunctionItem(String name,String tip,boolean isTitle,int subItemCount){ + this.name = name; + this.tip = tip; + this.isTitle = isTitle; + this.subItemCount = subItemCount; + } + + public FunctionItem(String name,String tip,boolean isTitle){ + this.name = name; + this.tip = tip; + this.isTitle = isTitle; + } + +} diff --git a/app/src/main/java/com/project/survey/widget/bingce/dragdrop/FunctionItemID.java b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/FunctionItemID.java new file mode 100644 index 0000000..5112a97 --- /dev/null +++ b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/FunctionItemID.java @@ -0,0 +1,37 @@ +package com.project.survey.widget.bingce.dragdrop; + +public class FunctionItemID { + public static class POINT_SURVEY_ID { + public static final int SURVEY_X_ID = 0; + public static final int SURVEY_Y_ID = SURVEY_X_ID + 1; + public static final int SURVEY_Z_ID = SURVEY_Y_ID + 1; + public static final int SURVEY_LAT_ID = SURVEY_Z_ID + 1; + public static final int SURVEY_LON_ID = SURVEY_LAT_ID + 1; + public static final int SURVEY_ALT_ID = SURVEY_LON_ID + 1; + public static final int SURVEY_SIT_ID_ID = SURVEY_ALT_ID + 1; + public static final int SURVEY_SIT_DISTANCE_ID = SURVEY_SIT_ID_ID + 1; + public static final int SURVEY_SPEED_ID = SURVEY_SIT_DISTANCE_ID + 1; + public static final int SURVEY_ANGLE_ID = SURVEY_SPEED_ID + 1; + public static final int SURVEY_LAST_PROJECTION_ID = SURVEY_ANGLE_ID + 1; + public static final int SURVEY_LAST_SPACE_ID = SURVEY_LAST_PROJECTION_ID + 1; + public static final int SURVEY_ACCUMULAT_DISTANCE_2D = SURVEY_LAST_SPACE_ID + 1; + public static final int SURVEY_ACCUMULAT_DISTANCE_3D = SURVEY_ACCUMULAT_DISTANCE_2D + 1; + } + + public static class CAD_ID { + public static final int TARGET_X_ID = 0; + public static final int TARGET_Y_ID = TARGET_X_ID + 1; + public static final int TARGET_Z_ID = TARGET_Y_ID + 1; + public static final int TARGET_MILEAGE_ID = TARGET_Z_ID + 1; + public static final int TARGET_OFFSET_ID = TARGET_MILEAGE_ID + 1; + public static final int TARGET_DESIGN_HEIGHT_ID = TARGET_OFFSET_ID + 1; + public static final int SURVEY_X_ID = TARGET_DESIGN_HEIGHT_ID + 1; + public static final int SURVEY_Y_ID = SURVEY_X_ID + 1; + public static final int SURVEY_Z_ID = SURVEY_Y_ID + 1; + public static final int SURVEY_MILEAGE_ID = SURVEY_Z_ID + 1; + public static final int SURVEY_OFFSET_ID = SURVEY_MILEAGE_ID + 1; + public static final int SURVEY_START_DISTANCE_ID = SURVEY_OFFSET_ID + 1; + public static final int SURVEY_END_DISTANCE_ID = SURVEY_START_DISTANCE_ID + 1; + public static final int SURVEY_PEDAL_ID = SURVEY_END_DISTANCE_ID + 1; + } +} diff --git a/app/src/main/java/com/project/survey/widget/bingce/dragdrop/ItemTouchHelperAdapter.java b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/ItemTouchHelperAdapter.java new file mode 100644 index 0000000..40cb819 --- /dev/null +++ b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/ItemTouchHelperAdapter.java @@ -0,0 +1,15 @@ +package com.project.survey.widget.bingce.dragdrop; + + +import androidx.recyclerview.widget.RecyclerView; + +public interface ItemTouchHelperAdapter { + + void onItemMove(RecyclerView.ViewHolder holder, int fromPosition, int targetPosition); + + void onItemSelect(RecyclerView.ViewHolder holder); + + void onItemClear(RecyclerView.ViewHolder holder); + + void onItemDismiss(RecyclerView.ViewHolder holder); +} diff --git a/app/src/main/java/com/project/survey/widget/bingce/dragdrop/SpaceItemDecoration.java b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/SpaceItemDecoration.java new file mode 100644 index 0000000..fbd04a2 --- /dev/null +++ b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/SpaceItemDecoration.java @@ -0,0 +1,33 @@ +package com.project.survey.widget.bingce.dragdrop; + +import android.graphics.Canvas; +import android.graphics.Rect; +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; + +public class SpaceItemDecoration extends RecyclerView.ItemDecoration { + + private int row = 1; + private int space = 1; + + public SpaceItemDecoration(int row, int space) { + this.row = row; + this.space = space; + } + + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { + outRect.left = space; + outRect.bottom = space; +// if (parent.getChildAdapterPosition(view) % row == 0) +// outRect.left = 0; + } + + @Override + public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { + super.onDrawOver(c, parent, state); + + } + +} diff --git a/app/src/main/java/com/project/survey/widget/bingce/dragdrop/SquareRelativeLayout.java b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/SquareRelativeLayout.java new file mode 100644 index 0000000..86361d1 --- /dev/null +++ b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/SquareRelativeLayout.java @@ -0,0 +1,27 @@ +package com.project.survey.widget.bingce.dragdrop; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.RelativeLayout; + +public class SquareRelativeLayout extends RelativeLayout { + public SquareRelativeLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + public SquareRelativeLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public SquareRelativeLayout(Context context) { + super(context); + } + + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(getDefaultSize(0, widthMeasureSpec),getDefaultSize(0, heightMeasureSpec)); + int childWidthSize = getMeasuredWidth(); + widthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidthSize, MeasureSpec.EXACTLY); + heightMeasureSpec = widthMeasureSpec; + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/widget/bingce/dragdrop/TabItem.java b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/TabItem.java new file mode 100644 index 0000000..8f2e5af --- /dev/null +++ b/app/src/main/java/com/project/survey/widget/bingce/dragdrop/TabItem.java @@ -0,0 +1,45 @@ +package com.project.survey.widget.bingce.dragdrop; + +import androidx.annotation.Keep; + +import java.util.ArrayList; + +/** + * Created by xulc on 2018/6/29. + */ +@Keep +public class TabItem { + private String tabName = ""; + private String tabTip = ""; + private ArrayList functionItems; + + public TabItem(String tabName, String tabTip, ArrayList functionItems) { + this.tabName = tabName; + this.tabTip = tabTip; + this.functionItems = functionItems; + } + + public String getTabName() { + return tabName; + } + + public void setTabName(String tabName) { + this.tabName = tabName; + } + + public String getTabTip() { + return tabTip; + } + + public void setTabTip(String tabTip) { + this.tabTip = tabTip; + } + + public ArrayList getFunctionItems() { + return functionItems; + } + + public void setFunctionItems(ArrayList functionItems) { + this.functionItems = functionItems; + } +} diff --git a/app/src/main/java/com/project/survey/widget/bingce/gaode/GaoDeBottomSheetBehavior.java b/app/src/main/java/com/project/survey/widget/bingce/gaode/GaoDeBottomSheetBehavior.java index 5e541e2..8d18ea1 100644 --- a/app/src/main/java/com/project/survey/widget/bingce/gaode/GaoDeBottomSheetBehavior.java +++ b/app/src/main/java/com/project/survey/widget/bingce/gaode/GaoDeBottomSheetBehavior.java @@ -33,13 +33,14 @@ import androidx.customview.view.AbsSavedState; import androidx.customview.widget.ViewDragHelper; import androidx.customview.widget.ViewDragHelper.Callback; +import com.project.survey.R; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.ref.WeakReference; import java.util.HashMap; import java.util.Map; -import cn.liuyanbing.surveyor.R; /** * 高德首页滑动效果 diff --git a/app/src/main/java/com/project/survey/widget/bingce/gaode/GaoDeBtnBehavior.java b/app/src/main/java/com/project/survey/widget/bingce/gaode/GaoDeBtnBehavior.java index 0fea88c..e3acab7 100644 --- a/app/src/main/java/com/project/survey/widget/bingce/gaode/GaoDeBtnBehavior.java +++ b/app/src/main/java/com/project/survey/widget/bingce/gaode/GaoDeBtnBehavior.java @@ -9,7 +9,8 @@ import androidx.appcompat.widget.LinearLayoutCompat; import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.view.ViewCompat; -import cn.liuyanbing.surveyor.R; +import com.project.survey.R; + /** * 高德首页按钮处理 diff --git a/app/src/main/res/anim/down_anim.xml b/app/src/main/res/anim/down_anim.xml new file mode 100644 index 0000000..9da1ec5 --- /dev/null +++ b/app/src/main/res/anim/down_anim.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_block_tab.xml b/app/src/main/res/drawable/bg_block_tab.xml new file mode 100644 index 0000000..f12e788 --- /dev/null +++ b/app/src/main/res/drawable/bg_block_tab.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_grid_press.xml b/app/src/main/res/drawable/bg_grid_press.xml new file mode 100644 index 0000000..cb6e1fa --- /dev/null +++ b/app/src/main/res/drawable/bg_grid_press.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_block_add.xml b/app/src/main/res/drawable/ic_block_add.xml new file mode 100644 index 0000000..6956b64 --- /dev/null +++ b/app/src/main/res/drawable/ic_block_add.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_block_delete.xml b/app/src/main/res/drawable/ic_block_delete.xml new file mode 100644 index 0000000..8abd5ba --- /dev/null +++ b/app/src/main/res/drawable/ic_block_delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_block_selected.xml b/app/src/main/res/drawable/ic_block_selected.xml new file mode 100644 index 0000000..baac986 --- /dev/null +++ b/app/src/main/res/drawable/ic_block_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/icon_black_line_more.xml b/app/src/main/res/drawable/icon_black_line_more.xml new file mode 100644 index 0000000..fc10a59 --- /dev/null +++ b/app/src/main/res/drawable/icon_black_line_more.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/icon_code_center_circle.xml b/app/src/main/res/drawable/icon_code_center_circle.xml new file mode 100644 index 0000000..97b77a6 --- /dev/null +++ b/app/src/main/res/drawable/icon_code_center_circle.xml @@ -0,0 +1,8 @@ + + + + diff --git a/app/src/main/res/drawable/icon_code_circle_empty.xml b/app/src/main/res/drawable/icon_code_circle_empty.xml new file mode 100644 index 0000000..8359ce9 --- /dev/null +++ b/app/src/main/res/drawable/icon_code_circle_empty.xml @@ -0,0 +1,7 @@ + + + diff --git a/app/src/main/res/drawable/icon_code_circle_full.xml b/app/src/main/res/drawable/icon_code_circle_full.xml new file mode 100644 index 0000000..141a89a --- /dev/null +++ b/app/src/main/res/drawable/icon_code_circle_full.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/icon_code_color_palette.xml b/app/src/main/res/drawable/icon_code_color_palette.xml new file mode 100644 index 0000000..c018ef6 --- /dev/null +++ b/app/src/main/res/drawable/icon_code_color_palette.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/icon_code_rhombus_empty.xml b/app/src/main/res/drawable/icon_code_rhombus_empty.xml new file mode 100644 index 0000000..7a7b8ce --- /dev/null +++ b/app/src/main/res/drawable/icon_code_rhombus_empty.xml @@ -0,0 +1,7 @@ + + + diff --git a/app/src/main/res/drawable/icon_code_rhombus_full.xml b/app/src/main/res/drawable/icon_code_rhombus_full.xml new file mode 100644 index 0000000..6ee8632 --- /dev/null +++ b/app/src/main/res/drawable/icon_code_rhombus_full.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/icon_code_rounded_five_star.xml b/app/src/main/res/drawable/icon_code_rounded_five_star.xml new file mode 100644 index 0000000..fe48896 --- /dev/null +++ b/app/src/main/res/drawable/icon_code_rounded_five_star.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/icon_code_square_empty.xml b/app/src/main/res/drawable/icon_code_square_empty.xml new file mode 100644 index 0000000..cf0e4b3 --- /dev/null +++ b/app/src/main/res/drawable/icon_code_square_empty.xml @@ -0,0 +1,7 @@ + + + diff --git a/app/src/main/res/drawable/icon_code_square_full.xml b/app/src/main/res/drawable/icon_code_square_full.xml new file mode 100644 index 0000000..e7cf19d --- /dev/null +++ b/app/src/main/res/drawable/icon_code_square_full.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/icon_code_straight_five_star.xml b/app/src/main/res/drawable/icon_code_straight_five_star.xml new file mode 100644 index 0000000..8811ae5 --- /dev/null +++ b/app/src/main/res/drawable/icon_code_straight_five_star.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/icon_code_triangle_down_empty.xml b/app/src/main/res/drawable/icon_code_triangle_down_empty.xml new file mode 100644 index 0000000..028b25e --- /dev/null +++ b/app/src/main/res/drawable/icon_code_triangle_down_empty.xml @@ -0,0 +1,7 @@ + + + diff --git a/app/src/main/res/drawable/icon_code_triangle_down_full.xml b/app/src/main/res/drawable/icon_code_triangle_down_full.xml new file mode 100644 index 0000000..26bb0c2 --- /dev/null +++ b/app/src/main/res/drawable/icon_code_triangle_down_full.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/icon_code_triangle_up_empty.xml b/app/src/main/res/drawable/icon_code_triangle_up_empty.xml new file mode 100644 index 0000000..78108ef --- /dev/null +++ b/app/src/main/res/drawable/icon_code_triangle_up_empty.xml @@ -0,0 +1,7 @@ + + + diff --git a/app/src/main/res/drawable/icon_code_triangle_up_full.xml b/app/src/main/res/drawable/icon_code_triangle_up_full.xml new file mode 100644 index 0000000..f82e2fd --- /dev/null +++ b/app/src/main/res/drawable/icon_code_triangle_up_full.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/icon_location_information_earth.xml b/app/src/main/res/drawable/icon_location_information_earth.xml new file mode 100644 index 0000000..7094dba --- /dev/null +++ b/app/src/main/res/drawable/icon_location_information_earth.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/icon_location_information_earth_gray.xml b/app/src/main/res/drawable/icon_location_information_earth_gray.xml new file mode 100644 index 0000000..6974dd0 --- /dev/null +++ b/app/src/main/res/drawable/icon_location_information_earth_gray.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/icon_remark_green.xml b/app/src/main/res/drawable/icon_remark_green.xml new file mode 100644 index 0000000..1215f50 --- /dev/null +++ b/app/src/main/res/drawable/icon_remark_green.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/icon_survey_paused.xml b/app/src/main/res/drawable/icon_survey_paused.xml new file mode 100644 index 0000000..5712e33 --- /dev/null +++ b/app/src/main/res/drawable/icon_survey_paused.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/shape_line_dp1.xml b/app/src/main/res/drawable/shape_line_dp1.xml new file mode 100644 index 0000000..74c4c7d --- /dev/null +++ b/app/src/main/res/drawable/shape_line_dp1.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_code.xml b/app/src/main/res/layout/activity_add_code.xml new file mode 100644 index 0000000..b40d20d --- /dev/null +++ b/app/src/main/res/layout/activity_add_code.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +