diff --git a/app/libs/DialogXInterface.jar b/app/libs/DialogXInterface.jar new file mode 100644 index 0000000..33d9b24 Binary files /dev/null and b/app/libs/DialogXInterface.jar differ diff --git a/app/src/main/java/com/project/survey/App.java b/app/src/main/java/com/project/survey/App.java index 5717758..305d156 100644 --- a/app/src/main/java/com/project/survey/App.java +++ b/app/src/main/java/com/project/survey/App.java @@ -38,6 +38,13 @@ public class App extends Application { */ public float magneticDeclination = 0; + public int lastRecordBrowseType = 0; + + /** + * 是否在记录界面显示当前工程全部数据 + */ + public boolean isShowAllRecordInCurrentProject = true; + public boolean isLandscape() { return false; } diff --git a/app/src/main/java/com/project/survey/dialog/CustomInputListDialog.java b/app/src/main/java/com/project/survey/dialog/CustomInputListDialog.java new file mode 100644 index 0000000..6a5d6d9 --- /dev/null +++ b/app/src/main/java/com/project/survey/dialog/CustomInputListDialog.java @@ -0,0 +1,215 @@ +package com.project.survey.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.text.InputType; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.bingce.ui.CleanableEditText; +import com.project.survey.R; +import com.project.survey.util.CommonUtils; + + +public class CustomInputListDialog extends Dialog { + + public CustomInputListDialog(Context context, int themeResId) { + super(context, themeResId); + } + + /* Builder */ + public static class Builder { + private TextView tvTitle,btnCancel,btnConfirm; + private CleanableEditText editText01, editText02, editText03; + private View mLayout; + private View.OnClickListener mButtonCancelClickListener; + private setOnConfirmClickListener mButtonConfirmClickListener; + private int inputFormat; + public static int INPUT_TYPE_TEXT = 0; + public static int INPUT_TYPE_DECIMAL = 1; + public static int INPUT_TYPE_INTEGER = 2; + public static int INPUT_TYPE_PM_DECIMAL = 3; + public static int INPUT_TYPE_PM_INTEGER = 4; + private CustomInputListDialog mDialog; + + public Builder(Context context) { + mDialog = new CustomInputListDialog(context, R.style.gif_dialog); + LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + // 加载布局文件 + mLayout = inflater.inflate(R.layout.layout_edit_input_list_dialog, null, false); + // 添加布局文件到 Dialog + mDialog.addContentView(mLayout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + + tvTitle = mLayout.findViewById(R.id.tv_title); + editText01 = mLayout.findViewById(R.id.editText01); + editText02 = mLayout.findViewById(R.id.editText02); + editText03 = mLayout.findViewById(R.id.editText03); + btnCancel = mLayout.findViewById(R.id.tv_cancel); + btnConfirm = mLayout.findViewById(R.id.tv_confirm); + } + + public Builder setInputFormat(int inputFormat){ + this.inputFormat = inputFormat; + return this; + } + + + /** + * 设置 Dialog 标题 + */ + public Builder setTitle(String title) { + tvTitle.setText(title); + tvTitle.setVisibility(View.VISIBLE); + return this; + } + + /** + * 设置 默认值 + * @param editTextContent + * @return + */ + public Builder setInputText01(String editTextContent) { + editText01.setText(editTextContent); + return this; + } + + public Builder setInputText01(double editTextContent) { + editText01.setText(String.valueOf(editTextContent)); + return this; + } + + /** + * 设置 hint + */ + public Builder setInputHint01(String editHint) { + editText01.setHint(editHint); + return this; + } + + /** + * 设置 默认值 + * @param editTextContent + * @return + */ + public Builder setInputText02(String editTextContent) { + editText02.setText(editTextContent); + return this; + } + + public Builder setInputText02(double editTextContent) { + editText02.setText(String.valueOf(editTextContent)); + return this; + } + + /** + * 设置 hint + */ + public Builder setInputHint02(String editHint) { + editText02.setHint(editHint); + return this; + } + + /** + * 设置 默认值 + * @param editTextContent + * @return + */ + public Builder setInputText03(String editTextContent) { + editText03.setText(editTextContent); + return this; + } + + public Builder setInputText03(double editTextContent) { + editText03.setText(String.valueOf(editTextContent)); + return this; + } + + /** + * 设置 hint + */ + public Builder setInputHint03(String editHint) { + editText03.setHint(editHint); + return this; + } + + /** + * 设置取消按钮文字和监听 + */ + public Builder setButtonCancel(String text) { + btnCancel.setText(text); + return this; + } + + public Builder setButtonCancel(View.OnClickListener listener) { + mButtonCancelClickListener = listener; + return this; + } + + /** + * 设置确认按钮文字和监听 + */ + public Builder setButtonConfirm(setOnConfirmClickListener listener) { + mButtonConfirmClickListener = listener; + return this; + } + + public CustomInputListDialog create() { + + switch (inputFormat){ + case 1: //正小数限制 + editText01.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); + editText02.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); + editText03.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); + break; + case 2: //正整数限制 + editText01.setInputType(InputType.TYPE_CLASS_NUMBER); + editText02.setInputType(InputType.TYPE_CLASS_NUMBER); + editText03.setInputType(InputType.TYPE_CLASS_NUMBER); + break; + case 3: //正负小数限制 + editText01.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); + editText02.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); + editText03.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); + break; + case 4: //正负整数限制 + editText01.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER); + editText02.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER); + editText03.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER); + break; + } + + btnCancel.setOnClickListener(view -> { + CommonUtils.hideSoftInput(); + mDialog.dismiss(); + if (mButtonCancelClickListener != null) { + mButtonCancelClickListener.onClick(view); + } + }); + + btnConfirm.setOnClickListener(view -> { + String inputText01 = editText01.getText().toString(); + String inputText02 = editText02.getText().toString(); + String inputText03 = editText03.getText().toString(); + if (!TextUtils.isEmpty(inputText01) && !TextUtils.isEmpty(inputText02) && !TextUtils.isEmpty(inputText03)) { + CommonUtils.hideSoftInput(); + mDialog.dismiss(); + } + if (mButtonConfirmClickListener != null) { + mButtonConfirmClickListener.OnConfirmClick(inputText01, inputText02, inputText03); + } + }); + + mDialog.setContentView(mLayout); + mDialog.setCancelable(true); + mDialog.setCanceledOnTouchOutside(false); + return mDialog; + } + } + + public interface setOnConfirmClickListener{ + void OnConfirmClick(String editText01, String editText02, String editText03); + } +} diff --git a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/PointStakingActivity.java b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/PointStakingActivity.java index 5c96d9a..df8f1b0 100644 --- a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/PointStakingActivity.java +++ b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/PointStakingActivity.java @@ -11,6 +11,7 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.DashPathEffect; +import android.text.TextUtils; import android.view.View; import androidx.preference.PreferenceManager; @@ -49,7 +50,6 @@ import com.bingce.surveyor.util.DeviceConnectUtil; import com.bingce.surveyor.util.PreferencesUtil; import com.bingce.surveyor.util.SurveyLimitCheckUtils; import com.bingce.surveyor.util.SurveyRemarksUtils; -import com.bingce.surveyor.util.SurveyUIUtils; import com.bingce.surveyor.util.dialog.CustomDialog; import com.bingce.surveyor.util.dialog.CustomRecycleDialog; import com.bingce.totalstation.TotalStation; @@ -62,12 +62,19 @@ import com.bingce.utils.Util; import com.project.survey.App; import com.project.survey.R; import com.project.survey.databinding.ActivityPointStakingBinding; +import com.project.survey.dialog.CustomInputListDialog; +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.ControlPointsNewActivity; import com.project.survey.ui.instrument.setupstation.CoordinatePointsLibraryActivity; import com.project.survey.ui.instrument.setupstation.StakingNewJobActivity; +import com.project.survey.ui.lofting.pointlofting.record.RecordsActivity; +import com.project.survey.ui.lofting.pointlofting.record.util.RecordTypeConstants; 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 java.util.ArrayList; import java.util.Date; @@ -83,6 +90,7 @@ import lecho.hellocharts.model.LineChartData; import lecho.hellocharts.model.PointValue; import lecho.hellocharts.renderer.LineChartRenderer; + /** * 点放样 测量 */ @@ -376,9 +384,9 @@ public class PointStakingActivity extends BaseSurveyNewActivity { return; } String content = getString(R.string.whether_staking_selected_point) + getString(R.string.colon) + stakingLibraryPointList.get(pointIndex).name + "\n" - + "X" + getString(R.string.colon) + Util.formatDouble2Double(stakingLibraryPointList.get(pointIndex).x, ((App) Utils.getApp()).notNumber()) + " " - + "Y" + getString(R.string.colon) + Util.formatDouble2Double(stakingLibraryPointList.get(pointIndex).y, ((App) Utils.getApp()).notNumber()) + "\n" - + "Z" + getString(R.string.colon) + Util.formatDouble2Double(stakingLibraryPointList.get(pointIndex).h, ((App) Utils.getApp()).notNumber()); + + "X" + getString(R.string.colon) + Util.formatDouble2Double(stakingLibraryPointList.get(pointIndex).x, 6) + " " + + "Y" + getString(R.string.colon) + Util.formatDouble2Double(stakingLibraryPointList.get(pointIndex).y, 6) + "\n" + + "Z" + getString(R.string.colon) + Util.formatDouble2Double(stakingLibraryPointList.get(pointIndex).h, 6); builder.setContent(content).setButtonConfirm(v -> { targetStakePointRecord = stakingLibraryPointList.get(pointIndex); updateUI(); @@ -790,7 +798,7 @@ public class PointStakingActivity extends BaseSurveyNewActivity { } PointStakingLogic.Result result = pointStakingLogic.calculate(cachedRoad.roadEditor(), - new PointStakingLogic.Configs(((App) Utils.getApp()).notNumber(), moveType), + new PointStakingLogic.Configs(6, moveType), new PointStakingLogic.Parameter( new MeasuredPoint(currentCoordinate.getX(), currentCoordinate.getY(), currentCoordinate.getZ(), currentCoordinate.getName()), new StakingPoint(targetStakePointRecord.name, -1, "", targetStakePointRecord.x, targetStakePointRecord.y, targetStakePointRecord.h), @@ -810,15 +818,15 @@ public class PointStakingActivity extends BaseSurveyNewActivity { targetCompassHelper.updateTargetAzimuth(result.targetAzimuth); - distance = TextFactory.distanceFormatDouble2String(getString(R.string.distance) + getString(R.string.colon), PointUtils.getDistance2D(new BasePoint(targetStakePointRecord.x, targetStakePointRecord.y, targetStakePointRecord.h), new BasePoint(currentCoordinate.getX(), currentCoordinate.getY(), currentCoordinate.getZ())), ((App) Utils.getApp()).notNumber()); + distance = TextFactory.distanceFormatDouble2String(getString(R.string.distance) + getString(R.string.colon), PointUtils.getDistance2D(new BasePoint(targetStakePointRecord.x, targetStakePointRecord.y, targetStakePointRecord.h), new BasePoint(currentCoordinate.getX(), currentCoordinate.getY(), currentCoordinate.getZ())), 6); binding.tvDistance.setText(distance); moveDigFill = currentCoordinate.getZ() > targetStakePointRecord.h - ? TextFactory.distanceFormatDouble2String(getString(R.string.down_dig), currentCoordinate.getZ() - targetStakePointRecord.h, ((App) Utils.getApp()).notNumber()) - : TextFactory.distanceFormatDouble2String(getString(R.string.up_fill), targetStakePointRecord.h - currentCoordinate.getZ(), ((App) Utils.getApp()).notNumber()); + ? TextFactory.distanceFormatDouble2String(getString(R.string.down_dig), currentCoordinate.getZ() - targetStakePointRecord.h, 6) + : TextFactory.distanceFormatDouble2String(getString(R.string.up_fill), targetStakePointRecord.h - currentCoordinate.getZ(), 6); binding.tvDigFill.setText(currentCoordinate.getZ() > targetStakePointRecord.h - ? TextFactory.distanceFormatDouble2String(getString(R.string.down_dig) + getString(R.string.colon), currentCoordinate.getZ() - targetStakePointRecord.h, ((App) Utils.getApp()).notNumber()) - : TextFactory.distanceFormatDouble2String(getString(R.string.up_fill) + getString(R.string.colon), targetStakePointRecord.h - currentCoordinate.getZ(), ((App) Utils.getApp()).notNumber())); + ? TextFactory.distanceFormatDouble2String(getString(R.string.down_dig) + getString(R.string.colon), currentCoordinate.getZ() - targetStakePointRecord.h, 6) + : TextFactory.distanceFormatDouble2String(getString(R.string.up_fill) + getString(R.string.colon), targetStakePointRecord.h - currentCoordinate.getZ(), 6)); if (Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_TS) { switch (PreferencesUtil.getMoveMethodTypeTS()) { @@ -840,8 +848,8 @@ public class PointStakingActivity extends BaseSurveyNewActivity { while (display_station_angle >= Math.PI * 2) display_station_angle -= Math.PI * 2; double measured_angle = CoordUtil.calcAzimuth(TsConfig.getInstance().getStation(), currentCoordinate); - binding.tvTopFive.setText(getString(R.string.station_angle) + getString(R.string.colon) + Util.radianToDmsString(display_station_angle, ((App) Utils.getApp()).angleNotNumber())); - binding.tvTopSix.setText(getString(R.string.station_angle_diff) + getString(R.string.colon) + Util.radianToDmsString(station_angle - measured_angle, ((App) Utils.getApp()).angleNotNumber(), false)); + binding.tvTopFive.setText(getString(R.string.station_angle) + getString(R.string.colon) + Util.radianToDmsString(display_station_angle, 6)); + binding.tvTopSix.setText(getString(R.string.station_angle_diff) + getString(R.string.colon) + Util.radianToDmsString(station_angle - measured_angle, 6, false)); } else { switch (PreferencesUtil.getMoveMethodTypeRTK()) { case 0: @@ -874,39 +882,39 @@ public class PointStakingActivity extends BaseSurveyNewActivity { double foreBackMoveValue = moveDistance.getX(); moveBeforeAfter = foreBackMoveValue >= 0 - ? TextFactory.distanceFormatDouble2String(getString(R.string.to_before), Math.abs(foreBackMoveValue), ((App) Utils.getApp()).notNumber()) - : TextFactory.distanceFormatDouble2String(getString(R.string.to_after), Math.abs(foreBackMoveValue), ((App) Utils.getApp()).notNumber()); + ? TextFactory.distanceFormatDouble2String(getString(R.string.to_before), Math.abs(foreBackMoveValue), 6) + : TextFactory.distanceFormatDouble2String(getString(R.string.to_after), Math.abs(foreBackMoveValue), 6); binding.tvTopThree.setText(foreBackMoveValue >= 0 - ? TextFactory.distanceFormatDouble2String(getString(R.string.to_before) + getString(R.string.colon), Math.abs(foreBackMoveValue), ((App) Utils.getApp()).notNumber()) - : TextFactory.distanceFormatDouble2String(getString(R.string.to_after) + getString(R.string.colon), Math.abs(foreBackMoveValue), ((App) Utils.getApp()).notNumber())); + ? TextFactory.distanceFormatDouble2String(getString(R.string.to_before) + getString(R.string.colon), Math.abs(foreBackMoveValue), 6) + : TextFactory.distanceFormatDouble2String(getString(R.string.to_after) + getString(R.string.colon), Math.abs(foreBackMoveValue), 6)); double leftRightValue = moveDistance.getY(); moveLeftRight = leftRightValue >= 0 - ? TextFactory.distanceFormatDouble2String(getString(R.string.to_right), Math.abs(leftRightValue), ((App) Utils.getApp()).notNumber()) - : TextFactory.distanceFormatDouble2String(getString(R.string.to_left), Math.abs(leftRightValue), ((App) Utils.getApp()).notNumber()); + ? TextFactory.distanceFormatDouble2String(getString(R.string.to_right), Math.abs(leftRightValue), 6) + : TextFactory.distanceFormatDouble2String(getString(R.string.to_left), Math.abs(leftRightValue), 6); binding.tvTopFour.setText(leftRightValue >= 0 - ? TextFactory.distanceFormatDouble2String(getString(R.string.to_right) + getString(R.string.colon), Math.abs(leftRightValue), ((App) Utils.getApp()).notNumber()) - : TextFactory.distanceFormatDouble2String(getString(R.string.to_left) + getString(R.string.colon), Math.abs(leftRightValue), ((App) Utils.getApp()).notNumber())); + ? TextFactory.distanceFormatDouble2String(getString(R.string.to_right) + getString(R.string.colon), Math.abs(leftRightValue), 6) + : TextFactory.distanceFormatDouble2String(getString(R.string.to_left) + getString(R.string.colon), Math.abs(leftRightValue), 6)); } private void moveWestEast() { moveWestEast = currentCoordinate.getY() > targetStakePointRecord.y - ? TextFactory.distanceFormatDouble2String(getString(R.string.to_west), currentCoordinate.getY() - targetStakePointRecord.y, ((App) Utils.getApp()).notNumber()) - : TextFactory.distanceFormatDouble2String(getString(R.string.to_east), targetStakePointRecord.y - currentCoordinate.getY(), ((App) Utils.getApp()).notNumber()); + ? TextFactory.distanceFormatDouble2String(getString(R.string.to_west), currentCoordinate.getY() - targetStakePointRecord.y, 6) + : TextFactory.distanceFormatDouble2String(getString(R.string.to_east), targetStakePointRecord.y - currentCoordinate.getY(), 6); moveSouthNorth = currentCoordinate.getX() > targetStakePointRecord.x - ? TextFactory.distanceFormatDouble2String(getString(R.string.to_south), currentCoordinate.getX() - targetStakePointRecord.x, ((App) Utils.getApp()).notNumber()) - : TextFactory.distanceFormatDouble2String(getString(R.string.to_north), targetStakePointRecord.x - currentCoordinate.getX(), ((App) Utils.getApp()).notNumber()); + ? TextFactory.distanceFormatDouble2String(getString(R.string.to_south), currentCoordinate.getX() - targetStakePointRecord.x,6) + : TextFactory.distanceFormatDouble2String(getString(R.string.to_north), targetStakePointRecord.x - currentCoordinate.getX(), 6); binding.tvTopThree.setText(currentCoordinate.getY() > targetStakePointRecord.y - ? TextFactory.distanceFormatDouble2String(getString(R.string.to_west) + getString(R.string.colon), currentCoordinate.getY() - targetStakePointRecord.y, ((App) Utils.getApp()).notNumber()) - : TextFactory.distanceFormatDouble2String(getString(R.string.to_east) + getString(R.string.colon), targetStakePointRecord.y - currentCoordinate.getY(), ((App) Utils.getApp()).notNumber())); + ? TextFactory.distanceFormatDouble2String(getString(R.string.to_west) + getString(R.string.colon), currentCoordinate.getY() - targetStakePointRecord.y, 6) + : TextFactory.distanceFormatDouble2String(getString(R.string.to_east) + getString(R.string.colon), targetStakePointRecord.y - currentCoordinate.getY(), 6)); binding.tvTopFour.setText(currentCoordinate.getX() > targetStakePointRecord.x - ? TextFactory.distanceFormatDouble2String(getString(R.string.to_south) + getString(R.string.colon), currentCoordinate.getX() - targetStakePointRecord.x, ((App) Utils.getApp()).notNumber()) - : TextFactory.distanceFormatDouble2String(getString(R.string.to_north) + getString(R.string.colon), targetStakePointRecord.x - currentCoordinate.getX(), ((App) Utils.getApp()).notNumber())); + ? TextFactory.distanceFormatDouble2String(getString(R.string.to_south) + getString(R.string.colon), currentCoordinate.getX() - targetStakePointRecord.x, 6) + : TextFactory.distanceFormatDouble2String(getString(R.string.to_north) + getString(R.string.colon), targetStakePointRecord.x - currentCoordinate.getX(), 6)); } /** @@ -920,13 +928,13 @@ public class PointStakingActivity extends BaseSurveyNewActivity { private void updateBottomInfo(String stakingName, double x, double y, double z) { if (!TextUtils.isEmpty(stakingName)) { binding.tvStakingPointName.setText(getString(R.string.staking_point_name) + getString(R.string.colon) + stakingName); - binding.tvTargetX.setText(TextFactory.distanceFormatDouble2String("X" + getString(R.string.colon), x, ((App) Utils.getApp()).notNumber())); - binding.tvTargetY.setText(TextFactory.distanceFormatDouble2String("Y" + getString(R.string.colon), y, ((App) Utils.getApp()).notNumber())); - binding.tvTargetZ.setText(TextFactory.distanceFormatDouble2String("Z" + getString(R.string.colon), z, ((App) Utils.getApp()).notNumber())); + binding.tvTargetX.setText(TextFactory.distanceFormatDouble2String("X" + getString(R.string.colon), x, 6)); + binding.tvTargetY.setText(TextFactory.distanceFormatDouble2String("Y" + getString(R.string.colon), y, 6)); + binding.tvTargetZ.setText(TextFactory.distanceFormatDouble2String("Z" + getString(R.string.colon), z, 6)); } else { - binding.tvSurveyX.setText(TextFactory.distanceFormatDouble2String("X" + getString(R.string.colon), x, ((App) Utils.getApp()).notNumber())); - binding.tvSurveyY.setText(TextFactory.distanceFormatDouble2String("Y" + getString(R.string.colon), y, ((App) Utils.getApp()).notNumber())); - binding.tvSurveyZ.setText(TextFactory.distanceFormatDouble2String("Z" + getString(R.string.colon), z, ((App) Utils.getApp()).notNumber())); + binding.tvSurveyX.setText(TextFactory.distanceFormatDouble2String("X" + getString(R.string.colon), x, 6)); + binding.tvSurveyY.setText(TextFactory.distanceFormatDouble2String("Y" + getString(R.string.colon), y, 6)); + binding.tvSurveyZ.setText(TextFactory.distanceFormatDouble2String("Z" + getString(R.string.colon), z, 6)); } } @@ -961,7 +969,7 @@ public class PointStakingActivity extends BaseSurveyNewActivity { effectGuideLine.getValues().add(new PointValue(y, x)); effectGuideLine.getValues().add(new PointValue(targetStakePointRecord.y, targetStakePointRecord.x)); - double distance2D = Util.formatDouble2Double(PointUtils.getDistance2D(new BasePoint(targetStakePointRecord.x, targetStakePointRecord.y), new BasePoint(x, y)), ((App) Utils.getApp()).notNumber()); + double distance2D = Util.formatDouble2Double(PointUtils.getDistance2D(new BasePoint(targetStakePointRecord.x, targetStakePointRecord.y), new BasePoint(x, y)), 6); double disTipsRange2D = Double.parseDouble(PreferencesUtil.getPointStakingTipsRangeLimit()); if (distance2D <= disTipsRange2D) { @@ -1033,8 +1041,8 @@ public class PointStakingActivity extends BaseSurveyNewActivity { DeviceUtils.StationData stationData = DeviceUtils.stationData( new BasePoint(targetStakePointRecord.x, targetStakePointRecord.y, targetStakePointRecord.h), - ((App) Utils.getApp()).angleNotNumber(), - ((App) Utils.getApp()).notNumber()); + 6, + 6); DeviceInfoData deviceInfoData = DeviceUtils.collectDeviceInfo(); PointStakeRecord pointStakeRecord = new PointStakeRecord(projectId, jobId, roadId, targetStakePointRecord.id, moveBeforeAfter != null ? moveBeforeAfter.getString() : "", moveLeftRight != null ? moveLeftRight.getString() : "", moveWestEast != null ? moveWestEast.getString() : "", moveSouthNorth != null ? moveSouthNorth.getString() : "", diff --git a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/RecordDetailActivity.java b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/RecordDetailActivity.java new file mode 100644 index 0000000..25ea570 --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/RecordDetailActivity.java @@ -0,0 +1,171 @@ +package com.project.survey.ui.lofting.pointlofting.record; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; + +import androidx.annotation.Nullable; + +import com.bingce.activity.AutoLandscapeBingCeActivity; +import com.bingce.data.cache.CachedCurrentJob; +import com.bingce.data.cache.CachedCurrentProject; +import com.bingce.utils.IntentUtil; +import com.bingce.utils.StringUtil; +import com.bingce.utils.ThreadPoolUtil; +import com.bingce.utils.Util; +import com.project.survey.R; +import com.project.survey.databinding.ActivityRecordDetailBinding; +import com.project.survey.ui.lofting.pointlofting.record.util.IRecordsUtils; +import com.project.survey.ui.lofting.pointlofting.record.util.RecordDetailActivityRemarksUtils; +import com.project.survey.ui.lofting.pointlofting.record.util.RecordDetailData; +import com.project.survey.ui.lofting.pointlofting.record.util.RecordsUtilsFactory; + +import java.util.Date; +import java.util.Map; + +import blankj.utilcode.util.ToastUtils; + +public class RecordDetailActivity extends AutoLandscapeBingCeActivity { + private RecordDetailData mCurrentData = null; + private ActivityRecordDetailBinding binding; + + private final Map recordsUtilsMap = RecordsUtilsFactory.buildUtils(this, null); + + @Override + protected void onBingCeCreate(@Nullable Bundle savedInstanceState) { + binding = ActivityRecordDetailBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + setSupportActionBar(binding.toolbar); + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + int mType = IntentUtil.intExtra(getIntent(), KEY_TYPE); + String recordId = IntentUtil.stringExtra(getIntent(), KEY_ID); + if (StringUtil.isEmpty(recordId)) { + ToastUtils.showShort(R.string.no_record); + finish(); + return; + } + IRecordsUtils recordsUtils = recordsUtilsMap.get(mType); + + ThreadPoolUtil.execute(() -> { + if (recordsUtils != null) { + RecordDetailData detailData = recordsUtils.findRecordDetailInWorkerThread(recordId); + setRecord(detailData); + } + }); + + //设置标题 + if (recordsUtils != null) { + setTitle(getString(R.string.record_detail) + "-" + recordsUtils.name()); + } + } + + protected void setRecord(RecordDetailData results) { + if (results != null) { + mCurrentData = results; + } else { + ToastUtils.showShort(R.string.no_record); + return; + } + StringBuilder stringBuilder = new StringBuilder(); + for (Map.Entry entry : results.keyValueMap.entrySet()) { + stringBuilder.append(entry.getKey()).append(":").append(entry.getValue()).append("\n"); + } + runOnUiThread(() -> { + if (results.deviceInfoData != null && results.deviceInfoData.tsStatusData != null) { + stringBuilder.append(getString(R.string.hr)).append(":").append(Util.formatDouble2StringDotAuto(results.deviceInfoData.tsStatusData.hr)); + } + binding.activityRecordDetailTextview.setText(stringBuilder.toString()); + }); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_record_detail, menu); + return true; + } + + protected void nextRecord(int mType, Date date) { + if (mCurrentData == null) { + ToastUtils.showShort(R.string.no_record); + return; + } + ThreadPoolUtil.execute(() -> { + String projectId = CachedCurrentProject.currentProjectId(); + String jobId = CachedCurrentJob.currentJobId(projectId); + IRecordsUtils recordsUtils = recordsUtilsMap.get(mType); + if (recordsUtils != null) { + RecordDetailData recordDetailData = recordsUtils.findOtherRecordDetailInWorkerThread( + projectId, jobId, date, true); + setRecord(recordDetailData); + } + }); + } + + protected void lastRecord(int mType, Date date) { + if (mCurrentData == null) { + ToastUtils.showShort(R.string.no_record); + return; + } + ThreadPoolUtil.execute(() -> { + String projectId = CachedCurrentProject.currentProjectId(); + String jobId = CachedCurrentJob.currentJobId(projectId); + IRecordsUtils recordsUtils = recordsUtilsMap.get(mType); + if (recordsUtils != null) { + RecordDetailData recordDetailData = recordsUtils.findOtherRecordDetailInWorkerThread( + projectId, jobId, date, false); + setRecord(recordDetailData); + } + }); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int mType = IntentUtil.intExtra(getIntent(), KEY_TYPE); + switch (item.getItemId()) { + case android.R.id.home: + finish(); + break; + case R.id.menu_record_detail_page_down: { + Date date = mCurrentData != null ? mCurrentData.date : null; + nextRecord(mType, date); + } + break; + case R.id.menu_record_detail_page_up: { + Date date = mCurrentData != null ? mCurrentData.date : null; + lastRecord(mType, date); + } + break; + case R.id.menu_record_detail_edit_remarks: { + if (mCurrentData != null) { + RecordDetailActivityRemarksUtils.changeRemarks(this, mCurrentData.remarks, remarks -> { + ThreadPoolUtil.execute(() -> { + IRecordsUtils recordsUtils = recordsUtilsMap.get(mType); + if (recordsUtils != null) { + mCurrentData = recordsUtils.updateRemarksInWorkerThread(mCurrentData.recordId, remarks); + //更新界面--主要是remarks + setRecord(mCurrentData); + } + }); + }); + } + } + break; + } + return super.onOptionsItemSelected(item); + } + + protected static final String KEY_TYPE = "TYPE"; + protected static final String KEY_ID = "recordId"; + + public static void start(Context context, int type, String recordId) { + Intent intent = startActivityIntent(context, RecordDetailActivity.class); + intent.putExtra(KEY_TYPE, type); + intent.putExtra(KEY_ID, recordId); + context.startActivity(intent); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/RecordsActivity.java b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/RecordsActivity.java index 23fed22..c7ed04e 100644 --- a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/RecordsActivity.java +++ b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/RecordsActivity.java @@ -32,9 +32,17 @@ import com.bingce.utils.ThreadPoolUtil; import com.hjq.permissions.Permission; import com.hjq.permissions.XXPermissions; import com.hjq.shape.view.ShapeTextView; +import com.project.survey.App; +import com.project.survey.R; import com.project.survey.databinding.ActivityRecordsBinding; +import com.project.survey.ui.lofting.pointlofting.record.util.IRecordsUtils; +import com.project.survey.ui.lofting.pointlofting.record.util.RecordTypeConstants; +import com.project.survey.ui.lofting.pointlofting.record.util.RecordsActivityClearUtils; import com.project.survey.ui.lofting.pointlofting.record.util.RecordsActivityExportUtils; import com.project.survey.ui.lofting.pointlofting.record.util.RecordsActivityFilterUtils; +import com.project.survey.ui.lofting.pointlofting.record.util.RecordsActivityHeaders; +import com.project.survey.ui.lofting.pointlofting.record.util.RecordsUtilsFactory; +import com.project.survey.ui.lofting.pointlofting.record.util.RecordsViewModelKt; import org.polaric.colorful.ColorfulActivity; @@ -42,6 +50,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; import blankj.utilcode.util.ToastUtils; @@ -261,10 +270,10 @@ public class RecordsActivity extends ColorfulActivity { case R.id.menu_record_export: exportUtils.requestStoragePermission(this, exportSuccess()); break; - case R.id.menu_record_filter: - binding.spinner1.getSelectedItem().toString(); - filterUtils.showFilterDialog(this::updateRecyclerView); - break; +// case R.id.menu_record_filter: +// binding.spinner1.getSelectedItem().toString(); +// filterUtils.showFilterDialog(this::updateRecyclerView); +// break; case R.id.menu_record_clear: clearUtils.showClearDialog(() -> { ProgressDialog mProgressDialog = new ProgressDialog(this); @@ -361,4 +370,5 @@ public class RecordsActivity extends ColorfulActivity { public interface IExportSuccess { void showExportSuccessDialog(File file); } + } \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/AbstractListUtils.java b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/AbstractListUtils.java new file mode 100644 index 0000000..91b605d --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/AbstractListUtils.java @@ -0,0 +1,29 @@ +package com.project.survey.ui.lofting.pointlofting.record.util; + +import android.content.Context; + +import androidx.appcompat.app.AppCompatActivity; + +import com.bingce.device.ui.dialog.DialogUtil; +import com.bingce.list.SwipeDeletePagingListLayoutHelper; +import com.bingce.utils.AppCompatActivityProviderUtils; +import com.bingce.utils.IProvider; +import com.bingce.utils.ThreadPoolUtil; +import com.project.survey.R; + + +abstract class AbstractListUtils extends AppCompatActivityProviderUtils implements IRecordsUtils { + + AbstractListUtils(IProvider activityIProvider) { + super(activityIProvider); + } + + protected void requestDelete(Context context, int index, String recordId, SwipeDeletePagingListLayoutHelper.IOnDeleteListener listener) { + DialogUtil.mNullCancelAlertDialog(context, null, R.string.confirm_delete, (dialogInterface, i) -> { + ThreadPoolUtil.execute(() -> { + deleteSingleRecordInWorkerThread(recordId); + }); + listener.completeDelete(index); + }); + } +} diff --git a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/IRecordsUtils.java b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/IRecordsUtils.java new file mode 100644 index 0000000..55ea95c --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/IRecordsUtils.java @@ -0,0 +1,32 @@ +package com.project.survey.ui.lofting.pointlofting.record.util; + +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.data.base.user.UserConfig; +import com.project.survey.ui.lofting.pointlofting.record.RecordsActivity; + +import java.util.Date; + +public interface IRecordsUtils { + void update(RecyclerView recyclerView, boolean ascOrder,//asc升序 des,降序 + UserConfig userConfig, + String currentProjectId, String currentJobId, String currentRoadId, + RecordsActivityFilterParameter parameter); + + void clearInWorkerThread(RecordsActivityFilterParameter parameter, Runnable completeCallback); + + void exportRecord2ExcelAsync(final String name, boolean ascOrder,//asc升序 des,降序 + final RecordsActivityFilterParameter filterParameter, + final RecordsActivityHeaders headers, boolean isExportRtkStatus, boolean isExportHr, + final RecordsActivity.IExportSuccess exportSuccess); + + void deleteSingleRecordInWorkerThread(String recordId); + + String name(); + + RecordDetailData findRecordDetailInWorkerThread(String recordId); + + RecordDetailData findOtherRecordDetailInWorkerThread(String projectId, String jobId, Date date, boolean nextOrLast); + + RecordDetailData updateRemarksInWorkerThread(String recordId, String remarks); +} diff --git a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/KnownPointRecordExporter.java b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/KnownPointRecordExporter.java new file mode 100644 index 0000000..7d08ff7 --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/KnownPointRecordExporter.java @@ -0,0 +1,149 @@ +package com.project.survey.ui.lofting.pointlofting.record.util; + +import android.app.ProgressDialog; +import android.content.Context; + +import androidx.annotation.UiThread; + +import com.bingce.data.DeviceInfoDataUtils; +import com.bingce.data.cache.CachedCurrentJob; +import com.bingce.data.cache.CachedCurrentProject; +import com.bingce.data.database.PointStakeDb; +import com.bingce.data.surveyor.surveydata.pointstake.PointStakeConstants; +import com.bingce.data.surveyor.surveydata.pointstake.PointStakeRecord; +import com.bingce.poi.excel.ExcelExportHelper; +import com.bingce.rtk.model.GnssPosition; +import com.bingce.utils.DateUtils; +import com.bingce.utils.FileUtil; +import com.bingce.utils.Util; +import com.project.survey.R; +import com.project.survey.util.ExportPathUtils; +import com.project.survey.util.Utils; +import com.techyourchance.threadposter.BackgroundThreadPoster; +import com.techyourchance.threadposter.UiThreadPoster; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +public class KnownPointRecordExporter { + private final BackgroundThreadPoster mBackgroundThreadPoster = new BackgroundThreadPoster(); + private final UiThreadPoster mUiThreadPoster = new UiThreadPoster(); + private ProgressDialog mProgressDialog; + + public KnownPointRecordExporter() { + } + + @UiThread + public void exportKnownPointSetting2ExcelAsync( + final String name, boolean ascOrder, + String[] mHeaders61, + String[] mHeaders62, + String[] mHeaders63, + boolean isExportRtkStatus, + boolean isExportHr, + Context context, + RecordsActivityFilterParameter parameter, + ICallback callback) { + mProgressDialog = new ProgressDialog(context); + mProgressDialog.setMessage(context.getString(R.string.export_records)); + mProgressDialog.show(); + + mBackgroundThreadPoster.post(() -> { + String projectId = CachedCurrentProject.currentProjectId(); + String jobId = CachedCurrentJob.currentJobId(projectId); + List results = PointStakeDb.getInstance().rawQueryListData( + Utils.findRecordsListByRoadNameKRemarksDate( + PointStakeConstants.DB_NAME, projectId, jobId, ascOrder, parameter.road, parameter.k, parameter.remarks, parameter.start, parameter.end)); + if (results == null || results.isEmpty()) { + ToastUtils.showShort(R.string.export_result_empty); + hideLoading(context, null, null); + return; + } + + List> exportResult = new ArrayList<>(); + String[] headers = mHeaders61; + if (isExportRtkStatus) { + String[] temp = new String[headers.length + mHeaders62.length]; + System.arraycopy(headers, 0, temp, 0, headers.length); + System.arraycopy(mHeaders62, 0, temp, headers.length, mHeaders62.length); + headers = temp; + } + if (isExportHr) { + String[] temp = new String[headers.length + mHeaders63.length]; + System.arraycopy(headers, 0, temp, 0, headers.length); + System.arraycopy(mHeaders63, 0, temp, headers.length, mHeaders63.length); + headers = temp; + } + + for (int i = 0; i < results.size(); i++) { + ArrayList rowResult = new ArrayList<>(); + rowResult.add(results.get(i).roadName); + rowResult.add(results.get(i).pointName); + rowResult.add(Util.formatDouble2StringDotAuto(results.get(i).designX)); + rowResult.add(Util.formatDouble2StringDotAuto(results.get(i).designY)); + rowResult.add(Util.formatDouble2StringDotAuto(results.get(i).designZ)); + rowResult.add(Util.formatDouble2StringDotAuto(results.get(i).measuredX)); + rowResult.add(Util.formatDouble2StringDotAuto(results.get(i).measuredY)); + rowResult.add(Util.formatDouble2StringDotAuto(results.get(i).measuredZ)); + rowResult.add(results.get(i).distance); + rowResult.add(results.get(i).moveUpDown); + rowResult.add(results.get(i).moveK); + rowResult.add(results.get(i).moveD); + rowResult.add(results.get(i).moveWestEast); + rowResult.add(results.get(i).moveNorthSouth); + rowResult.add(results.get(i).moveForeBack); + rowResult.add(results.get(i).moveLeftRight); + rowResult.add(results.get(i).remarks); + rowResult.add(DateUtils.toFull(results.get(i).createDate)); + if (isExportRtkStatus) { + rowResult.add(DeviceInfoDataUtils.posTypeString(results.get(i).deviceInfoData, GnssPosition::posTypeString)); + rowResult.add(DeviceInfoDataUtils.stationTypeString(results.get(i).deviceInfoData)); + rowResult.add(DeviceInfoDataUtils.satelliteString(context, results.get(i).deviceInfoData)); + rowResult.add(DeviceInfoDataUtils.hrmsString(results.get(i).deviceInfoData)); + rowResult.add(DeviceInfoDataUtils.vrmsString(results.get(i).deviceInfoData)); + rowResult.add(DeviceInfoDataUtils.diffAgeString(context, results.get(i).deviceInfoData)); + rowResult.add(DeviceInfoDataUtils.electricityString(context, results.get(i).deviceInfoData)); + } + if (isExportHr) { + rowResult.add(DeviceInfoDataUtils.hrString(results.get(i).deviceInfoData)); + } + exportResult.add(rowResult); + } + if (!exportResult.isEmpty()) { + File exportFolder = new File(FileUtil.getSDPath(), context.getString(R.string.surveyor_exported_file) + + "/" + context.getString(R.string.record) + "/" + context.getString(R.string.known_point_staking)); + //过滤重名文件,如果有重名,添加后缀 + String exportFileName = ExportPathUtils.filterDuplicateFileName(exportFolder, name, "xls"); + + new ExcelExportHelper().exportExcelForBigDataAndSave(headers, exportResult, + context.getString(R.string.known_point_staking), + ExcelExportHelper.MORE_SHEET_FLAG, + FileUtil.getSDPath() + "/" + context.getString(R.string.surveyor_exported_file) + + "/" + context.getString(R.string.record) + "/" + context.getString(R.string.known_point_staking), + exportFileName); + hideLoading(context, exportFileName, callback); + } else { + ToastUtils.showShort(R.string.export_result_empty); + } + }); + } + + private void hideLoading(Context activity, String name, ICallback callback) { + mUiThreadPoster.post(() -> { + mProgressDialog.dismiss(); + File path = + new File(FileUtil.getSDPath() + "/" + activity.getString(R.string.surveyor_exported_file) + + "/" + activity.getString(R.string.record) + "/" + activity.getString(R.string.known_point_staking) + "/" + name + ".xls"); + if (path.exists()) { + callback.onSuccess(path); + } + }); + } + + public interface ICallback { + void onSuccess(File file); + } +} diff --git a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/PointStakeListUtils.java b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/PointStakeListUtils.java new file mode 100644 index 0000000..25999de --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/PointStakeListUtils.java @@ -0,0 +1,194 @@ +package com.project.survey.ui.lofting.pointlofting.record.util; + +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.RecyclerView; + +import com.bingce.data.base.user.UserConfig; +import com.bingce.data.cache.CachedCurrentJob; +import com.bingce.data.cache.CachedCurrentProject; +import com.bingce.data.database.DBQueryConstant; +import com.bingce.data.database.PointStakeDb; +import com.bingce.data.surveyor.surveydata.pointstake.PointStakeConstants; +import com.bingce.data.surveyor.surveydata.pointstake.PointStakeRecord; +import com.bingce.list.SwipeDeletePagingListLayoutHelper; +import com.bingce.utils.DateUtils; +import com.bingce.utils.FileUtil; +import com.bingce.utils.IProvider; +import com.bingce.utils.StringUtil; +import com.bingce.utils.Util; +import com.project.survey.R; +import com.project.survey.databinding.RecyclerviewItemRecordsBinding; +import com.project.survey.ui.lofting.pointlofting.record.RecordDetailActivity; +import com.project.survey.ui.lofting.pointlofting.record.RecordsActivity; + +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; + +import com.project.survey.util.StoragePermissionUtils; +import com.project.survey.util.Utils; + + +class PointStakeListUtils extends AbstractListUtils { + private final DiffUtil.ItemCallback callback = new Utils.ItemCallback<>(); + + PointStakeListUtils(IProvider activityIProvider) { + super(activityIProvider); + } + + @Override + public void update(RecyclerView recyclerView, boolean ascOrder,//asc升序 des,降序 + UserConfig userConfig, + String currentProjectId, String currentJobId, String currentRoadId, + RecordsActivityFilterParameter parameter) { + String road = parameter.road; + String k = parameter.k; + String remarks = parameter.remarks; + Date start = parameter.start; + Date end = parameter.end; + SwipeDeletePagingListLayoutHelper.setup(activity(), activity(), recyclerView, callback, + () -> PointStakeDb.getInstance().rawQueryPagingSource( + Utils.findRecordsListByRoadNameKRemarksDate( + PointStakeConstants.DB_NAME, currentProjectId, currentJobId, ascOrder, road, k, remarks, start, end)), + new SwipeDeletePagingListLayoutHelper.IViewHolder0() { + @Override + public RecordItemVH newItemContentVH(@NonNull ViewGroup parent, int viewType) { + return new RecordItemVH(RecyclerviewItemRecordsBinding.inflate(getLayoutInflater())); + } + + @Override + public void doBindContent(RecordItemVH viewHolder, PointStakeRecord record, int position) { + if (record == null) { + return; + } + String remarks = StringUtil.isEmpty(record.remarks) ? "" : record.remarks; + RecyclerViewItemData data = new RecyclerViewItemData(record.id, + record.pointName, + record.roadName, + Util.formatDouble2StringDotAuto(record.designX), + Util.formatDouble2StringDotAuto(record.designY), + Util.formatDouble2StringDotAuto(record.designZ), + getString(R.string.remarks) + ":" + (remarks.length() > 8 ? remarks.substring(0, 8) + "..." : remarks), + DateUtils.toFull(record.createDate)); + viewHolder.doBinder(data); + } + + @Override + public void onItemClicked(int index, PointStakeRecord instance) { + RecordDetailActivity.start(activity(), RecordTypeConstants.TYPE_POINT_STAKE, instance.id); + } + + @Override + public void onDelete(int index, PointStakeRecord instance, SwipeDeletePagingListLayoutHelper.IOnDeleteListener listener) { + requestDelete(activity(), index, instance.id, listener); + } + }); + } + + @Override + public void clearInWorkerThread(RecordsActivityFilterParameter parameter, Runnable completeCallback) { + String projectId = CachedCurrentProject.currentProjectId(); + String jobId = CachedCurrentJob.currentJobId(projectId); + List records = PointStakeDb.getInstance().rawQueryListData( + Utils.findRecordsListByRoadNameKRemarksDate( + PointStakeConstants.DB_NAME, projectId, jobId, false, parameter.road, parameter.k, parameter.remarks, parameter.start, parameter.end)); + PointStakeDb.getInstance().delete(records); +// activity().runOnUiThread(mProgressDialog::dismiss); + if (completeCallback != null) { + completeCallback.run(); + } + } + + @Override + public void exportRecord2ExcelAsync( + String name, boolean ascOrder, + RecordsActivityFilterParameter filterParameter, RecordsActivityHeaders headers, boolean isExportRtkStatus, boolean isExportHr, RecordsActivity.IExportSuccess exportSuccess) { + StoragePermissionUtils.checkStoragePermission(context(), () -> { + KnownPointRecordExporter exporter = new KnownPointRecordExporter(); + exporter.exportKnownPointSetting2ExcelAsync(name, ascOrder, + headers.mHeaders61, + headers.mHeaders62, + headers.mHeaders63, + isExportRtkStatus, + isExportHr, + context(), + filterParameter, + file -> { + FileUtil.scanFile(context(), file); +// showExportSuccessDialog(file); + exportSuccess.showExportSuccessDialog(file); + }); + }); + } + + @Override + public void deleteSingleRecordInWorkerThread(String recordId) { + PointStakeDb.getInstance().deleteById(recordId); + } + + @Override + public String name() { + return getString(R.string.known_point_staking); + } + + @Override + public RecordDetailData findRecordDetailInWorkerThread(String recordId) { + PointStakeRecord results = PointStakeDb.getInstance() + .rawQueryData(DBQueryConstant.findById(PointStakeConstants.DB_NAME, recordId)); + return convert(results); + } + + @Override + public RecordDetailData findOtherRecordDetailInWorkerThread(String projectId, String jobId, Date date, boolean nextOrLast) { + PointStakeRecord results = PointStakeDb.getInstance() + .rawQueryData(Utils.findOtherRecord(PointStakeConstants.DB_NAME, projectId, jobId, date, nextOrLast)); + return convert(results); + } + + @Override + public RecordDetailData updateRemarksInWorkerThread(String recordId, String remarks) { + PointStakeRecord results = PointStakeDb.getInstance() + .rawQueryData(DBQueryConstant.findById(PointStakeConstants.DB_NAME, recordId)); + if (results != null) { + results.remarks = remarks; + PointStakeDb.getInstance().save(results); + } + return convert(results); + } + + private RecordDetailData convert(PointStakeRecord results) { + if (results == null) { + return null; + } + LinkedHashMap map = new LinkedHashMap<>(); + map.put(getString(R.string.road_name), results.roadName); + map.put(getString(R.string.point_name), results.pointName); + map.put(getString(R.string.design_x), Util.formatDouble2StringDotAuto(results.designX)); + map.put(getString(R.string.design_y), Util.formatDouble2StringDotAuto(results.designY)); + map.put(getString(R.string.design_z), Util.formatDouble2StringDotAuto(results.designZ)); + map.put(getString(R.string.measured_x), Util.formatDouble2StringDotAuto(results.measuredX)); + map.put(getString(R.string.measured_y), Util.formatDouble2StringDotAuto(results.measuredY)); + map.put(getString(R.string.measured_z), Util.formatDouble2StringDotAuto(results.measuredZ)); + map.put(getString(R.string.distance), results.distance); + map.put(getString(R.string.move_up_down), results.moveUpDown); + if (!StringUtil.isEmpty(results.moveK) || !StringUtil.isEmpty(results.moveD)) { + map.put(getString(R.string.move_k), results.moveK); + map.put(getString(R.string.move_d), results.moveD); + } + if (!StringUtil.isEmpty(results.moveWestEast) || !StringUtil.isEmpty(results.moveNorthSouth)) { + map.put(getString(R.string.move_west_east), results.moveWestEast); + map.put(getString(R.string.move_north_south), results.moveNorthSouth); + } + if (!StringUtil.isEmpty(results.moveForeBack) || !StringUtil.isEmpty(results.moveLeftRight)) { + map.put(getString(R.string.move_fore_back), results.moveForeBack); + map.put(getString(R.string.move_left_right), results.moveLeftRight); + } + map.put(getString(R.string.remarks), results.remarks); + map.put(getString(R.string.record_time), DateUtils.toFull(results.createDate)); + return new RecordDetailData(results.id, map, results.deviceInfoData, results.createDate, results.remarks); + } +} diff --git a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordDetailActivityRemarksUtils.java b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordDetailActivityRemarksUtils.java index ab68240..0d558cb 100644 --- a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordDetailActivityRemarksUtils.java +++ b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordDetailActivityRemarksUtils.java @@ -5,14 +5,13 @@ import android.view.View; import android.widget.EditText; import com.afollestad.materialdialogs.MaterialDialog; - import com.bingce.utils.StringUtil; import com.project.survey.R; import com.project.survey.util.CommonUtils; -class RecordDetailActivityRemarksUtils { - static void changeRemarks(Context context, String remarks, IOnRemarksChanged remarksChanged) { +public class RecordDetailActivityRemarksUtils { + public static void changeRemarks(Context context, String remarks, IOnRemarksChanged remarksChanged) { MaterialDialog dialog = new MaterialDialog.Builder(context) .title(R.string.remarks) .customView(R.layout.dialog_edit_remarks, false) @@ -48,7 +47,7 @@ class RecordDetailActivityRemarksUtils { } } - interface IOnRemarksChanged { + public interface IOnRemarksChanged { void onChanged(String remarks); } } diff --git a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityClearUtils.java b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityClearUtils.java index 460224f..e56a8d3 100644 --- a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityClearUtils.java +++ b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityClearUtils.java @@ -8,9 +8,9 @@ import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.internal.MDButton; import com.bingce.utils.ContextProviderUtils; import com.bingce.utils.IProvider; +import com.project.survey.R; import blankj.utilcode.util.ToastUtils; -import cn.liuyanbing.surveyor.R; public class RecordsActivityClearUtils extends ContextProviderUtils { private MDButton mPositiveAction; @@ -22,7 +22,7 @@ public class RecordsActivityClearUtils extends ContextProviderUtils { this.currentTypeFromSpinner = currentTypeFromSpinner; } - void showClearDialog(Runnable clearCallback) { + public void showClearDialog(Runnable clearCallback) { if (isCloceFunction()) { ToastUtils.showShort("暂不支持"); return; diff --git a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityExportUtils.java b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityExportUtils.java index 34edf9f..1c12af8 100644 --- a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityExportUtils.java +++ b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityExportUtils.java @@ -14,14 +14,16 @@ import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.internal.MDButton; import com.bingce.file.FileOperator; - import com.bingce.utils.ContextProviderUtils; import com.bingce.utils.FileUtil; import com.bingce.utils.IProvider; import com.hjq.permissions.OnPermissionCallback; import com.hjq.permissions.Permission; import com.hjq.permissions.XXPermissions; +import com.project.survey.App; +import com.project.survey.BuildConfig; import com.project.survey.R; +import com.project.survey.ui.lofting.pointlofting.record.RecordsActivity; import com.rengwuxian.materialedittext.MaterialEditText; import java.io.File; @@ -178,6 +180,6 @@ public class RecordsActivityExportUtils extends ContextProviderUtils { } public interface IExportCallback { - void onExport(String name, boolean isExportRtkStatus, boolean isExportHr,RecordsActivity.IExportSuccess exportSuccess); + void onExport(String name, boolean isExportRtkStatus, boolean isExportHr, RecordsActivity.IExportSuccess exportSuccess); } } diff --git a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityFilterUtils.java b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityFilterUtils.java index 774c262..45b1c26 100644 --- a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityFilterUtils.java +++ b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityFilterUtils.java @@ -17,6 +17,7 @@ import com.kongzue.dialogx.dialogs.BottomDialog; import com.kongzue.dialogx.dialogs.BottomMenu; import com.kongzue.dialogx.interfaces.OnBindView; import com.kongzue.dialogx.interfaces.OnMenuItemClickListener; +import com.project.survey.App; import com.project.survey.R; import com.rengwuxian.materialedittext.MaterialEditText; @@ -168,9 +169,6 @@ public class RecordsActivityFilterUtils extends ContextProviderUtils { met_roadname_keyword = v.findViewById(R.id.met_dialog_records_filter_roadname_keyword); met_kilometer_keyword = v.findViewById(R.id.met_dialog_records_filter_kilometer_keyword); met_remarks_keyword = v.findViewById(R.id.met_dialog_records_filter_remarks_keyword); - if (isWaterPipKeyword()) { - met_roadname_keyword.setHint(R.string.water_pipe_name_keyword); - } met_roadname_keyword.setText(roadname_keyword); met_kilometer_keyword.setText(kilometer_keyword); met_remarks_keyword.setText(remarks_keyword); diff --git a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityHeaders.java b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityHeaders.java index 51d7d0d..2c3e62c 100644 --- a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityHeaders.java +++ b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityHeaders.java @@ -20,7 +20,7 @@ public class RecordsActivityHeaders extends ContextProviderUtils { super(contextIProvider); } - void initHeaders() { + public void initHeaders() { initSideCommonHeaders(); initSideFreedomHeaders(); initKnowPointSettingOutHeaders(); diff --git a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsUtilsFactory.java b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsUtilsFactory.java new file mode 100644 index 0000000..a939050 --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsUtilsFactory.java @@ -0,0 +1,24 @@ +package com.project.survey.ui.lofting.pointlofting.record.util; + +import androidx.appcompat.app.AppCompatActivity; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class RecordsUtilsFactory { + public static Map buildUtils(AppCompatActivity appCompatActivity) { + return buildUtils(appCompatActivity, recordType -> RecordTypeConstants.TYPE_MEASURING_TAPE != recordType); + } + + public static Map buildUtils(AppCompatActivity appCompatActivity, IFilter filter) { + return new LinkedHashMap() {{ + if (filter == null || filter.isValidate(RecordTypeConstants.TYPE_POINT_STAKE)) { + put(RecordTypeConstants.TYPE_POINT_STAKE, new PointStakeListUtils(() -> appCompatActivity)); + } + }}; + } + + public interface IFilter { + boolean isValidate(int recordType); + } +} diff --git a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsViewModelKt.kt b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsViewModelKt.kt new file mode 100644 index 0000000..de9a986 --- /dev/null +++ b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsViewModelKt.kt @@ -0,0 +1,94 @@ +package com.project.survey.ui.lofting.pointlofting.record.util + +import androidx.activity.viewModels +import androidx.annotation.WorkerThread +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.bingce.data.base.user.UserConfig +import com.bingce.data.database.DBQueryConstant +import com.bingce.data.database.RoadDb +import com.bingce.data.surveyor.designdata.road.RoadConstants +import com.bingce.data.surveyor.designdata.road.RoadRecord +import com.bingce.http.measuringtape.tryLoadMeasuringTapeRecord +import com.bingce.data.sync.utils.loadCurrentJobId +import com.bingce.data.sync.utils.loadCurrentProjectId +import com.bingce.data.sync.utils.loadCurrentRoadId +import com.bingce.data.sync.utils.loadUserConfig +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +class RecordsViewModelKt : ViewModel() { + fun loadRecordBaseInfo(callback: ILoadProjectJobRoadCallback) { + viewModelScope.launch(Dispatchers.IO) { + val data = loadRecordBaseData() ?: return@launch + val roadName = RoadDb.getInstance().rawQueryData( + DBQueryConstant.findById(RoadConstants.DB_NAME, data.roadId) + )?.name ?: return@launch + + callback.onLoadedInWorkThread(data.projectId, data.jobId, data.roadId, roadName) + } + } + + fun loadRecordBaseData(callback: ILoadProjectIdJobIdRoadRecordCallback) { + viewModelScope.launch(Dispatchers.IO) { + val data = loadRecordBaseData() ?: return@launch + val roadRecord = RoadDb.getInstance().rawQueryData( + DBQueryConstant.findById(RoadConstants.DB_NAME, data.roadId) + ) ?: return@launch + + callback.onLoadedInWorkThread(data.projectId, data.jobId, roadRecord) + } + } + + @WorkerThread + fun loadRecordBaseData(): RecordBaseData? { + val userConfig = loadUserConfig() + + val projectId = loadCurrentProjectId(true, userConfig) ?: return null + val jobId = loadCurrentJobId(projectId, true, userConfig) ?: return null + val roadId = loadCurrentRoadId(projectId, true, userConfig) ?: return null + return RecordBaseData(projectId, jobId, roadId) + } + + fun loadMeasuringTapeRecord(userConfig: UserConfig?, roadId: String) { + viewModelScope.launch(Dispatchers.IO) { + tryLoadMeasuringTapeRecord(userConfig, roadId) + } + } + + interface ILoadProjectJobRoadCallback { + @WorkerThread + fun onLoadedInWorkThread( + currentProjectId: String, + currentJobId: String, + currentRoadId: String, + currentRoadName: String + ) + } + + interface ILoadProjectIdJobIdRoadRecordCallback { + @WorkerThread + fun onLoadedInWorkThread( + currentProjectId: String, + currentJobId: String, + currentRoad: RoadRecord + ) + } + + data class RecordBaseData( + val projectId: String, + val jobId: String, + val roadId: String, + ) + + class HolderInFragment(fragment: Fragment) { + val viewModel: RecordsViewModelKt by fragment.viewModels() + } + + class HolderInActivity(activity: AppCompatActivity) { + val viewModel: RecordsViewModelKt by activity.viewModels() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/util/ExportPathUtils.java b/app/src/main/java/com/project/survey/util/ExportPathUtils.java new file mode 100644 index 0000000..ffc371d --- /dev/null +++ b/app/src/main/java/com/project/survey/util/ExportPathUtils.java @@ -0,0 +1,49 @@ +package com.project.survey.util; + +import android.content.Context; + +import com.bingce.utils.FileUtil; +import com.project.survey.R; + +import java.io.File; + + +public class ExportPathUtils { + public static File exportFolder(Context context, String folderName) { + File exportFolder = new File(FileUtil.getSDPath(), context.getString(R.string.surveyor_exported_file)); + if (!exportFolder.exists() && !exportFolder.mkdirs()) { + return backupExportFolder(context, folderName); + } + File folder = new File(exportFolder, folderName); + if (!folder.exists() && !folder.mkdirs()) { + return backupExportFolder(context, folderName); + } + return folder; + } + + private static File backupExportFolder(Context context, String folderName) { + File cachedFolder = new File(context.getExternalCacheDir(), folderName); + if (!cachedFolder.exists() && !cachedFolder.mkdirs()) { + return context.getExternalCacheDir(); + } + return cachedFolder; + } + + public static String filterDuplicateFileName(File folder, String fileName, String fileSuffix) { + if (folder == null || !folder.exists() || folder.isFile()) { + return fileName; + } + File file = new File(folder, fileName + "." + fileSuffix); + if (!file.exists() || file.isDirectory()) { + return fileName; + } + int index = 1; + while (true) { + file = new File(folder, fileName + "_" + index + "." + fileSuffix); + if (!file.exists() || file.isDirectory()) { + return fileName + "_" + index; + } + index++; + } + } +} diff --git a/app/src/main/java/com/project/survey/util/StoragePermissionUtils.java b/app/src/main/java/com/project/survey/util/StoragePermissionUtils.java new file mode 100644 index 0000000..a1d257c --- /dev/null +++ b/app/src/main/java/com/project/survey/util/StoragePermissionUtils.java @@ -0,0 +1,37 @@ +package com.project.survey.util; + +import android.content.Context; + +import com.hjq.permissions.OnPermissionCallback; +import com.hjq.permissions.Permission; +import com.hjq.permissions.XXPermissions; + +import java.util.List; + +import blankj.utilcode.util.ToastUtils; + +public class StoragePermissionUtils { + public static void checkStoragePermission(Context context, Runnable onGetPermissionCallback) { + XXPermissions.with(context) + .permission(Permission.MANAGE_EXTERNAL_STORAGE) + .request(new OnPermissionCallback() { + @Override + public void onGranted(List permissions, boolean all) { + if (onGetPermissionCallback != null) { + onGetPermissionCallback.run(); + } + } + + @Override + public void onDenied(List permissions, boolean never) { + if (never) { + ToastUtils.showShort("请手动授予文件读写权限"); + // 如果是被永久拒绝就跳转到应用权限系统设置页面 + XXPermissions.startPermissionActivity(context, permissions); + } else { + checkStoragePermission(context, onGetPermissionCallback); + } + } + }); + } +} diff --git a/app/src/main/java/com/project/survey/util/SurveyUIUtils.java b/app/src/main/java/com/project/survey/util/SurveyUIUtils.java index 9fafac5..115d36e 100644 --- a/app/src/main/java/com/project/survey/util/SurveyUIUtils.java +++ b/app/src/main/java/com/project/survey/util/SurveyUIUtils.java @@ -7,6 +7,8 @@ package com.project.survey.util; import android.view.View; +import androidx.fragment.app.FragmentActivity; + import com.bingce.device.Device; import com.bingce.device.enums.DeviceTypeEnum; import com.bingce.rtk.gnss.Gnss; @@ -37,7 +39,7 @@ public class SurveyUIUtils { return (int) (dpValue * scale + 0.5F); } - public static void updatePoleHrHeightDraggingToolBarLayout(PointSurveyNewActivity activity, boolean isExpand, LayoutPoleHrHeightBinding layoutPoleHrHeightBinding, + public static void updatePoleHrHeightDraggingToolBarLayout(FragmentActivity activity, boolean isExpand, LayoutPoleHrHeightBinding layoutPoleHrHeightBinding, LayoutDraggingButtonBinding layoutDraggingButtonBinding, LayoutBaseSurveyStakingSettingBinding layoutBaseSurveyStakingSettingBinding, boolean isJudgeIvSettingStatus, boolean isStakingPager, Object currentCoordinate) { diff --git a/app/src/main/java/com/project/survey/util/Utils.java b/app/src/main/java/com/project/survey/util/Utils.java new file mode 100644 index 0000000..5f8b8f0 --- /dev/null +++ b/app/src/main/java/com/project/survey/util/Utils.java @@ -0,0 +1,65 @@ +package com.project.survey.util; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; +import androidx.sqlite.db.SimpleSQLiteQuery; + +import com.bingce.data.database.DBQueryConstant; +import com.bingce.data.surveyor.BCSurveyWithDeviceInfoRecord; +import com.project.survey.App; + +import java.util.Date; + +public class Utils { + + static abstract class AbstractItemCallback extends DiffUtil.ItemCallback { + protected abstract String idOf(@NonNull T t); + + @Override + final public boolean areItemsTheSame(@NonNull T oldItem, @NonNull T newItem) { +// return oldItem.id.equals(newItem.id); + return idOf(oldItem).equals(idOf(newItem)); + } + + @Override + final public boolean areContentsTheSame(@NonNull T oldItem, @NonNull T newItem) { +// return oldItem.id.equals(newItem.id); + return idOf(oldItem).equals(idOf(newItem)); + } + } + + public static class ItemCallback extends AbstractItemCallback { + @Override + protected String idOf(@NonNull T t) { + return t.id; + } + } + + public static SimpleSQLiteQuery findRecordsListByRoadNameKRemarksDate( + String DB_NAME, String projectId, String jobId, boolean ascOrder,//asc升序 des,降序 + String roadName, String k, String remarks, Date start, Date end) { + if (((App) blankj.utilcode.util.Utils.getApp()).isShowAllRecordInCurrentProject) { + return DBQueryConstant.findRecordsListByProjectRoadNameKRemarksDate(DB_NAME, projectId, ascOrder, roadName, k, remarks, start, end); + } else { + return DBQueryConstant.findRecordsListByJobRoadNameKRemarksDate(DB_NAME, jobId, ascOrder, roadName, k, remarks, start, end); + } + } + + public static SimpleSQLiteQuery findRecordsListByRoadNameKRemarksDate( + String DB_NAME, String projectId, String jobId, boolean ascOrder,//asc升序 des,降序 + String roadName, String k, String remarks, Date start, Date end, String tcsType) { + if (((App) blankj.utilcode.util.Utils.getApp()).isShowAllRecordInCurrentProject) { + return DBQueryConstant.findRecordsListByProjectRoadNameKRemarksDate(DB_NAME, projectId, ascOrder, roadName, k, remarks, start, end, tcsType); + } else { + return DBQueryConstant.findRecordsListByJobRoadNameKRemarksDate(DB_NAME, jobId, ascOrder, roadName, k, remarks, start, end, tcsType); + } + } + + public static SimpleSQLiteQuery findOtherRecord(String DB_NAME, String projectId, String jobId, Date date, boolean nextOrLast) { + if (((App) blankj.utilcode.util.Utils.getApp()).isShowAllRecordInCurrentProject) { + return DBQueryConstant.findOtherRecordInProject(DB_NAME, projectId, date, nextOrLast); + } else { + return DBQueryConstant.findOtherRecordInJob(DB_NAME, jobId, date, nextOrLast); + } + } +} diff --git a/app/src/main/res/drawable/icon_sort_ascending.xml b/app/src/main/res/drawable/icon_sort_ascending.xml new file mode 100644 index 0000000..6f35987 --- /dev/null +++ b/app/src/main/res/drawable/icon_sort_ascending.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/layout/activity_record_detail.xml b/app/src/main/res/layout/activity_record_detail.xml new file mode 100644 index 0000000..35fd1f2 --- /dev/null +++ b/app/src/main/res/layout/activity_record_detail.xml @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/layout_edit_input_list_dialog.xml b/app/src/main/res/layout/layout_edit_input_list_dialog.xml new file mode 100644 index 0000000..61d9ad1 --- /dev/null +++ b/app/src/main/res/layout/layout_edit_input_list_dialog.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/spinner_dropdown_item_my_with_background.xml b/app/src/main/res/layout/spinner_dropdown_item_my_with_background.xml new file mode 100644 index 0000000..6b2396f --- /dev/null +++ b/app/src/main/res/layout/spinner_dropdown_item_my_with_background.xml @@ -0,0 +1,27 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_activity_records.xml b/app/src/main/res/menu/menu_activity_records.xml new file mode 100644 index 0000000..be9db81 --- /dev/null +++ b/app/src/main/res/menu/menu_activity_records.xml @@ -0,0 +1,20 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_record_detail.xml b/app/src/main/res/menu/menu_record_detail.xml new file mode 100644 index 0000000..ef779da --- /dev/null +++ b/app/src/main/res/menu/menu_record_detail.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7db301e..96da30f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -313,5 +313,31 @@ 线路名关键词 线路名里包含的关键词 里程关键词 + 未选择日期 + 确定删除所有当前筛选的记录? + 导出记录 + 无记录 + 记录详情 + 上一条 + 下一条 + 修改备注 + 已知点放样 + 记录默认显示7天内的,如需显示更多请点击右上角筛选 + 清空 + 删除…… + 请先断开正在连接的设备,再使用自定义输入实测点功能 + 输入实测点 + 请输入完整的坐标参数 + 是否放样所选点 + 请先添加或选择要放样的点 + 放样点采集中 + 是当前最近点。 + 已经是第一个放样点。 + 已经是最后一个放样点。 + 放样点 + 只需要输入K13,就可筛选出所以K13开头的记录,比如K13+345.6处的记录 + 备注关键词 + 备注里包含关键词的所有记录都将被筛选 + 排序 \ No newline at end of file