Compare commits

...

3 Commits

Author SHA1 Message Date
huangwei 35d14a481c 测试 9 months ago
huangwei 5670124f6d 点放样 9 months ago
huangwei 00a9e04425 点放样 9 months ago
  1. 2
      app/build.gradle
  2. BIN
      app/libs/DialogXInterface.jar
  3. BIN
      app/libs/base-java-release.aar
  4. BIN
      app/libs/base-release.aar
  5. BIN
      app/libs/device-release.aar
  6. BIN
      app/libs/device-ui-release.aar
  7. BIN
      app/libs/gson-release.aar
  8. BIN
      app/libs/totalstation-release.aar
  9. 49
      app/src/main/AndroidManifest.xml
  10. 27
      app/src/main/java/com/project/survey/App.java
  11. 215
      app/src/main/java/com/project/survey/dialog/CustomInputListDialog.java
  12. 24
      app/src/main/java/com/project/survey/ui/MainActivity.kt
  13. 2
      app/src/main/java/com/project/survey/ui/SplashActivity.kt
  14. 8
      app/src/main/java/com/project/survey/ui/base/BaseSurveyNewActivity.java
  15. 13
      app/src/main/java/com/project/survey/ui/instrument/basestationtranslation/RtkBaseCorrectActivity.java
  16. 6
      app/src/main/java/com/project/survey/ui/instrument/mobilestationmode/GnssConfigSetActivity.java
  17. 6
      app/src/main/java/com/project/survey/ui/instrument/setupstation/ControlPointsNewActivity.java
  18. 8
      app/src/main/java/com/project/survey/ui/instrument/setupstation/PointFilterActivity.java
  19. 82
      app/src/main/java/com/project/survey/ui/lofting/pointlofting/PointStakingActivity.java
  20. 171
      app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/RecordDetailActivity.java
  21. 18
      app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/RecordsActivity.java
  22. 29
      app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/AbstractListUtils.java
  23. 32
      app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/IRecordsUtils.java
  24. 149
      app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/KnownPointRecordExporter.java
  25. 194
      app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/PointStakeListUtils.java
  26. 7
      app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordDetailActivityRemarksUtils.java
  27. 4
      app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityClearUtils.java
  28. 6
      app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityExportUtils.java
  29. 4
      app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityFilterUtils.java
  30. 2
      app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsActivityHeaders.java
  31. 24
      app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsUtilsFactory.java
  32. 94
      app/src/main/java/com/project/survey/ui/lofting/pointlofting/record/util/RecordsViewModelKt.kt
  33. 49
      app/src/main/java/com/project/survey/util/ExportPathUtils.java
  34. 37
      app/src/main/java/com/project/survey/util/StoragePermissionUtils.java
  35. 4
      app/src/main/java/com/project/survey/util/SurveyUIUtils.java
  36. 65
      app/src/main/java/com/project/survey/util/Utils.java
  37. 12
      app/src/main/res/drawable/icon_sort_ascending.xml
  38. 31
      app/src/main/res/layout/activity_record_detail.xml
  39. 124
      app/src/main/res/layout/layout_edit_input_list_dialog.xml
  40. 27
      app/src/main/res/layout/spinner_dropdown_item_my_with_background.xml
  41. 20
      app/src/main/res/menu/menu_activity_records.xml
  42. 17
      app/src/main/res/menu/menu_record_detail.xml
  43. 26
      app/src/main/res/values/strings.xml

@ -14,6 +14,8 @@ android {
namespace "com.project.survey"
defaultConfig {
applicationId "com.bingce.controlnetwork"
minSdkVersion AndroidSdk.minSdkVersion
targetSdkVersion AndroidSdk.targetSdkVersion
ndk {}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -146,6 +146,55 @@
android:name=".ui.lofting.pointlofting.PointStakingActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name=".ui.instrument.setupstation.SetupStationInputActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name=".ui.instrument.setupstation.SetupStationKnownBackSightActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name=".ui.instrument.setupstation.SetupStationResectionActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name=".ui.instrument.setupstation.SetupStationResectionSubActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name=".ui.instrument.setupstation.ControlPointsNewActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name=".ui.instrument.setupstation.CoordinatePointsLibraryActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name=".ui.instrument.setupstation.StakingNewJobActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name=".ui.instrument.setupstation.PointFilterActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name=".ui.instrument.setupstation.AddResultFormatActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name=".ui.instrument.setupstation.ControlPointsActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name=".ui.instrument.setupstation.EditCoordinatePointActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name=".ui.instrument.setupstation.ResultsTheExportActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize|stateHidden" />
</application>

@ -6,6 +6,7 @@ import android.app.Application;
import android.util.Log;
import com.bingce.AppChannel;
import com.bingce.BaseApp;
import com.bingce.data.database.DBQueryConstant;
import com.bingce.data.database.KeyValueDb;
import com.bingce.data.database.ProjectCoordinateDatabase;
@ -19,15 +20,17 @@ import com.bingce.device.Device;
import com.bingce.device.DeviceProgressDialogBuilderImpl;
import com.bingce.rtk.command.RTK;
import com.bingce.utils.CoordinatorSystemNotifierImpl;
import com.bingce.utils.SdkUtils;
import com.bingce.utils.ThreadPoolUtil;
import org.polaric.colorful.Colorful;
import blankj.utilcode.util.Utils;
import cn.liuyanbing.surveyor.BCSdk;
import io.reactivex.functions.Consumer;
import io.reactivex.plugins.RxJavaPlugins;
public class App extends Application {
public class App extends BaseApp {
private final CoordinatorSystemNotifierImpl coordinatorSystemNotifier = new CoordinatorSystemNotifierImpl();
private static App app;
@ -38,6 +41,13 @@ public class App extends Application {
*/
public float magneticDeclination = 0;
public int lastRecordBrowseType = 0;
/**
* 是否在记录界面显示当前工程全部数据
*/
public boolean isShowAllRecordInCurrentProject = true;
public boolean isLandscape() {
return false;
}
@ -63,6 +73,16 @@ public class App extends Application {
}
@Override
protected void initTtsManager() {
}
@Override
public String applicationId() {
return "";
}
private void initDevice() {
//初始化设备相关代码
@ -96,6 +116,11 @@ public class App extends Application {
return false;
}
@Override
public int angleNotNumber() {
return 6;
}
private void initThemeDark() {
Colorful.defaults()

@ -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);
}
}

@ -4,12 +4,17 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import androidx.viewpager.widget.ViewPager
import blankj.utilcode.util.AppUtils
import com.bingce.AppChannel
import com.bingce.ui.TabEntity
import com.bingce.utils.AppUtil
import com.bingce.utils.RegisterUtil
import com.bingce.utils.SdkUtils
import com.flyco.tablayout.listener.CustomTabEntity
import com.flyco.tablayout.listener.OnTabSelectListener
import com.project.survey.R
import com.project.survey.ui.base.BaseBindingActivity
import com.project.survey.databinding.ActivityMainBinding
import com.project.survey.ui.base.BaseBindingActivity
import com.project.survey.ui.home.HomeFragment
import com.project.survey.ui.home.InstrumentFragment
import com.project.survey.ui.home.MeFragment
@ -24,9 +29,24 @@ class MainActivity : BaseBindingActivity<ActivityMainBinding>() {
}
override fun initView() {
verifySdk()
initTabFragment()
}
private fun verifySdk() {
SdkUtils.verify(
this,
"ShangHai",
AppUtil.getLanguage(),
AppUtils.getAppVersionCode().toLong(),
AppChannel.customChannel,
RegisterUtil.getOriginalMachineCode(),
RegisterUtil.getDeviceBoundID(),
"",
"",
"",
""
)
}
private fun initTabFragment() {

@ -1,8 +1,8 @@
package com.project.survey.ui
import android.content.Intent
import com.project.survey.ui.base.BaseBindingActivity
import com.project.survey.databinding.ActivitySplashBinding
import com.project.survey.ui.base.BaseBindingActivity
/**
* 启动页

@ -148,6 +148,13 @@ public abstract class BaseSurveyNewActivity extends AppCompatActivity implements
defaultMenu.showAsDropDown(baseSurveyActivityUtils.activityBaseSurveyBinding.ivMore, -150, 20);
}
/**
* 隐藏三点更多
*/
public void hideMore() {
baseSurveyActivityUtils.activityBaseSurveyBinding.ivMore.setVisibility(View.GONE);
}
public boolean isHideHelpDoc() {
return false;
}
@ -208,6 +215,7 @@ public abstract class BaseSurveyNewActivity extends AppCompatActivity implements
baseSurveyActivityUtils.activityBaseSurveyBinding.llCommonRight.setOnClickListener(this::onCommonRightClicked);
baseSurveyActivityUtils.activityBaseSurveyBinding.llIconHomeSatellite.setOnClickListener(v -> {
//激光
if (Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_TS) {
tsSettingDialogUtils.showTotalStationSettingDialog();
} else {

@ -24,9 +24,7 @@ import com.bingce.rtk.gnss.Gnss;
import com.bingce.rtk.gnss.setting.BaseCorrect;
import com.bingce.rtk.model.GnssPosition;
import com.bingce.rtk.util.CoordTransUtil;
import com.bingce.surveyor.agentweb.HelpWebActivity;
import com.bingce.utils.ThreadPoolUtil;
import com.bingce.utils.Util;
import com.project.survey.App;
@ -160,25 +158,20 @@ public class RtkBaseCorrectActivity extends BaseSurveyNewActivity {
CommonUtils.hideSoftInput();
new MaterialDialog.Builder(RtkBaseCorrectActivity.this)
.title(R.string.data_source)
.items(new String[]{getString(R.string.road_control_point), getString(R.string.global_control_point), getString(R.string.point_survey_point_library), getString(R.string.staking_point_library)})
.items(new String[]{getString(R.string.global_control_point), getString(R.string.point_survey_point_library), getString(R.string.staking_point_library)})
.itemsCallback((dialog, itemView, which, text) -> {
switch (which) {
case 0:
ControlPointsNewActivity.pickPoint(this, false, (name, code, x, y, z, remarks) -> {
onPicked(name, x, y, z);
});
break;
case 1:
ControlPointsNewActivity.pickPoint(this, true, (name, code, x, y, z, remarks) -> {
onPicked(name, x, y, z);
});
break;
case 2:
case 1:
CoordinatePointsLibraryActivity.pickPoint(RtkBaseCorrectActivity.this, (name, code, x, y, z, b, l, h) -> {
onPicked(name, x, y, z);
});
break;
case 3:
case 2:
StakingNewJobActivity.pickPoint(RtkBaseCorrectActivity.this, (name, x, y, z) -> {
onPicked(name, x, y, z);
});

@ -416,9 +416,9 @@ public class GnssConfigSetActivity extends ColorfulActivity implements GnssConfi
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (sysMode == WorkModeEnum.ROVER || sysMode == WorkModeEnum.BASE) {
getMenuInflater().inflate(R.menu.menu_activity_rtk_station, menu);
}
// if (sysMode == WorkModeEnum.ROVER || sysMode == WorkModeEnum.BASE) {
// getMenuInflater().inflate(R.menu.menu_activity_rtk_station, menu);
// }
return super.onCreateOptionsMenu(menu);
}

@ -293,12 +293,6 @@ public class ControlPointsNewActivity extends ColorfulActivity {
"X", "Y", "Z",
getString(R.string.remarks),
getString(R.string.record_time)};
// binding.tableView.setAdapter(tableAdapter);
// binding.tableView.setTableViewListener(tableClickListener);
// binding.tableView.setSelectedColor(Color.rgb(226, 236, 215));
// binding.tableView.getSelectionHandler().setShadowEnabled(false);
// binding.tableView.setShowCornerView(true);
// binding.tableView.setRowHeaderWidth(0);
binding.bodyRv.setAdapter(controlPointLibraryAdapter);
binding.bodyNameRv.setAdapter(controlPointNameLibraryAdapter);
binding.bodyHsv.setScrollView(binding.headerHsv);

@ -21,6 +21,7 @@ public class PointFilterActivity extends BaseSurveyNewActivity {
private TimePicker timePicker = null;
private long startTime = -1;
private long endTime = -1;
@Override
public View getContentView() {
binding = ActivityPointFilterBinding.inflate(getLayoutInflater());
@ -148,6 +149,9 @@ public class PointFilterActivity extends BaseSurveyNewActivity {
binding.etName.setText(IntentUtil.stringExtra(this, KEY_NAME));
binding.etCode.setText(IntentUtil.stringExtra(this, KEY_CODE));
binding.etRemarks.setText(IntentUtil.stringExtra(this, KEY_REMARKS));
//隐藏三点更多
hideMore();
}
@Override
@ -157,9 +161,9 @@ public class PointFilterActivity extends BaseSurveyNewActivity {
if (start < 0 && end < 0) {
onAllDayClicked();
} else {
if (end - start == 1000 * 60 * 60 * 24 * 7 - 2000){
if (end - start == 1000 * 60 * 60 * 24 * 7 - 2000) {
on7DayClicked();
}else {
} else {
onTodayClicked();
}
}

@ -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() : "",

@ -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<Integer, IRecordsUtils> 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<String, String> 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);
}
}

@ -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);
}
}

@ -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<AppCompatActivity> 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);
});
}
}

@ -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);
}

@ -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<PointStakeRecord> 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<List<String>> 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<String> 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);
}
}

@ -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<PointStakeRecord> callback = new Utils.ItemCallback<>();
PointStakeListUtils(IProvider<AppCompatActivity> 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<PointStakeRecord, RecordItemVH>() {
@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<PointStakeRecord> 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<String, String> 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);
}
}

@ -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);
}
}

@ -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;

@ -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);
}
}

@ -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);

@ -20,7 +20,7 @@ public class RecordsActivityHeaders extends ContextProviderUtils {
super(contextIProvider);
}
void initHeaders() {
public void initHeaders() {
initSideCommonHeaders();
initSideFreedomHeaders();
initKnowPointSettingOutHeaders();

@ -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<Integer, IRecordsUtils> buildUtils(AppCompatActivity appCompatActivity) {
return buildUtils(appCompatActivity, recordType -> RecordTypeConstants.TYPE_MEASURING_TAPE != recordType);
}
public static Map<Integer, IRecordsUtils> buildUtils(AppCompatActivity appCompatActivity, IFilter filter) {
return new LinkedHashMap<Integer, IRecordsUtils>() {{
if (filter == null || filter.isValidate(RecordTypeConstants.TYPE_POINT_STAKE)) {
put(RecordTypeConstants.TYPE_POINT_STAKE, new PointStakeListUtils(() -> appCompatActivity));
}
}};
}
public interface IFilter {
boolean isValidate(int recordType);
}
}

@ -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()
}
}

@ -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++;
}
}
}

@ -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<String> permissions, boolean all) {
if (onGetPermissionCallback != null) {
onGetPermissionCallback.run();
}
}
@Override
public void onDenied(List<String> permissions, boolean never) {
if (never) {
ToastUtils.showShort("请手动授予文件读写权限");
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(context, permissions);
} else {
checkStoragePermission(context, onGetPermissionCallback);
}
}
});
}
}

@ -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) {

@ -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<T> extends DiffUtil.ItemCallback<T> {
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<T extends BCSurveyWithDeviceInfoRecord> extends AbstractItemCallback<T> {
@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);
}
}
}

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="800dp"
android:height="800dp"
android:viewportWidth="512"
android:viewportHeight="512">
<path
android:pathData="M463.08,207.19L432.92,237.36L384,188.44L384,426.67L341.33,426.67L341.33,188.44L292.42,237.36L262.25,207.19L362.67,106.67L463.08,207.19ZM170.67,170.67L64,170.67L64,213.33L170.67,213.33L170.67,170.67ZM213.33,277.33L64,277.33L64,320L213.33,320L213.33,277.33ZM64,426.67L256,426.67L256,384L64,384L64,426.67Z"
android:strokeWidth="1"
android:fillColor="#3333AA"
android:fillType="evenOdd"
android:strokeColor="#00000000"/>
</vector>

@ -0,0 +1,31 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="?colorPrimary"
android:minHeight="?android:attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:paddingStart="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingEnd="@dimen/activity_horizontal_margin"
android:paddingBottom="@dimen/activity_vertical_margin">
<TextView
android:id="@+id/activity_record_detail_textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/MyTextAppearanceTitle" />
</androidx.core.widget.NestedScrollView>
</LinearLayout>

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center" >
<LinearLayout
android:layout_width="280dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/rectangle_radius_all_7_white_full">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="Title"
android:textSize="14sp"
android:textColor="@color/black"
android:textStyle="bold"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@color/color_EBEBEB">
<com.bingce.ui.CleanableEditText
android:id="@+id/editText01"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginTop="30dp"
android:layout_marginBottom="10dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:drawableRight="@mipmap/icon_clear"
android:ellipsize="end"
android:gravity="center_vertical"
android:imeOptions="actionNext"
android:maxLines="1"
android:paddingLeft="10dp"
android:paddingRight="5dp"
android:singleLine="true"
android:textSize="@dimen/NormalTextSize"
android:textColor="@color/black"
android:textColorHint="@color/color_999999"
android:background="@drawable/rectangle_radius_all_7_white_full"/>
<com.bingce.ui.CleanableEditText
android:id="@+id/editText02"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginBottom="10dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:drawableRight="@mipmap/icon_clear"
android:ellipsize="end"
android:gravity="center_vertical"
android:imeOptions="actionNext"
android:maxLines="1"
android:paddingLeft="10dp"
android:paddingRight="5dp"
android:singleLine="true"
android:textSize="@dimen/NormalTextSize"
android:textColor="@color/black"
android:textColorHint="@color/color_999999"
android:background="@drawable/rectangle_radius_all_7_white_full"/>
<com.bingce.ui.CleanableEditText
android:id="@+id/editText03"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginBottom="30dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:drawableRight="@mipmap/icon_clear"
android:ellipsize="end"
android:gravity="center_vertical"
android:imeOptions="actionDone"
android:maxLines="1"
android:paddingLeft="10dp"
android:paddingRight="5dp"
android:singleLine="true"
android:textSize="@dimen/NormalTextSize"
android:textColor="@color/black"
android:textColorHint="@color/color_999999"
android:background="@drawable/rectangle_radius_all_7_white_full"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_cancel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/cancel"
android:textColor="@color/red"
android:gravity="center"
android:textStyle="bold"
android:textSize="@dimen/NormalTextSize" />
<TextView
android:id="@+id/tv_confirm"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/confirm"
android:gravity="center"
android:textColor="@color/color_575757"
android:textStyle="bold"
android:textSize="@dimen/NormalTextSize" />
</LinearLayout>
</LinearLayout>
</LinearLayout>

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?><!--
/* //device/apps/common/assets/res/any/layout/simple_spinner_item.xml
**
** Copyright 2008, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License")
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?android:attr/spinnerDropDownItemStyle"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="?colorPrimary"
android:ellipsize="marquee"
android:singleLine="true"
android:textColor="#ffffff" />

@ -0,0 +1,20 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- <item-->
<!-- android:id="@+id/menu_record_filter"-->
<!-- android:title="@string/filter"-->
<!-- app:showAsAction="ifRoom" />-->
<item
android:id="@+id/menu_record_export"
android:title="@string/export_points"
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_record_clear"
android:title="@string/clear_records"
app:showAsAction="never" />
<item
android:id="@+id/menu_record_sort"
android:title="@string/sort"
app:showAsAction="never" />
</menu>

@ -0,0 +1,17 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:mContext="com.bingce.surveyor.activity.project.records.RecordDetailActivity">
<item
android:id="@+id/menu_record_detail_page_up"
android:title="@string/page_up"
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_record_detail_page_down"
android:title="@string/page_down"
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_record_detail_edit_remarks"
android:title="@string/edit_remarks"
app:showAsAction="never" />
</menu>

@ -313,5 +313,31 @@
<string name="road_name_keyword">线路名关键词</string>
<string name="road_name_keyword_explain">线路名里包含的关键词</string>
<string name="kilometer_keyword">里程关键词</string>
<string name="not_choose_date">未选择日期</string>
<string name="confirm_delete_filter_records">确定删除所有当前筛选的记录?</string>
<string name="export_records">导出记录</string>
<string name="no_record">无记录</string>
<string name="record_detail">记录详情</string>
<string name="page_up">上一条</string>
<string name="page_down">下一条</string>
<string name="edit_remarks">修改备注</string>
<string name="known_point_staking">已知点放样</string><!--不能轻易改名,因为有个测量员导出文件里有个记录参数-->
<string name="record_default_display_one_week">记录默认显示7天内的,如需显示更多请点击右上角筛选</string>
<string name="clear_records">清空</string>
<string name="deleting">删除……</string>
<string name="disconnect_device_use_input_point">请先断开正在连接的设备,再使用自定义输入实测点功能</string>
<string name="input_current_point">输入实测点</string>
<string name="please_input_full_coordinate_parameters">请输入完整的坐标参数</string>
<string name="whether_staking_selected_point">是否放样所选点</string>
<string name="add_points_staking_point_first">请先添加或选择要放样的点</string>
<string name="staking_points_being_collected">放样点采集中</string>
<string name="is_current_recently_point">是当前最近点。</string>
<string name="the_first_staking_point_list">已经是第一个放样点。</string>
<string name="the_last_staking_point_list">已经是最后一个放样点。</string>
<string name="setting_point">放样点</string>
<string name="kilometer_keyword_explain">只需要输入K13,就可筛选出所以K13开头的记录,比如K13+345.6处的记录</string>
<string name="remarks_keyword">备注关键词</string>
<string name="remarks_keyword_explain">备注里包含关键词的所有记录都将被筛选</string>
<string name="sort">排序</string>
</resources>
Loading…
Cancel
Save