diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f9ce1e2..378a76b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -63,9 +63,7 @@ - - - - - - (), - SerialPortManager.OnSerialPortListener { - - private val kTag = "InstallLabelActivity" - private val context = this@InstallLabelActivity - private val serialPortManager by lazy { SerialPortManager(this) } - private val calendar by lazy { Calendar.getInstance() } - private val audioAttributes = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_ALARM) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build() - private val realPaths = ArrayList() //真实图片路径 - private val locationHub by lazy { LocationHub(this) } - private lateinit var imageAdapter: EditableImageAdapter - private lateinit var taskViewModel: TaskViewModel - private var soundPool: SoundPool? = null - - override fun initViewBinding(): ActivityInstallLabelBinding { - return ActivityInstallLabelBinding.inflate(layoutInflater) - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN or WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) - - imageAdapter = EditableImageAdapter(this, 3, 3) - binding.cameraInclude.addImageRecyclerView.adapter = imageAdapter - - taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] - - //设置默认值 - binding.objectInclude.markerObjectTypeView.setText("markerObjectTypeView".getDefaultValue()) - binding.objectInclude.pipelineDiameterView.setText("pipelineDiameterView".getDefaultValue()) - binding.objectInclude.buryDeepView.setText("buryDeepView".getDefaultValue()) - binding.objectInclude.downPipeDiameterView.setText("downPipeDiameterView".getDefaultValue()) - binding.objectInclude.downPointDeepView.setText("downPointDeepView".getDefaultValue()) - binding.objectInclude.areaView.setText("areaView".getDefaultValue()) - binding.objectInclude.lineView.setText("lineView".getDefaultValue()) - binding.objectInclude.roadView.setText("roadView".getDefaultValue()) - binding.objectInclude.ownerView.setText("ownerView".getDefaultValue()) - binding.identifierInclude.identifierDeepView.setText("identifierDeepView".getDefaultValue()) - binding.identifierInclude.personDeptView.setText("personDeptView".getDefaultValue()) - } - - override fun initEvent() { - binding.titleInclude.leftBackView.setOnClickListener { finish() } - - /**************************************************************************************/ - binding.objectInclude.objectTypeSpinner.show(this, LocaleConstant.POINT_TYPE_ARRAY, 0) - binding.objectInclude.materialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 0) - binding.objectInclude.downPipeTypeSpinner.show(this, LocaleConstant.DOWN_PIPE_TYPE_ARRAY, 0) - binding.objectInclude.downPipeMaterialSpinner.show( - this, LocaleConstant.PIPE_MATERIAL_ARRAY, 0 - ) - binding.objectInclude.buryMethodSpinner.show(this, LocaleConstant.BURY_METHOD_ARRAY, 0) - - binding.objectInclude.constructDateView.setOnClickListener { - val datePicker = DatePickerDialog( - this, - null, - calendar.get(Calendar.YEAR), - calendar.get(Calendar.MONTH), - calendar.get(Calendar.DAY_OF_MONTH) - ) - datePicker.show() - - datePicker.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener { - val year = datePicker.datePicker.year - val month = datePicker.datePicker.month + 1 - val day = datePicker.datePicker.dayOfMonth - val selectedDate = String.format( - "%s-%s-%s", year, month.appendZero(), day.appendZero() - ) - - //当前时间 - val current = System.currentTimeMillis().timestampToTime() - val today = "$selectedDate $current".dateToTimestamp() - if (Date(today).after(Date())) { - "建设年代不能早于当前日期".show(context) - } else { - datePicker.dismiss() - binding.objectInclude.constructDateView.text = selectedDate - } - } - } - - binding.identifierInclude.identifierTypeSpinner.show( - this, LocaleConstant.IDENTIFIER_TYPE_ARRAY, 0 - ) - - binding.identifierInclude.installTimeView.text = - System.currentTimeMillis().timestampToCompleteDate() - locationHub.getCurrentLocation(true, object : ILocationListener { - override fun onAMapLocationGet(location: AMapLocation?) { - if (location != null) { - binding.identifierInclude.lngView.text = location.longitude.toString() - binding.identifierInclude.latView.text = location.latitude.toString() - } else { - "当前位置信号差,无法获取定位".show(context) - } - } - }) - - binding.identifierInclude.colorSpinner.show(this, LocaleConstant.COLOR_ARRAY, 0) - - imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { - override fun onAddImageClick() { - takePicture() - } - - override fun onItemClick(position: Int) { - if (realPaths[position].isEmpty()) { - "图片加载失败,无法查看大图".show(context) - } else { - context.navigatePageTo(position, realPaths) - } - } - - override fun onItemLongClick(view: View?, position: Int) { - imageAdapter.deleteImage(position) - } - }) - /**************************************************************************************/ - binding.installButton.setOnClickListener { - if (isNetworkConnected()) { - val companyId = SaveKeyValues.getValue(LocaleConstant.USER_COMPANY_ID, "") as String - val objectId = SaveKeyValues.getValue(LocaleConstant.OBJECT_ID, "") as String - if (binding.objectInclude.markerObjectTypeView.text.isNullOrBlank()) { - when (binding.objectInclude.objectTypeSpinner.selectedItem.toString()) { - "管线" -> { - "请输入管线种类!".show(this) - } - - "管线附属物" -> { - "请输入附属物名称!".show(this) - } - - "管线特征管点" -> { - "请输入特征管点!".show(this) - } - - "交叉穿越点" -> { - "请输入上层管种类!".show(this) - } - } - return@setOnClickListener - } - - if (binding.objectInclude.pipelineDiameterView.text.isNullOrBlank()) { - "请输入管径".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.buryDeepView.text.isNullOrBlank()) { - "请输入埋深".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.downPipeDiameterView.text.isNullOrBlank()) { - "请输入下层管管径".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.areaView.text.isNullOrBlank()) { - "请输入所属区域".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.lineView.text.isNullOrBlank()) { - "请输入所属线路".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.roadView.text.isNullOrBlank()) { - "请输入所属道路".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.constructDateView.text.isNullOrBlank()) { - "请选择建设年代".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.ownerView.text.isNullOrBlank()) { - "请输入权属单位".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.identifierIdView.text.isNullOrBlank()) { - "请先读取标识器获取ID".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.identifierDeepView.text.isNullOrBlank()) { - "请输入标识器埋深".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.personDeptView.text.isNullOrBlank()) { - "请输入标识器安装部门".show(this) - return@setOnClickListener - } - - //查本地库 - val markerId = binding.identifierInclude.identifierIdView.text.toString() - val result = DataBaseManager.get.queryLabelById(markerId) - if (result.isEmpty()) { - "".show(this) - return@setOnClickListener - } - - //先存本地再上传服务器 - saveLabelInLocal() - - taskViewModel.installLabel( - companyId, - binding.objectInclude.objectTypeSpinner.selectedItem.toString().toObjectType(), - binding.objectInclude.markerObjectTypeView.text.toString(), - binding.objectInclude.materialSpinner.selectedItem.toString(), - "${binding.objectInclude.pipelineDiameterView.text}mm", - "${binding.objectInclude.buryDeepView.text}mm", - binding.objectInclude.downPipeTypeSpinner.selectedItem.toString(), - binding.objectInclude.downPipeMaterialSpinner.selectedItem.toString(), - "${binding.objectInclude.downPipeDiameterView.text}mm", - "${binding.objectInclude.downPointDeepView.text}mm", - binding.objectInclude.buryMethodSpinner.selectedItem.toString(), - binding.objectInclude.areaView.text.toString(), - binding.objectInclude.lineView.text.toString(), - binding.objectInclude.roadView.text.toString(), - binding.objectInclude.constructDateView.text.toString(), - binding.objectInclude.ownerView.text.toString(), - objectId, - markerId, - binding.identifierInclude.identifierTypeSpinner.selectedItem.toString(), - "${binding.identifierInclude.identifierDeepView.text}mm", - binding.identifierInclude.personDeptView.text.toString(), - binding.identifierInclude.installTimeView.text.toString(), - binding.identifierInclude.lngView.text.toString(), - binding.identifierInclude.latView.text.toString(), - binding.identifierInclude.colorSpinner.selectedItem.toString().toColor(), - binding.remarkView.text.toString(), - realPaths - ) - - //保存默认值 - "markerObjectTypeView".setDefaultValue(binding.objectInclude.markerObjectTypeView.text.toString()) - "pipelineDiameterView".setDefaultValue(binding.objectInclude.pipelineDiameterView.text.toString()) - "buryDeepView".setDefaultValue(binding.objectInclude.buryDeepView.text.toString()) - "downPipeDiameterView".setDefaultValue(binding.objectInclude.downPipeDiameterView.text.toString()) - "downPointDeepView".setDefaultValue(binding.objectInclude.downPointDeepView.text.toString()) - "areaView".setDefaultValue(binding.objectInclude.areaView.text.toString()) - "lineView".setDefaultValue(binding.objectInclude.lineView.text.toString()) - "roadView".setDefaultValue(binding.objectInclude.roadView.text.toString()) - "ownerView".setDefaultValue(binding.objectInclude.ownerView.text.toString()) - "identifierDeepView".setDefaultValue(binding.identifierInclude.identifierDeepView.text.toString()) - "personDeptView".setDefaultValue(binding.identifierInclude.personDeptView.text.toString()) - } else { - NoNetworkDialog.Builder().setContext(context) - .setOnDialogButtonClickListener(object : - NoNetworkDialog.OnDialogButtonClickListener { - override fun onButtonClick() { - val intent = Intent(Settings.ACTION_SETTINGS) - startActivity(intent) - } - }).build().show() - } - } - - binding.readLabelButton.setOnClickListener { - LoadingDialogHub.show(this, "标识器读取中,请稍后...") - - soundPool = SoundPool.Builder() - .setMaxStreams(16) - .setAudioAttributes(audioAttributes) - .build() - soundPool?.apply { - val soundResId = load(context, R.raw.ring3, 1) - setOnLoadCompleteListener { soundPool, _, _ -> - soundPool.play(soundResId, 1f, 1f, 0, -1, 1f) - } - } - - serialPortManager.searchMarkerSignal() - } - } - - override fun onDataReceived(buffer: ByteArray) { - LoadingDialogHub.dismiss() - soundPool?.release() - - val hex = buffer.toHex() -// Log.d(kTag, "$kTag => $hex") - if (hex.length >= 20) { - val markerId = hex.take(20).hexToString() - if (markerId.isNumber()) { - binding.identifierInclude.identifierIdView.text = markerId - serialPortManager.closeSerialPort() - } - } - } - - private fun saveLabelInLocal() { - val objectId = SaveKeyValues.getValue(LocaleConstant.OBJECT_ID, "") as String - - val labelBean = LabelBean() - labelBean.objectType = binding.objectInclude.objectTypeSpinner.selectedItem.toString() - labelBean.pipelineType = binding.objectInclude.markerObjectTypeView.text.toString() - labelBean.pipelineMaterial = binding.objectInclude.materialSpinner.selectedItem.toString() - labelBean.pipelineDiameter = "${binding.objectInclude.pipelineDiameterView.text}mm" - labelBean.buryDeep = "${binding.objectInclude.buryDeepView.text}mm" - labelBean.lowerType = binding.objectInclude.downPipeTypeSpinner.selectedItem.toString() - labelBean.lowerMaterial = - binding.objectInclude.downPipeMaterialSpinner.selectedItem.toString() - labelBean.lowerDiameter = "${binding.objectInclude.downPipeDiameterView.text}mm" - labelBean.lowerDeep = "${binding.objectInclude.downPointDeepView.text}mm" - labelBean.buryMethod = binding.objectInclude.buryMethodSpinner.selectedItem.toString() - labelBean.area = binding.objectInclude.areaView.text.toString() - labelBean.line = binding.objectInclude.lineView.text.toString() - labelBean.road = binding.objectInclude.roadView.text.toString() - labelBean.constructTime = binding.objectInclude.constructDateView.text.toString() - labelBean.owner = binding.objectInclude.ownerView.text.toString() - labelBean.objectId = objectId - labelBean.identifierId = binding.identifierInclude.identifierIdView.text.toString() - labelBean.identifierType = - binding.identifierInclude.identifierTypeSpinner.selectedItem.toString() - labelBean.identifierDeep = "${binding.identifierInclude.identifierDeepView.text}mm" - labelBean.person = binding.identifierInclude.personDeptView.text.toString() - labelBean.installTime = binding.identifierInclude.installTimeView.text.toString() - labelBean.lng = binding.identifierInclude.lngView.text.toString() - labelBean.lat = binding.identifierInclude.latView.text.toString() - labelBean.color = binding.identifierInclude.colorSpinner.selectedItem.toString().toColor() - labelBean.remark = binding.remarkView.text.toString() - labelBean.imagePath = realPaths.toJson() - - DataBaseManager.get.insertTaskLabel(labelBean) - } - - private fun takePicture() { - PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - if (result == null) { - "拍照失败,请重试".show(context) - return - } - analyticalSelectResults(result[0]) - } - - override fun onCancel() { - - } - }) - } - - private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 - result.realPath.compressImage(this, object : OnImageCompressListener { - override fun onSuccess(file: File) { - realPaths.add(file.absolutePath) - imageAdapter.setupImage(realPaths) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) - } - - override fun observeRequestState() { - taskViewModel.loadState.observe(this) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "标识器安装中,请稍后...") - LoadState.Success -> { - LoadingDialogHub.dismiss() - finish() - } - - else -> LoadingDialogHub.dismiss() - } - } - } - - override fun setupTopBarLayout() { - binding.titleInclude.titleView.text = "安装新标识器" - binding.titleInclude.titleView.setTextColor(R.color.themeColor.convertColor(this)) - - binding.rootView.initImmersionBar(this, true, R.color.white) - } - - override fun onDestroy() { - super.onDestroy() - soundPool?.release() - locationHub.stopLocation() - } - - override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - if (keyCode == KeyEvent.KEYCODE_BACK) { - soundPool?.release() - } - return super.onKeyDown(keyCode, event) - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f9ce1e2..378a76b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -63,9 +63,7 @@ - - (), - SerialPortManager.OnSerialPortListener { - - private val kTag = "InstallLabelActivity" - private val context = this@InstallLabelActivity - private val serialPortManager by lazy { SerialPortManager(this) } - private val calendar by lazy { Calendar.getInstance() } - private val audioAttributes = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_ALARM) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build() - private val realPaths = ArrayList() //真实图片路径 - private val locationHub by lazy { LocationHub(this) } - private lateinit var imageAdapter: EditableImageAdapter - private lateinit var taskViewModel: TaskViewModel - private var soundPool: SoundPool? = null - - override fun initViewBinding(): ActivityInstallLabelBinding { - return ActivityInstallLabelBinding.inflate(layoutInflater) - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN or WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) - - imageAdapter = EditableImageAdapter(this, 3, 3) - binding.cameraInclude.addImageRecyclerView.adapter = imageAdapter - - taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] - - //设置默认值 - binding.objectInclude.markerObjectTypeView.setText("markerObjectTypeView".getDefaultValue()) - binding.objectInclude.pipelineDiameterView.setText("pipelineDiameterView".getDefaultValue()) - binding.objectInclude.buryDeepView.setText("buryDeepView".getDefaultValue()) - binding.objectInclude.downPipeDiameterView.setText("downPipeDiameterView".getDefaultValue()) - binding.objectInclude.downPointDeepView.setText("downPointDeepView".getDefaultValue()) - binding.objectInclude.areaView.setText("areaView".getDefaultValue()) - binding.objectInclude.lineView.setText("lineView".getDefaultValue()) - binding.objectInclude.roadView.setText("roadView".getDefaultValue()) - binding.objectInclude.ownerView.setText("ownerView".getDefaultValue()) - binding.identifierInclude.identifierDeepView.setText("identifierDeepView".getDefaultValue()) - binding.identifierInclude.personDeptView.setText("personDeptView".getDefaultValue()) - } - - override fun initEvent() { - binding.titleInclude.leftBackView.setOnClickListener { finish() } - - /**************************************************************************************/ - binding.objectInclude.objectTypeSpinner.show(this, LocaleConstant.POINT_TYPE_ARRAY, 0) - binding.objectInclude.materialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 0) - binding.objectInclude.downPipeTypeSpinner.show(this, LocaleConstant.DOWN_PIPE_TYPE_ARRAY, 0) - binding.objectInclude.downPipeMaterialSpinner.show( - this, LocaleConstant.PIPE_MATERIAL_ARRAY, 0 - ) - binding.objectInclude.buryMethodSpinner.show(this, LocaleConstant.BURY_METHOD_ARRAY, 0) - - binding.objectInclude.constructDateView.setOnClickListener { - val datePicker = DatePickerDialog( - this, - null, - calendar.get(Calendar.YEAR), - calendar.get(Calendar.MONTH), - calendar.get(Calendar.DAY_OF_MONTH) - ) - datePicker.show() - - datePicker.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener { - val year = datePicker.datePicker.year - val month = datePicker.datePicker.month + 1 - val day = datePicker.datePicker.dayOfMonth - val selectedDate = String.format( - "%s-%s-%s", year, month.appendZero(), day.appendZero() - ) - - //当前时间 - val current = System.currentTimeMillis().timestampToTime() - val today = "$selectedDate $current".dateToTimestamp() - if (Date(today).after(Date())) { - "建设年代不能早于当前日期".show(context) - } else { - datePicker.dismiss() - binding.objectInclude.constructDateView.text = selectedDate - } - } - } - - binding.identifierInclude.identifierTypeSpinner.show( - this, LocaleConstant.IDENTIFIER_TYPE_ARRAY, 0 - ) - - binding.identifierInclude.installTimeView.text = - System.currentTimeMillis().timestampToCompleteDate() - locationHub.getCurrentLocation(true, object : ILocationListener { - override fun onAMapLocationGet(location: AMapLocation?) { - if (location != null) { - binding.identifierInclude.lngView.text = location.longitude.toString() - binding.identifierInclude.latView.text = location.latitude.toString() - } else { - "当前位置信号差,无法获取定位".show(context) - } - } - }) - - binding.identifierInclude.colorSpinner.show(this, LocaleConstant.COLOR_ARRAY, 0) - - imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { - override fun onAddImageClick() { - takePicture() - } - - override fun onItemClick(position: Int) { - if (realPaths[position].isEmpty()) { - "图片加载失败,无法查看大图".show(context) - } else { - context.navigatePageTo(position, realPaths) - } - } - - override fun onItemLongClick(view: View?, position: Int) { - imageAdapter.deleteImage(position) - } - }) - /**************************************************************************************/ - binding.installButton.setOnClickListener { - if (isNetworkConnected()) { - val companyId = SaveKeyValues.getValue(LocaleConstant.USER_COMPANY_ID, "") as String - val objectId = SaveKeyValues.getValue(LocaleConstant.OBJECT_ID, "") as String - if (binding.objectInclude.markerObjectTypeView.text.isNullOrBlank()) { - when (binding.objectInclude.objectTypeSpinner.selectedItem.toString()) { - "管线" -> { - "请输入管线种类!".show(this) - } - - "管线附属物" -> { - "请输入附属物名称!".show(this) - } - - "管线特征管点" -> { - "请输入特征管点!".show(this) - } - - "交叉穿越点" -> { - "请输入上层管种类!".show(this) - } - } - return@setOnClickListener - } - - if (binding.objectInclude.pipelineDiameterView.text.isNullOrBlank()) { - "请输入管径".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.buryDeepView.text.isNullOrBlank()) { - "请输入埋深".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.downPipeDiameterView.text.isNullOrBlank()) { - "请输入下层管管径".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.areaView.text.isNullOrBlank()) { - "请输入所属区域".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.lineView.text.isNullOrBlank()) { - "请输入所属线路".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.roadView.text.isNullOrBlank()) { - "请输入所属道路".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.constructDateView.text.isNullOrBlank()) { - "请选择建设年代".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.ownerView.text.isNullOrBlank()) { - "请输入权属单位".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.identifierIdView.text.isNullOrBlank()) { - "请先读取标识器获取ID".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.identifierDeepView.text.isNullOrBlank()) { - "请输入标识器埋深".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.personDeptView.text.isNullOrBlank()) { - "请输入标识器安装部门".show(this) - return@setOnClickListener - } - - //查本地库 - val markerId = binding.identifierInclude.identifierIdView.text.toString() - val result = DataBaseManager.get.queryLabelById(markerId) - if (result.isEmpty()) { - "".show(this) - return@setOnClickListener - } - - //先存本地再上传服务器 - saveLabelInLocal() - - taskViewModel.installLabel( - companyId, - binding.objectInclude.objectTypeSpinner.selectedItem.toString().toObjectType(), - binding.objectInclude.markerObjectTypeView.text.toString(), - binding.objectInclude.materialSpinner.selectedItem.toString(), - "${binding.objectInclude.pipelineDiameterView.text}mm", - "${binding.objectInclude.buryDeepView.text}mm", - binding.objectInclude.downPipeTypeSpinner.selectedItem.toString(), - binding.objectInclude.downPipeMaterialSpinner.selectedItem.toString(), - "${binding.objectInclude.downPipeDiameterView.text}mm", - "${binding.objectInclude.downPointDeepView.text}mm", - binding.objectInclude.buryMethodSpinner.selectedItem.toString(), - binding.objectInclude.areaView.text.toString(), - binding.objectInclude.lineView.text.toString(), - binding.objectInclude.roadView.text.toString(), - binding.objectInclude.constructDateView.text.toString(), - binding.objectInclude.ownerView.text.toString(), - objectId, - markerId, - binding.identifierInclude.identifierTypeSpinner.selectedItem.toString(), - "${binding.identifierInclude.identifierDeepView.text}mm", - binding.identifierInclude.personDeptView.text.toString(), - binding.identifierInclude.installTimeView.text.toString(), - binding.identifierInclude.lngView.text.toString(), - binding.identifierInclude.latView.text.toString(), - binding.identifierInclude.colorSpinner.selectedItem.toString().toColor(), - binding.remarkView.text.toString(), - realPaths - ) - - //保存默认值 - "markerObjectTypeView".setDefaultValue(binding.objectInclude.markerObjectTypeView.text.toString()) - "pipelineDiameterView".setDefaultValue(binding.objectInclude.pipelineDiameterView.text.toString()) - "buryDeepView".setDefaultValue(binding.objectInclude.buryDeepView.text.toString()) - "downPipeDiameterView".setDefaultValue(binding.objectInclude.downPipeDiameterView.text.toString()) - "downPointDeepView".setDefaultValue(binding.objectInclude.downPointDeepView.text.toString()) - "areaView".setDefaultValue(binding.objectInclude.areaView.text.toString()) - "lineView".setDefaultValue(binding.objectInclude.lineView.text.toString()) - "roadView".setDefaultValue(binding.objectInclude.roadView.text.toString()) - "ownerView".setDefaultValue(binding.objectInclude.ownerView.text.toString()) - "identifierDeepView".setDefaultValue(binding.identifierInclude.identifierDeepView.text.toString()) - "personDeptView".setDefaultValue(binding.identifierInclude.personDeptView.text.toString()) - } else { - NoNetworkDialog.Builder().setContext(context) - .setOnDialogButtonClickListener(object : - NoNetworkDialog.OnDialogButtonClickListener { - override fun onButtonClick() { - val intent = Intent(Settings.ACTION_SETTINGS) - startActivity(intent) - } - }).build().show() - } - } - - binding.readLabelButton.setOnClickListener { - LoadingDialogHub.show(this, "标识器读取中,请稍后...") - - soundPool = SoundPool.Builder() - .setMaxStreams(16) - .setAudioAttributes(audioAttributes) - .build() - soundPool?.apply { - val soundResId = load(context, R.raw.ring3, 1) - setOnLoadCompleteListener { soundPool, _, _ -> - soundPool.play(soundResId, 1f, 1f, 0, -1, 1f) - } - } - - serialPortManager.searchMarkerSignal() - } - } - - override fun onDataReceived(buffer: ByteArray) { - LoadingDialogHub.dismiss() - soundPool?.release() - - val hex = buffer.toHex() -// Log.d(kTag, "$kTag => $hex") - if (hex.length >= 20) { - val markerId = hex.take(20).hexToString() - if (markerId.isNumber()) { - binding.identifierInclude.identifierIdView.text = markerId - serialPortManager.closeSerialPort() - } - } - } - - private fun saveLabelInLocal() { - val objectId = SaveKeyValues.getValue(LocaleConstant.OBJECT_ID, "") as String - - val labelBean = LabelBean() - labelBean.objectType = binding.objectInclude.objectTypeSpinner.selectedItem.toString() - labelBean.pipelineType = binding.objectInclude.markerObjectTypeView.text.toString() - labelBean.pipelineMaterial = binding.objectInclude.materialSpinner.selectedItem.toString() - labelBean.pipelineDiameter = "${binding.objectInclude.pipelineDiameterView.text}mm" - labelBean.buryDeep = "${binding.objectInclude.buryDeepView.text}mm" - labelBean.lowerType = binding.objectInclude.downPipeTypeSpinner.selectedItem.toString() - labelBean.lowerMaterial = - binding.objectInclude.downPipeMaterialSpinner.selectedItem.toString() - labelBean.lowerDiameter = "${binding.objectInclude.downPipeDiameterView.text}mm" - labelBean.lowerDeep = "${binding.objectInclude.downPointDeepView.text}mm" - labelBean.buryMethod = binding.objectInclude.buryMethodSpinner.selectedItem.toString() - labelBean.area = binding.objectInclude.areaView.text.toString() - labelBean.line = binding.objectInclude.lineView.text.toString() - labelBean.road = binding.objectInclude.roadView.text.toString() - labelBean.constructTime = binding.objectInclude.constructDateView.text.toString() - labelBean.owner = binding.objectInclude.ownerView.text.toString() - labelBean.objectId = objectId - labelBean.identifierId = binding.identifierInclude.identifierIdView.text.toString() - labelBean.identifierType = - binding.identifierInclude.identifierTypeSpinner.selectedItem.toString() - labelBean.identifierDeep = "${binding.identifierInclude.identifierDeepView.text}mm" - labelBean.person = binding.identifierInclude.personDeptView.text.toString() - labelBean.installTime = binding.identifierInclude.installTimeView.text.toString() - labelBean.lng = binding.identifierInclude.lngView.text.toString() - labelBean.lat = binding.identifierInclude.latView.text.toString() - labelBean.color = binding.identifierInclude.colorSpinner.selectedItem.toString().toColor() - labelBean.remark = binding.remarkView.text.toString() - labelBean.imagePath = realPaths.toJson() - - DataBaseManager.get.insertTaskLabel(labelBean) - } - - private fun takePicture() { - PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - if (result == null) { - "拍照失败,请重试".show(context) - return - } - analyticalSelectResults(result[0]) - } - - override fun onCancel() { - - } - }) - } - - private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 - result.realPath.compressImage(this, object : OnImageCompressListener { - override fun onSuccess(file: File) { - realPaths.add(file.absolutePath) - imageAdapter.setupImage(realPaths) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) - } - - override fun observeRequestState() { - taskViewModel.loadState.observe(this) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "标识器安装中,请稍后...") - LoadState.Success -> { - LoadingDialogHub.dismiss() - finish() - } - - else -> LoadingDialogHub.dismiss() - } - } - } - - override fun setupTopBarLayout() { - binding.titleInclude.titleView.text = "安装新标识器" - binding.titleInclude.titleView.setTextColor(R.color.themeColor.convertColor(this)) - - binding.rootView.initImmersionBar(this, true, R.color.white) - } - - override fun onDestroy() { - super.onDestroy() - soundPool?.release() - locationHub.stopLocation() - } - - override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - if (keyCode == KeyEvent.KEYCODE_BACK) { - soundPool?.release() - } - return super.onKeyDown(keyCode, event) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/view/LoginActivity.kt b/app/src/main/java/com/casic/detector/view/LoginActivity.kt index 6a0cce9..dde848f 100644 --- a/app/src/main/java/com/casic/detector/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/detector/view/LoginActivity.kt @@ -4,13 +4,13 @@ import androidx.lifecycle.ViewModelProvider import com.amap.api.navi.NaviSetting import com.casic.detector.databinding.ActivityLoginBinding -import com.casic.detector.utils.LoadingDialogHub import com.casic.detector.utils.LocaleConstant import com.casic.detector.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertMessageDialog diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f9ce1e2..378a76b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -63,9 +63,7 @@ - - (), - SerialPortManager.OnSerialPortListener { - - private val kTag = "InstallLabelActivity" - private val context = this@InstallLabelActivity - private val serialPortManager by lazy { SerialPortManager(this) } - private val calendar by lazy { Calendar.getInstance() } - private val audioAttributes = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_ALARM) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build() - private val realPaths = ArrayList() //真实图片路径 - private val locationHub by lazy { LocationHub(this) } - private lateinit var imageAdapter: EditableImageAdapter - private lateinit var taskViewModel: TaskViewModel - private var soundPool: SoundPool? = null - - override fun initViewBinding(): ActivityInstallLabelBinding { - return ActivityInstallLabelBinding.inflate(layoutInflater) - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN or WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) - - imageAdapter = EditableImageAdapter(this, 3, 3) - binding.cameraInclude.addImageRecyclerView.adapter = imageAdapter - - taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] - - //设置默认值 - binding.objectInclude.markerObjectTypeView.setText("markerObjectTypeView".getDefaultValue()) - binding.objectInclude.pipelineDiameterView.setText("pipelineDiameterView".getDefaultValue()) - binding.objectInclude.buryDeepView.setText("buryDeepView".getDefaultValue()) - binding.objectInclude.downPipeDiameterView.setText("downPipeDiameterView".getDefaultValue()) - binding.objectInclude.downPointDeepView.setText("downPointDeepView".getDefaultValue()) - binding.objectInclude.areaView.setText("areaView".getDefaultValue()) - binding.objectInclude.lineView.setText("lineView".getDefaultValue()) - binding.objectInclude.roadView.setText("roadView".getDefaultValue()) - binding.objectInclude.ownerView.setText("ownerView".getDefaultValue()) - binding.identifierInclude.identifierDeepView.setText("identifierDeepView".getDefaultValue()) - binding.identifierInclude.personDeptView.setText("personDeptView".getDefaultValue()) - } - - override fun initEvent() { - binding.titleInclude.leftBackView.setOnClickListener { finish() } - - /**************************************************************************************/ - binding.objectInclude.objectTypeSpinner.show(this, LocaleConstant.POINT_TYPE_ARRAY, 0) - binding.objectInclude.materialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 0) - binding.objectInclude.downPipeTypeSpinner.show(this, LocaleConstant.DOWN_PIPE_TYPE_ARRAY, 0) - binding.objectInclude.downPipeMaterialSpinner.show( - this, LocaleConstant.PIPE_MATERIAL_ARRAY, 0 - ) - binding.objectInclude.buryMethodSpinner.show(this, LocaleConstant.BURY_METHOD_ARRAY, 0) - - binding.objectInclude.constructDateView.setOnClickListener { - val datePicker = DatePickerDialog( - this, - null, - calendar.get(Calendar.YEAR), - calendar.get(Calendar.MONTH), - calendar.get(Calendar.DAY_OF_MONTH) - ) - datePicker.show() - - datePicker.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener { - val year = datePicker.datePicker.year - val month = datePicker.datePicker.month + 1 - val day = datePicker.datePicker.dayOfMonth - val selectedDate = String.format( - "%s-%s-%s", year, month.appendZero(), day.appendZero() - ) - - //当前时间 - val current = System.currentTimeMillis().timestampToTime() - val today = "$selectedDate $current".dateToTimestamp() - if (Date(today).after(Date())) { - "建设年代不能早于当前日期".show(context) - } else { - datePicker.dismiss() - binding.objectInclude.constructDateView.text = selectedDate - } - } - } - - binding.identifierInclude.identifierTypeSpinner.show( - this, LocaleConstant.IDENTIFIER_TYPE_ARRAY, 0 - ) - - binding.identifierInclude.installTimeView.text = - System.currentTimeMillis().timestampToCompleteDate() - locationHub.getCurrentLocation(true, object : ILocationListener { - override fun onAMapLocationGet(location: AMapLocation?) { - if (location != null) { - binding.identifierInclude.lngView.text = location.longitude.toString() - binding.identifierInclude.latView.text = location.latitude.toString() - } else { - "当前位置信号差,无法获取定位".show(context) - } - } - }) - - binding.identifierInclude.colorSpinner.show(this, LocaleConstant.COLOR_ARRAY, 0) - - imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { - override fun onAddImageClick() { - takePicture() - } - - override fun onItemClick(position: Int) { - if (realPaths[position].isEmpty()) { - "图片加载失败,无法查看大图".show(context) - } else { - context.navigatePageTo(position, realPaths) - } - } - - override fun onItemLongClick(view: View?, position: Int) { - imageAdapter.deleteImage(position) - } - }) - /**************************************************************************************/ - binding.installButton.setOnClickListener { - if (isNetworkConnected()) { - val companyId = SaveKeyValues.getValue(LocaleConstant.USER_COMPANY_ID, "") as String - val objectId = SaveKeyValues.getValue(LocaleConstant.OBJECT_ID, "") as String - if (binding.objectInclude.markerObjectTypeView.text.isNullOrBlank()) { - when (binding.objectInclude.objectTypeSpinner.selectedItem.toString()) { - "管线" -> { - "请输入管线种类!".show(this) - } - - "管线附属物" -> { - "请输入附属物名称!".show(this) - } - - "管线特征管点" -> { - "请输入特征管点!".show(this) - } - - "交叉穿越点" -> { - "请输入上层管种类!".show(this) - } - } - return@setOnClickListener - } - - if (binding.objectInclude.pipelineDiameterView.text.isNullOrBlank()) { - "请输入管径".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.buryDeepView.text.isNullOrBlank()) { - "请输入埋深".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.downPipeDiameterView.text.isNullOrBlank()) { - "请输入下层管管径".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.areaView.text.isNullOrBlank()) { - "请输入所属区域".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.lineView.text.isNullOrBlank()) { - "请输入所属线路".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.roadView.text.isNullOrBlank()) { - "请输入所属道路".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.constructDateView.text.isNullOrBlank()) { - "请选择建设年代".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.ownerView.text.isNullOrBlank()) { - "请输入权属单位".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.identifierIdView.text.isNullOrBlank()) { - "请先读取标识器获取ID".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.identifierDeepView.text.isNullOrBlank()) { - "请输入标识器埋深".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.personDeptView.text.isNullOrBlank()) { - "请输入标识器安装部门".show(this) - return@setOnClickListener - } - - //查本地库 - val markerId = binding.identifierInclude.identifierIdView.text.toString() - val result = DataBaseManager.get.queryLabelById(markerId) - if (result.isEmpty()) { - "".show(this) - return@setOnClickListener - } - - //先存本地再上传服务器 - saveLabelInLocal() - - taskViewModel.installLabel( - companyId, - binding.objectInclude.objectTypeSpinner.selectedItem.toString().toObjectType(), - binding.objectInclude.markerObjectTypeView.text.toString(), - binding.objectInclude.materialSpinner.selectedItem.toString(), - "${binding.objectInclude.pipelineDiameterView.text}mm", - "${binding.objectInclude.buryDeepView.text}mm", - binding.objectInclude.downPipeTypeSpinner.selectedItem.toString(), - binding.objectInclude.downPipeMaterialSpinner.selectedItem.toString(), - "${binding.objectInclude.downPipeDiameterView.text}mm", - "${binding.objectInclude.downPointDeepView.text}mm", - binding.objectInclude.buryMethodSpinner.selectedItem.toString(), - binding.objectInclude.areaView.text.toString(), - binding.objectInclude.lineView.text.toString(), - binding.objectInclude.roadView.text.toString(), - binding.objectInclude.constructDateView.text.toString(), - binding.objectInclude.ownerView.text.toString(), - objectId, - markerId, - binding.identifierInclude.identifierTypeSpinner.selectedItem.toString(), - "${binding.identifierInclude.identifierDeepView.text}mm", - binding.identifierInclude.personDeptView.text.toString(), - binding.identifierInclude.installTimeView.text.toString(), - binding.identifierInclude.lngView.text.toString(), - binding.identifierInclude.latView.text.toString(), - binding.identifierInclude.colorSpinner.selectedItem.toString().toColor(), - binding.remarkView.text.toString(), - realPaths - ) - - //保存默认值 - "markerObjectTypeView".setDefaultValue(binding.objectInclude.markerObjectTypeView.text.toString()) - "pipelineDiameterView".setDefaultValue(binding.objectInclude.pipelineDiameterView.text.toString()) - "buryDeepView".setDefaultValue(binding.objectInclude.buryDeepView.text.toString()) - "downPipeDiameterView".setDefaultValue(binding.objectInclude.downPipeDiameterView.text.toString()) - "downPointDeepView".setDefaultValue(binding.objectInclude.downPointDeepView.text.toString()) - "areaView".setDefaultValue(binding.objectInclude.areaView.text.toString()) - "lineView".setDefaultValue(binding.objectInclude.lineView.text.toString()) - "roadView".setDefaultValue(binding.objectInclude.roadView.text.toString()) - "ownerView".setDefaultValue(binding.objectInclude.ownerView.text.toString()) - "identifierDeepView".setDefaultValue(binding.identifierInclude.identifierDeepView.text.toString()) - "personDeptView".setDefaultValue(binding.identifierInclude.personDeptView.text.toString()) - } else { - NoNetworkDialog.Builder().setContext(context) - .setOnDialogButtonClickListener(object : - NoNetworkDialog.OnDialogButtonClickListener { - override fun onButtonClick() { - val intent = Intent(Settings.ACTION_SETTINGS) - startActivity(intent) - } - }).build().show() - } - } - - binding.readLabelButton.setOnClickListener { - LoadingDialogHub.show(this, "标识器读取中,请稍后...") - - soundPool = SoundPool.Builder() - .setMaxStreams(16) - .setAudioAttributes(audioAttributes) - .build() - soundPool?.apply { - val soundResId = load(context, R.raw.ring3, 1) - setOnLoadCompleteListener { soundPool, _, _ -> - soundPool.play(soundResId, 1f, 1f, 0, -1, 1f) - } - } - - serialPortManager.searchMarkerSignal() - } - } - - override fun onDataReceived(buffer: ByteArray) { - LoadingDialogHub.dismiss() - soundPool?.release() - - val hex = buffer.toHex() -// Log.d(kTag, "$kTag => $hex") - if (hex.length >= 20) { - val markerId = hex.take(20).hexToString() - if (markerId.isNumber()) { - binding.identifierInclude.identifierIdView.text = markerId - serialPortManager.closeSerialPort() - } - } - } - - private fun saveLabelInLocal() { - val objectId = SaveKeyValues.getValue(LocaleConstant.OBJECT_ID, "") as String - - val labelBean = LabelBean() - labelBean.objectType = binding.objectInclude.objectTypeSpinner.selectedItem.toString() - labelBean.pipelineType = binding.objectInclude.markerObjectTypeView.text.toString() - labelBean.pipelineMaterial = binding.objectInclude.materialSpinner.selectedItem.toString() - labelBean.pipelineDiameter = "${binding.objectInclude.pipelineDiameterView.text}mm" - labelBean.buryDeep = "${binding.objectInclude.buryDeepView.text}mm" - labelBean.lowerType = binding.objectInclude.downPipeTypeSpinner.selectedItem.toString() - labelBean.lowerMaterial = - binding.objectInclude.downPipeMaterialSpinner.selectedItem.toString() - labelBean.lowerDiameter = "${binding.objectInclude.downPipeDiameterView.text}mm" - labelBean.lowerDeep = "${binding.objectInclude.downPointDeepView.text}mm" - labelBean.buryMethod = binding.objectInclude.buryMethodSpinner.selectedItem.toString() - labelBean.area = binding.objectInclude.areaView.text.toString() - labelBean.line = binding.objectInclude.lineView.text.toString() - labelBean.road = binding.objectInclude.roadView.text.toString() - labelBean.constructTime = binding.objectInclude.constructDateView.text.toString() - labelBean.owner = binding.objectInclude.ownerView.text.toString() - labelBean.objectId = objectId - labelBean.identifierId = binding.identifierInclude.identifierIdView.text.toString() - labelBean.identifierType = - binding.identifierInclude.identifierTypeSpinner.selectedItem.toString() - labelBean.identifierDeep = "${binding.identifierInclude.identifierDeepView.text}mm" - labelBean.person = binding.identifierInclude.personDeptView.text.toString() - labelBean.installTime = binding.identifierInclude.installTimeView.text.toString() - labelBean.lng = binding.identifierInclude.lngView.text.toString() - labelBean.lat = binding.identifierInclude.latView.text.toString() - labelBean.color = binding.identifierInclude.colorSpinner.selectedItem.toString().toColor() - labelBean.remark = binding.remarkView.text.toString() - labelBean.imagePath = realPaths.toJson() - - DataBaseManager.get.insertTaskLabel(labelBean) - } - - private fun takePicture() { - PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - if (result == null) { - "拍照失败,请重试".show(context) - return - } - analyticalSelectResults(result[0]) - } - - override fun onCancel() { - - } - }) - } - - private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 - result.realPath.compressImage(this, object : OnImageCompressListener { - override fun onSuccess(file: File) { - realPaths.add(file.absolutePath) - imageAdapter.setupImage(realPaths) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) - } - - override fun observeRequestState() { - taskViewModel.loadState.observe(this) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "标识器安装中,请稍后...") - LoadState.Success -> { - LoadingDialogHub.dismiss() - finish() - } - - else -> LoadingDialogHub.dismiss() - } - } - } - - override fun setupTopBarLayout() { - binding.titleInclude.titleView.text = "安装新标识器" - binding.titleInclude.titleView.setTextColor(R.color.themeColor.convertColor(this)) - - binding.rootView.initImmersionBar(this, true, R.color.white) - } - - override fun onDestroy() { - super.onDestroy() - soundPool?.release() - locationHub.stopLocation() - } - - override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - if (keyCode == KeyEvent.KEYCODE_BACK) { - soundPool?.release() - } - return super.onKeyDown(keyCode, event) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/view/LoginActivity.kt b/app/src/main/java/com/casic/detector/view/LoginActivity.kt index 6a0cce9..dde848f 100644 --- a/app/src/main/java/com/casic/detector/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/detector/view/LoginActivity.kt @@ -4,13 +4,13 @@ import androidx.lifecycle.ViewModelProvider import com.amap.api.navi.NaviSetting import com.casic.detector.databinding.ActivityLoginBinding -import com.casic.detector.utils.LoadingDialogHub import com.casic.detector.utils.LocaleConstant import com.casic.detector.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertMessageDialog diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt index ae048ce..79e7e11 100644 --- a/app/src/main/java/com/casic/detector/view/MainActivity.kt +++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt @@ -60,7 +60,6 @@ import com.casic.detector.utils.ExcelHub import com.casic.detector.utils.FileType import com.casic.detector.utils.GpioManager -import com.casic.detector.utils.LoadingDialogHub import com.casic.detector.utils.LocaleConstant import com.casic.detector.utils.LocationHub import com.casic.detector.utils.RouteOnMap @@ -89,6 +88,7 @@ import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.FileDownloadManager import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -133,7 +133,7 @@ /***inner class 需要用到*****start*/ private val taskViewModel by lazy { ViewModelProvider(this)[TaskViewModel::class.java] } private val attr = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_MEDIA) + .setUsage(AudioAttributes.USAGE_ALARM) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build() private val soundPool = SoundPool.Builder().setMaxStreams(16).setAudioAttributes(attr).build() diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f9ce1e2..378a76b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -63,9 +63,7 @@ - - (), - SerialPortManager.OnSerialPortListener { - - private val kTag = "InstallLabelActivity" - private val context = this@InstallLabelActivity - private val serialPortManager by lazy { SerialPortManager(this) } - private val calendar by lazy { Calendar.getInstance() } - private val audioAttributes = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_ALARM) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build() - private val realPaths = ArrayList() //真实图片路径 - private val locationHub by lazy { LocationHub(this) } - private lateinit var imageAdapter: EditableImageAdapter - private lateinit var taskViewModel: TaskViewModel - private var soundPool: SoundPool? = null - - override fun initViewBinding(): ActivityInstallLabelBinding { - return ActivityInstallLabelBinding.inflate(layoutInflater) - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN or WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) - - imageAdapter = EditableImageAdapter(this, 3, 3) - binding.cameraInclude.addImageRecyclerView.adapter = imageAdapter - - taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] - - //设置默认值 - binding.objectInclude.markerObjectTypeView.setText("markerObjectTypeView".getDefaultValue()) - binding.objectInclude.pipelineDiameterView.setText("pipelineDiameterView".getDefaultValue()) - binding.objectInclude.buryDeepView.setText("buryDeepView".getDefaultValue()) - binding.objectInclude.downPipeDiameterView.setText("downPipeDiameterView".getDefaultValue()) - binding.objectInclude.downPointDeepView.setText("downPointDeepView".getDefaultValue()) - binding.objectInclude.areaView.setText("areaView".getDefaultValue()) - binding.objectInclude.lineView.setText("lineView".getDefaultValue()) - binding.objectInclude.roadView.setText("roadView".getDefaultValue()) - binding.objectInclude.ownerView.setText("ownerView".getDefaultValue()) - binding.identifierInclude.identifierDeepView.setText("identifierDeepView".getDefaultValue()) - binding.identifierInclude.personDeptView.setText("personDeptView".getDefaultValue()) - } - - override fun initEvent() { - binding.titleInclude.leftBackView.setOnClickListener { finish() } - - /**************************************************************************************/ - binding.objectInclude.objectTypeSpinner.show(this, LocaleConstant.POINT_TYPE_ARRAY, 0) - binding.objectInclude.materialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 0) - binding.objectInclude.downPipeTypeSpinner.show(this, LocaleConstant.DOWN_PIPE_TYPE_ARRAY, 0) - binding.objectInclude.downPipeMaterialSpinner.show( - this, LocaleConstant.PIPE_MATERIAL_ARRAY, 0 - ) - binding.objectInclude.buryMethodSpinner.show(this, LocaleConstant.BURY_METHOD_ARRAY, 0) - - binding.objectInclude.constructDateView.setOnClickListener { - val datePicker = DatePickerDialog( - this, - null, - calendar.get(Calendar.YEAR), - calendar.get(Calendar.MONTH), - calendar.get(Calendar.DAY_OF_MONTH) - ) - datePicker.show() - - datePicker.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener { - val year = datePicker.datePicker.year - val month = datePicker.datePicker.month + 1 - val day = datePicker.datePicker.dayOfMonth - val selectedDate = String.format( - "%s-%s-%s", year, month.appendZero(), day.appendZero() - ) - - //当前时间 - val current = System.currentTimeMillis().timestampToTime() - val today = "$selectedDate $current".dateToTimestamp() - if (Date(today).after(Date())) { - "建设年代不能早于当前日期".show(context) - } else { - datePicker.dismiss() - binding.objectInclude.constructDateView.text = selectedDate - } - } - } - - binding.identifierInclude.identifierTypeSpinner.show( - this, LocaleConstant.IDENTIFIER_TYPE_ARRAY, 0 - ) - - binding.identifierInclude.installTimeView.text = - System.currentTimeMillis().timestampToCompleteDate() - locationHub.getCurrentLocation(true, object : ILocationListener { - override fun onAMapLocationGet(location: AMapLocation?) { - if (location != null) { - binding.identifierInclude.lngView.text = location.longitude.toString() - binding.identifierInclude.latView.text = location.latitude.toString() - } else { - "当前位置信号差,无法获取定位".show(context) - } - } - }) - - binding.identifierInclude.colorSpinner.show(this, LocaleConstant.COLOR_ARRAY, 0) - - imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { - override fun onAddImageClick() { - takePicture() - } - - override fun onItemClick(position: Int) { - if (realPaths[position].isEmpty()) { - "图片加载失败,无法查看大图".show(context) - } else { - context.navigatePageTo(position, realPaths) - } - } - - override fun onItemLongClick(view: View?, position: Int) { - imageAdapter.deleteImage(position) - } - }) - /**************************************************************************************/ - binding.installButton.setOnClickListener { - if (isNetworkConnected()) { - val companyId = SaveKeyValues.getValue(LocaleConstant.USER_COMPANY_ID, "") as String - val objectId = SaveKeyValues.getValue(LocaleConstant.OBJECT_ID, "") as String - if (binding.objectInclude.markerObjectTypeView.text.isNullOrBlank()) { - when (binding.objectInclude.objectTypeSpinner.selectedItem.toString()) { - "管线" -> { - "请输入管线种类!".show(this) - } - - "管线附属物" -> { - "请输入附属物名称!".show(this) - } - - "管线特征管点" -> { - "请输入特征管点!".show(this) - } - - "交叉穿越点" -> { - "请输入上层管种类!".show(this) - } - } - return@setOnClickListener - } - - if (binding.objectInclude.pipelineDiameterView.text.isNullOrBlank()) { - "请输入管径".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.buryDeepView.text.isNullOrBlank()) { - "请输入埋深".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.downPipeDiameterView.text.isNullOrBlank()) { - "请输入下层管管径".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.areaView.text.isNullOrBlank()) { - "请输入所属区域".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.lineView.text.isNullOrBlank()) { - "请输入所属线路".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.roadView.text.isNullOrBlank()) { - "请输入所属道路".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.constructDateView.text.isNullOrBlank()) { - "请选择建设年代".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.ownerView.text.isNullOrBlank()) { - "请输入权属单位".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.identifierIdView.text.isNullOrBlank()) { - "请先读取标识器获取ID".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.identifierDeepView.text.isNullOrBlank()) { - "请输入标识器埋深".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.personDeptView.text.isNullOrBlank()) { - "请输入标识器安装部门".show(this) - return@setOnClickListener - } - - //查本地库 - val markerId = binding.identifierInclude.identifierIdView.text.toString() - val result = DataBaseManager.get.queryLabelById(markerId) - if (result.isEmpty()) { - "".show(this) - return@setOnClickListener - } - - //先存本地再上传服务器 - saveLabelInLocal() - - taskViewModel.installLabel( - companyId, - binding.objectInclude.objectTypeSpinner.selectedItem.toString().toObjectType(), - binding.objectInclude.markerObjectTypeView.text.toString(), - binding.objectInclude.materialSpinner.selectedItem.toString(), - "${binding.objectInclude.pipelineDiameterView.text}mm", - "${binding.objectInclude.buryDeepView.text}mm", - binding.objectInclude.downPipeTypeSpinner.selectedItem.toString(), - binding.objectInclude.downPipeMaterialSpinner.selectedItem.toString(), - "${binding.objectInclude.downPipeDiameterView.text}mm", - "${binding.objectInclude.downPointDeepView.text}mm", - binding.objectInclude.buryMethodSpinner.selectedItem.toString(), - binding.objectInclude.areaView.text.toString(), - binding.objectInclude.lineView.text.toString(), - binding.objectInclude.roadView.text.toString(), - binding.objectInclude.constructDateView.text.toString(), - binding.objectInclude.ownerView.text.toString(), - objectId, - markerId, - binding.identifierInclude.identifierTypeSpinner.selectedItem.toString(), - "${binding.identifierInclude.identifierDeepView.text}mm", - binding.identifierInclude.personDeptView.text.toString(), - binding.identifierInclude.installTimeView.text.toString(), - binding.identifierInclude.lngView.text.toString(), - binding.identifierInclude.latView.text.toString(), - binding.identifierInclude.colorSpinner.selectedItem.toString().toColor(), - binding.remarkView.text.toString(), - realPaths - ) - - //保存默认值 - "markerObjectTypeView".setDefaultValue(binding.objectInclude.markerObjectTypeView.text.toString()) - "pipelineDiameterView".setDefaultValue(binding.objectInclude.pipelineDiameterView.text.toString()) - "buryDeepView".setDefaultValue(binding.objectInclude.buryDeepView.text.toString()) - "downPipeDiameterView".setDefaultValue(binding.objectInclude.downPipeDiameterView.text.toString()) - "downPointDeepView".setDefaultValue(binding.objectInclude.downPointDeepView.text.toString()) - "areaView".setDefaultValue(binding.objectInclude.areaView.text.toString()) - "lineView".setDefaultValue(binding.objectInclude.lineView.text.toString()) - "roadView".setDefaultValue(binding.objectInclude.roadView.text.toString()) - "ownerView".setDefaultValue(binding.objectInclude.ownerView.text.toString()) - "identifierDeepView".setDefaultValue(binding.identifierInclude.identifierDeepView.text.toString()) - "personDeptView".setDefaultValue(binding.identifierInclude.personDeptView.text.toString()) - } else { - NoNetworkDialog.Builder().setContext(context) - .setOnDialogButtonClickListener(object : - NoNetworkDialog.OnDialogButtonClickListener { - override fun onButtonClick() { - val intent = Intent(Settings.ACTION_SETTINGS) - startActivity(intent) - } - }).build().show() - } - } - - binding.readLabelButton.setOnClickListener { - LoadingDialogHub.show(this, "标识器读取中,请稍后...") - - soundPool = SoundPool.Builder() - .setMaxStreams(16) - .setAudioAttributes(audioAttributes) - .build() - soundPool?.apply { - val soundResId = load(context, R.raw.ring3, 1) - setOnLoadCompleteListener { soundPool, _, _ -> - soundPool.play(soundResId, 1f, 1f, 0, -1, 1f) - } - } - - serialPortManager.searchMarkerSignal() - } - } - - override fun onDataReceived(buffer: ByteArray) { - LoadingDialogHub.dismiss() - soundPool?.release() - - val hex = buffer.toHex() -// Log.d(kTag, "$kTag => $hex") - if (hex.length >= 20) { - val markerId = hex.take(20).hexToString() - if (markerId.isNumber()) { - binding.identifierInclude.identifierIdView.text = markerId - serialPortManager.closeSerialPort() - } - } - } - - private fun saveLabelInLocal() { - val objectId = SaveKeyValues.getValue(LocaleConstant.OBJECT_ID, "") as String - - val labelBean = LabelBean() - labelBean.objectType = binding.objectInclude.objectTypeSpinner.selectedItem.toString() - labelBean.pipelineType = binding.objectInclude.markerObjectTypeView.text.toString() - labelBean.pipelineMaterial = binding.objectInclude.materialSpinner.selectedItem.toString() - labelBean.pipelineDiameter = "${binding.objectInclude.pipelineDiameterView.text}mm" - labelBean.buryDeep = "${binding.objectInclude.buryDeepView.text}mm" - labelBean.lowerType = binding.objectInclude.downPipeTypeSpinner.selectedItem.toString() - labelBean.lowerMaterial = - binding.objectInclude.downPipeMaterialSpinner.selectedItem.toString() - labelBean.lowerDiameter = "${binding.objectInclude.downPipeDiameterView.text}mm" - labelBean.lowerDeep = "${binding.objectInclude.downPointDeepView.text}mm" - labelBean.buryMethod = binding.objectInclude.buryMethodSpinner.selectedItem.toString() - labelBean.area = binding.objectInclude.areaView.text.toString() - labelBean.line = binding.objectInclude.lineView.text.toString() - labelBean.road = binding.objectInclude.roadView.text.toString() - labelBean.constructTime = binding.objectInclude.constructDateView.text.toString() - labelBean.owner = binding.objectInclude.ownerView.text.toString() - labelBean.objectId = objectId - labelBean.identifierId = binding.identifierInclude.identifierIdView.text.toString() - labelBean.identifierType = - binding.identifierInclude.identifierTypeSpinner.selectedItem.toString() - labelBean.identifierDeep = "${binding.identifierInclude.identifierDeepView.text}mm" - labelBean.person = binding.identifierInclude.personDeptView.text.toString() - labelBean.installTime = binding.identifierInclude.installTimeView.text.toString() - labelBean.lng = binding.identifierInclude.lngView.text.toString() - labelBean.lat = binding.identifierInclude.latView.text.toString() - labelBean.color = binding.identifierInclude.colorSpinner.selectedItem.toString().toColor() - labelBean.remark = binding.remarkView.text.toString() - labelBean.imagePath = realPaths.toJson() - - DataBaseManager.get.insertTaskLabel(labelBean) - } - - private fun takePicture() { - PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - if (result == null) { - "拍照失败,请重试".show(context) - return - } - analyticalSelectResults(result[0]) - } - - override fun onCancel() { - - } - }) - } - - private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 - result.realPath.compressImage(this, object : OnImageCompressListener { - override fun onSuccess(file: File) { - realPaths.add(file.absolutePath) - imageAdapter.setupImage(realPaths) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) - } - - override fun observeRequestState() { - taskViewModel.loadState.observe(this) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "标识器安装中,请稍后...") - LoadState.Success -> { - LoadingDialogHub.dismiss() - finish() - } - - else -> LoadingDialogHub.dismiss() - } - } - } - - override fun setupTopBarLayout() { - binding.titleInclude.titleView.text = "安装新标识器" - binding.titleInclude.titleView.setTextColor(R.color.themeColor.convertColor(this)) - - binding.rootView.initImmersionBar(this, true, R.color.white) - } - - override fun onDestroy() { - super.onDestroy() - soundPool?.release() - locationHub.stopLocation() - } - - override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - if (keyCode == KeyEvent.KEYCODE_BACK) { - soundPool?.release() - } - return super.onKeyDown(keyCode, event) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/view/LoginActivity.kt b/app/src/main/java/com/casic/detector/view/LoginActivity.kt index 6a0cce9..dde848f 100644 --- a/app/src/main/java/com/casic/detector/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/detector/view/LoginActivity.kt @@ -4,13 +4,13 @@ import androidx.lifecycle.ViewModelProvider import com.amap.api.navi.NaviSetting import com.casic.detector.databinding.ActivityLoginBinding -import com.casic.detector.utils.LoadingDialogHub import com.casic.detector.utils.LocaleConstant import com.casic.detector.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertMessageDialog diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt index ae048ce..79e7e11 100644 --- a/app/src/main/java/com/casic/detector/view/MainActivity.kt +++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt @@ -60,7 +60,6 @@ import com.casic.detector.utils.ExcelHub import com.casic.detector.utils.FileType import com.casic.detector.utils.GpioManager -import com.casic.detector.utils.LoadingDialogHub import com.casic.detector.utils.LocaleConstant import com.casic.detector.utils.LocationHub import com.casic.detector.utils.RouteOnMap @@ -89,6 +88,7 @@ import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.FileDownloadManager import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -133,7 +133,7 @@ /***inner class 需要用到*****start*/ private val taskViewModel by lazy { ViewModelProvider(this)[TaskViewModel::class.java] } private val attr = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_MEDIA) + .setUsage(AudioAttributes.USAGE_ALARM) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build() private val soundPool = SoundPool.Builder().setMaxStreams(16).setAudioAttributes(attr).build() diff --git a/app/src/main/java/com/casic/detector/view/SearchLabelActivity.kt b/app/src/main/java/com/casic/detector/view/SearchLabelActivity.kt deleted file mode 100644 index 3d8bb94..0000000 --- a/app/src/main/java/com/casic/detector/view/SearchLabelActivity.kt +++ /dev/null @@ -1,301 +0,0 @@ -package com.casic.detector.view - -import android.graphics.Color -import android.media.AudioAttributes -import android.media.SoundPool -import android.os.Bundle -import android.os.CountDownTimer -import android.view.animation.Animation -import android.view.animation.RotateAnimation -import androidx.activity.OnBackPressedCallback -import androidx.lifecycle.ViewModelProvider -import com.casic.detector.R -import com.casic.detector.bean.TaskBean -import com.casic.detector.databinding.ActivitySearchLabelBinding -import com.casic.detector.extensions.hexToString -import com.casic.detector.extensions.isNumber -import com.casic.detector.extensions.toHex -import com.casic.detector.utils.DataBaseManager -import com.casic.detector.utils.LoadingDialogHub -import com.casic.detector.utils.LocationHub -import com.casic.detector.utils.SerialPortManager -import com.casic.detector.vm.TaskViewModel -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.utils.LoadState -import com.pengxh.kt.lite.widget.dialog.AlertMessageDialog -import java.text.DecimalFormat - -class SearchLabelActivity : KotlinBaseActivity(), - SerialPortManager.OnSerialPortListener { - - private val kTag = "SearchLabelActivity" - private val serialPortManager by lazy { SerialPortManager(this) } - private val decimal by lazy { DecimalFormat("0.0") } - private val degreeCache by lazy { HashMap() } - private val locationHub by lazy { LocationHub(this) } - private val audioAttributes = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_ALARM) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build() - private lateinit var taskViewModel: TaskViewModel - private lateinit var slowSoundPool: SoundPool - private lateinit var fastSoundPool: SoundPool - private var slowResId = 0 - private var fastResId = 0 - private var markerId = "" - private var taskLabel: TaskBean? = null - private var isPlaying = false - - override fun initOnCreate(savedInstanceState: Bundle?) { - initSoundResource() - serialPortManager.detectMarker() - - taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] - //角度 - degreeCache["lastDegree"] = 0f - - //实时定位 -// locationHub.getCurrentLocation(false, object : ILocationListener { -// override fun onAMapLocationGet(location: AMapLocation?) { -// if (location != null) { -// if (identifierId != "") { -// val label = DataBaseManager.get.queryLabelById(identifierId).first() -// -// val result = location.calculateAngle( -// LatLng(label.lat.toDouble(), label.lng.toDouble()) -// ) -// -// binding.resultTextView.text = -// "标识器ID ${identifierId},${result.direction} ${result.angle},距离 ${result.distance}" -// } -// } -// } -// }) - } - - override fun initEvent() { - binding.depthButton.setOnClickListener { -// serialPortManager.closeSerialPort() - val result = DataBaseManager.get.queryLabelById(markerId) - if (result.isNotEmpty()) { - val tag = when (result.first().identifierType) { - "EM30" -> '7' - "EM50" -> '8' - "EM14" -> '9' - else -> '1' - } - if (tag == '1') { - "此标识器无法读取埋深!".show(this) - } else { - // 发送读取标识器埋设深度指令 - LoadingDialogHub.show(this, "正在测距,请稍后...") - serialPortManager.detectDepth(tag) - object : CountDownTimer(15 * 1000, 1000) { - override fun onTick(millisUntilFinished: Long) { - - } - - override fun onFinish() { - LoadingDialogHub.dismiss() - "请重试".show(this@SearchLabelActivity) -// initSoundResource() -// serialPortManager.detectMarker() - } - }.start() - } - } else { - "标识器未安装,安装成功后才可读取埋深!".show(this) - } - } - - binding.markerInfoButton.setOnClickListener { - //查库 - val result = DataBaseManager.get.queryLabelById(markerId) - if (result.isNotEmpty()) { - navigatePageTo(result.first().toJson()) - } else { - navigatePageTo(markerId) - } - } - - //返回键监听,替换onBackPressed - onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - slowSoundPool.release() - fastSoundPool.release() - serialPortManager.closeSerialPort() - finish() - } - }) - } - - override fun onDataReceived(buffer: ByteArray) { - val hex = buffer.toHex() -// Log.d(kTag, "$kTag => $hex") - if (hex.startsWith("4E")) { - try { - //4E转为String为N,代表能量值 - //用能量值转动表盘 - val energyResponse = hex.take(10).hexToString() - val energy = energyResponse.substring(1).toInt() - if (energy >= 4000) { - isPlaying = if (!isPlaying) { - fastSoundPool.play(fastResId, 1f, 1f, 0, 0, 1f) - true - } else { - fastSoundPool.stop(fastResId) - false - } - } else { - isPlaying = if (!isPlaying) { - slowSoundPool.play(slowResId, 1f, 1f, 0, 0, 1f) - true - } else { - slowSoundPool.stop(slowResId) - false - } - } - - binding.resultTextView.text = "信号能量值:${energyResponse}" - - //转换为转动的角度 - val degree = (energy.toFloat() / (50 * 100)) * 180 - binding.energyValueView.text = decimal.format(degree) - - degreeCache["lastDegree"]?.apply { - val animation = RotateAnimation( - this, degree, - Animation.RELATIVE_TO_SELF, 0.5f, - Animation.RELATIVE_TO_SELF, 0.5f - ) - animation.duration = 0 - animation.fillAfter = true - binding.needleView.startAnimation(animation) - } - - //保存旋转后的角度 - degreeCache["lastDegree"] = degree - - if (energy <= 700) {//18° - binding.energyTipsView.text = "标识器信号较弱,可能距离较远" - binding.energyTipsView.setTextColor(Color.parseColor("#8D1717")) - binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_red) - - binding.depthButton.isEnabled = false - binding.depthButton.setTextColor(Color.parseColor("#CCCCCC")) - binding.depthButton.setBackgroundResource(R.mipmap.left_button_disable) - binding.markerInfoButton.isEnabled = false - binding.markerInfoButton.setTextColor(Color.parseColor("#CCCCCC")) - binding.markerInfoButton.setBackgroundResource(R.mipmap.right_button_disable) - - binding.searchResultView.text = "未检测到标识器" - binding.searchResultView.setTextColor(Color.parseColor("#8D1717")) - binding.searchResultView.setBackgroundResource(R.mipmap.bg_small_text_red) - } else if (energy >= 4100) {//148° - binding.energyTipsView.text = "标识器信号极强,可能在正下方" - binding.energyTipsView.setTextColor(Color.parseColor("#428d00")) - binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_green) - } else {//[18°,148°] - binding.energyTipsView.text = "已靠近标识器,请继续移动位置" - binding.energyTipsView.setTextColor(Color.parseColor("#8C5700")) - binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_yellow) - } - } catch (e: NumberFormatException) { - e.printStackTrace() - } - } else if (hex.startsWith("53")) { - LoadingDialogHub.dismiss() - try { - val depthResponse = hex.take(10).hexToString() - val depth = depthResponse.drop(4) - AlertMessageDialog.Builder() - .setContext(this@SearchLabelActivity) - .setTitle("温馨提示") - .setMessage("标识器埋深:${depth}厘米") - .setPositiveButton("知道了") - .setOnDialogButtonClickListener(object : - AlertMessageDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { -// initSoundResource() -// serialPortManager.detectMarker() - } - }).build().show() - } catch (e: NumberFormatException) { - e.printStackTrace() - } - } else { - if (hex.length >= 20) { - val id = hex.take(20).hexToString() - if (markerId.isNumber()) { - markerId = id - - binding.depthButton.isEnabled = true - binding.depthButton.setTextColor(Color.WHITE) - binding.depthButton.setBackgroundResource(R.mipmap.left_button_enable) - binding.markerInfoButton.isEnabled = true - binding.markerInfoButton.setTextColor(Color.WHITE) - binding.markerInfoButton.setBackgroundResource(R.mipmap.right_button_enable) - - binding.searchResultView.text = "已检测到标识器" - binding.searchResultView.setTextColor(Color.parseColor("#428d00")) - binding.searchResultView.setBackgroundResource(R.mipmap.bg_small_text_green) - - //自动上传标识器 - taskLabel = DataBaseManager.get.queryTaskLabelByIdAndState( - markerId, "未开始" - ) - taskLabel?.apply { - /** - * 此taskCode是 [com.casic.detector.model.TaskModel.MessageModel.TaskDetailInfosModel] 里面的主键,也就是这个标签在数据库里面的主键 - * */ - taskViewModel.uploadMarker(taskCode) - } - } - } - } - } - - private fun initSoundResource() { - /** - * 声音效果速度 - * ling - - (), - SerialPortManager.OnSerialPortListener { - - private val kTag = "InstallLabelActivity" - private val context = this@InstallLabelActivity - private val serialPortManager by lazy { SerialPortManager(this) } - private val calendar by lazy { Calendar.getInstance() } - private val audioAttributes = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_ALARM) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build() - private val realPaths = ArrayList() //真实图片路径 - private val locationHub by lazy { LocationHub(this) } - private lateinit var imageAdapter: EditableImageAdapter - private lateinit var taskViewModel: TaskViewModel - private var soundPool: SoundPool? = null - - override fun initViewBinding(): ActivityInstallLabelBinding { - return ActivityInstallLabelBinding.inflate(layoutInflater) - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN or WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) - - imageAdapter = EditableImageAdapter(this, 3, 3) - binding.cameraInclude.addImageRecyclerView.adapter = imageAdapter - - taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] - - //设置默认值 - binding.objectInclude.markerObjectTypeView.setText("markerObjectTypeView".getDefaultValue()) - binding.objectInclude.pipelineDiameterView.setText("pipelineDiameterView".getDefaultValue()) - binding.objectInclude.buryDeepView.setText("buryDeepView".getDefaultValue()) - binding.objectInclude.downPipeDiameterView.setText("downPipeDiameterView".getDefaultValue()) - binding.objectInclude.downPointDeepView.setText("downPointDeepView".getDefaultValue()) - binding.objectInclude.areaView.setText("areaView".getDefaultValue()) - binding.objectInclude.lineView.setText("lineView".getDefaultValue()) - binding.objectInclude.roadView.setText("roadView".getDefaultValue()) - binding.objectInclude.ownerView.setText("ownerView".getDefaultValue()) - binding.identifierInclude.identifierDeepView.setText("identifierDeepView".getDefaultValue()) - binding.identifierInclude.personDeptView.setText("personDeptView".getDefaultValue()) - } - - override fun initEvent() { - binding.titleInclude.leftBackView.setOnClickListener { finish() } - - /**************************************************************************************/ - binding.objectInclude.objectTypeSpinner.show(this, LocaleConstant.POINT_TYPE_ARRAY, 0) - binding.objectInclude.materialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 0) - binding.objectInclude.downPipeTypeSpinner.show(this, LocaleConstant.DOWN_PIPE_TYPE_ARRAY, 0) - binding.objectInclude.downPipeMaterialSpinner.show( - this, LocaleConstant.PIPE_MATERIAL_ARRAY, 0 - ) - binding.objectInclude.buryMethodSpinner.show(this, LocaleConstant.BURY_METHOD_ARRAY, 0) - - binding.objectInclude.constructDateView.setOnClickListener { - val datePicker = DatePickerDialog( - this, - null, - calendar.get(Calendar.YEAR), - calendar.get(Calendar.MONTH), - calendar.get(Calendar.DAY_OF_MONTH) - ) - datePicker.show() - - datePicker.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener { - val year = datePicker.datePicker.year - val month = datePicker.datePicker.month + 1 - val day = datePicker.datePicker.dayOfMonth - val selectedDate = String.format( - "%s-%s-%s", year, month.appendZero(), day.appendZero() - ) - - //当前时间 - val current = System.currentTimeMillis().timestampToTime() - val today = "$selectedDate $current".dateToTimestamp() - if (Date(today).after(Date())) { - "建设年代不能早于当前日期".show(context) - } else { - datePicker.dismiss() - binding.objectInclude.constructDateView.text = selectedDate - } - } - } - - binding.identifierInclude.identifierTypeSpinner.show( - this, LocaleConstant.IDENTIFIER_TYPE_ARRAY, 0 - ) - - binding.identifierInclude.installTimeView.text = - System.currentTimeMillis().timestampToCompleteDate() - locationHub.getCurrentLocation(true, object : ILocationListener { - override fun onAMapLocationGet(location: AMapLocation?) { - if (location != null) { - binding.identifierInclude.lngView.text = location.longitude.toString() - binding.identifierInclude.latView.text = location.latitude.toString() - } else { - "当前位置信号差,无法获取定位".show(context) - } - } - }) - - binding.identifierInclude.colorSpinner.show(this, LocaleConstant.COLOR_ARRAY, 0) - - imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { - override fun onAddImageClick() { - takePicture() - } - - override fun onItemClick(position: Int) { - if (realPaths[position].isEmpty()) { - "图片加载失败,无法查看大图".show(context) - } else { - context.navigatePageTo(position, realPaths) - } - } - - override fun onItemLongClick(view: View?, position: Int) { - imageAdapter.deleteImage(position) - } - }) - /**************************************************************************************/ - binding.installButton.setOnClickListener { - if (isNetworkConnected()) { - val companyId = SaveKeyValues.getValue(LocaleConstant.USER_COMPANY_ID, "") as String - val objectId = SaveKeyValues.getValue(LocaleConstant.OBJECT_ID, "") as String - if (binding.objectInclude.markerObjectTypeView.text.isNullOrBlank()) { - when (binding.objectInclude.objectTypeSpinner.selectedItem.toString()) { - "管线" -> { - "请输入管线种类!".show(this) - } - - "管线附属物" -> { - "请输入附属物名称!".show(this) - } - - "管线特征管点" -> { - "请输入特征管点!".show(this) - } - - "交叉穿越点" -> { - "请输入上层管种类!".show(this) - } - } - return@setOnClickListener - } - - if (binding.objectInclude.pipelineDiameterView.text.isNullOrBlank()) { - "请输入管径".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.buryDeepView.text.isNullOrBlank()) { - "请输入埋深".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.downPipeDiameterView.text.isNullOrBlank()) { - "请输入下层管管径".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.areaView.text.isNullOrBlank()) { - "请输入所属区域".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.lineView.text.isNullOrBlank()) { - "请输入所属线路".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.roadView.text.isNullOrBlank()) { - "请输入所属道路".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.constructDateView.text.isNullOrBlank()) { - "请选择建设年代".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.ownerView.text.isNullOrBlank()) { - "请输入权属单位".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.identifierIdView.text.isNullOrBlank()) { - "请先读取标识器获取ID".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.identifierDeepView.text.isNullOrBlank()) { - "请输入标识器埋深".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.personDeptView.text.isNullOrBlank()) { - "请输入标识器安装部门".show(this) - return@setOnClickListener - } - - //查本地库 - val markerId = binding.identifierInclude.identifierIdView.text.toString() - val result = DataBaseManager.get.queryLabelById(markerId) - if (result.isEmpty()) { - "".show(this) - return@setOnClickListener - } - - //先存本地再上传服务器 - saveLabelInLocal() - - taskViewModel.installLabel( - companyId, - binding.objectInclude.objectTypeSpinner.selectedItem.toString().toObjectType(), - binding.objectInclude.markerObjectTypeView.text.toString(), - binding.objectInclude.materialSpinner.selectedItem.toString(), - "${binding.objectInclude.pipelineDiameterView.text}mm", - "${binding.objectInclude.buryDeepView.text}mm", - binding.objectInclude.downPipeTypeSpinner.selectedItem.toString(), - binding.objectInclude.downPipeMaterialSpinner.selectedItem.toString(), - "${binding.objectInclude.downPipeDiameterView.text}mm", - "${binding.objectInclude.downPointDeepView.text}mm", - binding.objectInclude.buryMethodSpinner.selectedItem.toString(), - binding.objectInclude.areaView.text.toString(), - binding.objectInclude.lineView.text.toString(), - binding.objectInclude.roadView.text.toString(), - binding.objectInclude.constructDateView.text.toString(), - binding.objectInclude.ownerView.text.toString(), - objectId, - markerId, - binding.identifierInclude.identifierTypeSpinner.selectedItem.toString(), - "${binding.identifierInclude.identifierDeepView.text}mm", - binding.identifierInclude.personDeptView.text.toString(), - binding.identifierInclude.installTimeView.text.toString(), - binding.identifierInclude.lngView.text.toString(), - binding.identifierInclude.latView.text.toString(), - binding.identifierInclude.colorSpinner.selectedItem.toString().toColor(), - binding.remarkView.text.toString(), - realPaths - ) - - //保存默认值 - "markerObjectTypeView".setDefaultValue(binding.objectInclude.markerObjectTypeView.text.toString()) - "pipelineDiameterView".setDefaultValue(binding.objectInclude.pipelineDiameterView.text.toString()) - "buryDeepView".setDefaultValue(binding.objectInclude.buryDeepView.text.toString()) - "downPipeDiameterView".setDefaultValue(binding.objectInclude.downPipeDiameterView.text.toString()) - "downPointDeepView".setDefaultValue(binding.objectInclude.downPointDeepView.text.toString()) - "areaView".setDefaultValue(binding.objectInclude.areaView.text.toString()) - "lineView".setDefaultValue(binding.objectInclude.lineView.text.toString()) - "roadView".setDefaultValue(binding.objectInclude.roadView.text.toString()) - "ownerView".setDefaultValue(binding.objectInclude.ownerView.text.toString()) - "identifierDeepView".setDefaultValue(binding.identifierInclude.identifierDeepView.text.toString()) - "personDeptView".setDefaultValue(binding.identifierInclude.personDeptView.text.toString()) - } else { - NoNetworkDialog.Builder().setContext(context) - .setOnDialogButtonClickListener(object : - NoNetworkDialog.OnDialogButtonClickListener { - override fun onButtonClick() { - val intent = Intent(Settings.ACTION_SETTINGS) - startActivity(intent) - } - }).build().show() - } - } - - binding.readLabelButton.setOnClickListener { - LoadingDialogHub.show(this, "标识器读取中,请稍后...") - - soundPool = SoundPool.Builder() - .setMaxStreams(16) - .setAudioAttributes(audioAttributes) - .build() - soundPool?.apply { - val soundResId = load(context, R.raw.ring3, 1) - setOnLoadCompleteListener { soundPool, _, _ -> - soundPool.play(soundResId, 1f, 1f, 0, -1, 1f) - } - } - - serialPortManager.searchMarkerSignal() - } - } - - override fun onDataReceived(buffer: ByteArray) { - LoadingDialogHub.dismiss() - soundPool?.release() - - val hex = buffer.toHex() -// Log.d(kTag, "$kTag => $hex") - if (hex.length >= 20) { - val markerId = hex.take(20).hexToString() - if (markerId.isNumber()) { - binding.identifierInclude.identifierIdView.text = markerId - serialPortManager.closeSerialPort() - } - } - } - - private fun saveLabelInLocal() { - val objectId = SaveKeyValues.getValue(LocaleConstant.OBJECT_ID, "") as String - - val labelBean = LabelBean() - labelBean.objectType = binding.objectInclude.objectTypeSpinner.selectedItem.toString() - labelBean.pipelineType = binding.objectInclude.markerObjectTypeView.text.toString() - labelBean.pipelineMaterial = binding.objectInclude.materialSpinner.selectedItem.toString() - labelBean.pipelineDiameter = "${binding.objectInclude.pipelineDiameterView.text}mm" - labelBean.buryDeep = "${binding.objectInclude.buryDeepView.text}mm" - labelBean.lowerType = binding.objectInclude.downPipeTypeSpinner.selectedItem.toString() - labelBean.lowerMaterial = - binding.objectInclude.downPipeMaterialSpinner.selectedItem.toString() - labelBean.lowerDiameter = "${binding.objectInclude.downPipeDiameterView.text}mm" - labelBean.lowerDeep = "${binding.objectInclude.downPointDeepView.text}mm" - labelBean.buryMethod = binding.objectInclude.buryMethodSpinner.selectedItem.toString() - labelBean.area = binding.objectInclude.areaView.text.toString() - labelBean.line = binding.objectInclude.lineView.text.toString() - labelBean.road = binding.objectInclude.roadView.text.toString() - labelBean.constructTime = binding.objectInclude.constructDateView.text.toString() - labelBean.owner = binding.objectInclude.ownerView.text.toString() - labelBean.objectId = objectId - labelBean.identifierId = binding.identifierInclude.identifierIdView.text.toString() - labelBean.identifierType = - binding.identifierInclude.identifierTypeSpinner.selectedItem.toString() - labelBean.identifierDeep = "${binding.identifierInclude.identifierDeepView.text}mm" - labelBean.person = binding.identifierInclude.personDeptView.text.toString() - labelBean.installTime = binding.identifierInclude.installTimeView.text.toString() - labelBean.lng = binding.identifierInclude.lngView.text.toString() - labelBean.lat = binding.identifierInclude.latView.text.toString() - labelBean.color = binding.identifierInclude.colorSpinner.selectedItem.toString().toColor() - labelBean.remark = binding.remarkView.text.toString() - labelBean.imagePath = realPaths.toJson() - - DataBaseManager.get.insertTaskLabel(labelBean) - } - - private fun takePicture() { - PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - if (result == null) { - "拍照失败,请重试".show(context) - return - } - analyticalSelectResults(result[0]) - } - - override fun onCancel() { - - } - }) - } - - private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 - result.realPath.compressImage(this, object : OnImageCompressListener { - override fun onSuccess(file: File) { - realPaths.add(file.absolutePath) - imageAdapter.setupImage(realPaths) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) - } - - override fun observeRequestState() { - taskViewModel.loadState.observe(this) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "标识器安装中,请稍后...") - LoadState.Success -> { - LoadingDialogHub.dismiss() - finish() - } - - else -> LoadingDialogHub.dismiss() - } - } - } - - override fun setupTopBarLayout() { - binding.titleInclude.titleView.text = "安装新标识器" - binding.titleInclude.titleView.setTextColor(R.color.themeColor.convertColor(this)) - - binding.rootView.initImmersionBar(this, true, R.color.white) - } - - override fun onDestroy() { - super.onDestroy() - soundPool?.release() - locationHub.stopLocation() - } - - override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - if (keyCode == KeyEvent.KEYCODE_BACK) { - soundPool?.release() - } - return super.onKeyDown(keyCode, event) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/view/LoginActivity.kt b/app/src/main/java/com/casic/detector/view/LoginActivity.kt index 6a0cce9..dde848f 100644 --- a/app/src/main/java/com/casic/detector/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/detector/view/LoginActivity.kt @@ -4,13 +4,13 @@ import androidx.lifecycle.ViewModelProvider import com.amap.api.navi.NaviSetting import com.casic.detector.databinding.ActivityLoginBinding -import com.casic.detector.utils.LoadingDialogHub import com.casic.detector.utils.LocaleConstant import com.casic.detector.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertMessageDialog diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt index ae048ce..79e7e11 100644 --- a/app/src/main/java/com/casic/detector/view/MainActivity.kt +++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt @@ -60,7 +60,6 @@ import com.casic.detector.utils.ExcelHub import com.casic.detector.utils.FileType import com.casic.detector.utils.GpioManager -import com.casic.detector.utils.LoadingDialogHub import com.casic.detector.utils.LocaleConstant import com.casic.detector.utils.LocationHub import com.casic.detector.utils.RouteOnMap @@ -89,6 +88,7 @@ import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.FileDownloadManager import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -133,7 +133,7 @@ /***inner class 需要用到*****start*/ private val taskViewModel by lazy { ViewModelProvider(this)[TaskViewModel::class.java] } private val attr = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_MEDIA) + .setUsage(AudioAttributes.USAGE_ALARM) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build() private val soundPool = SoundPool.Builder().setMaxStreams(16).setAudioAttributes(attr).build() diff --git a/app/src/main/java/com/casic/detector/view/SearchLabelActivity.kt b/app/src/main/java/com/casic/detector/view/SearchLabelActivity.kt deleted file mode 100644 index 3d8bb94..0000000 --- a/app/src/main/java/com/casic/detector/view/SearchLabelActivity.kt +++ /dev/null @@ -1,301 +0,0 @@ -package com.casic.detector.view - -import android.graphics.Color -import android.media.AudioAttributes -import android.media.SoundPool -import android.os.Bundle -import android.os.CountDownTimer -import android.view.animation.Animation -import android.view.animation.RotateAnimation -import androidx.activity.OnBackPressedCallback -import androidx.lifecycle.ViewModelProvider -import com.casic.detector.R -import com.casic.detector.bean.TaskBean -import com.casic.detector.databinding.ActivitySearchLabelBinding -import com.casic.detector.extensions.hexToString -import com.casic.detector.extensions.isNumber -import com.casic.detector.extensions.toHex -import com.casic.detector.utils.DataBaseManager -import com.casic.detector.utils.LoadingDialogHub -import com.casic.detector.utils.LocationHub -import com.casic.detector.utils.SerialPortManager -import com.casic.detector.vm.TaskViewModel -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.utils.LoadState -import com.pengxh.kt.lite.widget.dialog.AlertMessageDialog -import java.text.DecimalFormat - -class SearchLabelActivity : KotlinBaseActivity(), - SerialPortManager.OnSerialPortListener { - - private val kTag = "SearchLabelActivity" - private val serialPortManager by lazy { SerialPortManager(this) } - private val decimal by lazy { DecimalFormat("0.0") } - private val degreeCache by lazy { HashMap() } - private val locationHub by lazy { LocationHub(this) } - private val audioAttributes = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_ALARM) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build() - private lateinit var taskViewModel: TaskViewModel - private lateinit var slowSoundPool: SoundPool - private lateinit var fastSoundPool: SoundPool - private var slowResId = 0 - private var fastResId = 0 - private var markerId = "" - private var taskLabel: TaskBean? = null - private var isPlaying = false - - override fun initOnCreate(savedInstanceState: Bundle?) { - initSoundResource() - serialPortManager.detectMarker() - - taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] - //角度 - degreeCache["lastDegree"] = 0f - - //实时定位 -// locationHub.getCurrentLocation(false, object : ILocationListener { -// override fun onAMapLocationGet(location: AMapLocation?) { -// if (location != null) { -// if (identifierId != "") { -// val label = DataBaseManager.get.queryLabelById(identifierId).first() -// -// val result = location.calculateAngle( -// LatLng(label.lat.toDouble(), label.lng.toDouble()) -// ) -// -// binding.resultTextView.text = -// "标识器ID ${identifierId},${result.direction} ${result.angle},距离 ${result.distance}" -// } -// } -// } -// }) - } - - override fun initEvent() { - binding.depthButton.setOnClickListener { -// serialPortManager.closeSerialPort() - val result = DataBaseManager.get.queryLabelById(markerId) - if (result.isNotEmpty()) { - val tag = when (result.first().identifierType) { - "EM30" -> '7' - "EM50" -> '8' - "EM14" -> '9' - else -> '1' - } - if (tag == '1') { - "此标识器无法读取埋深!".show(this) - } else { - // 发送读取标识器埋设深度指令 - LoadingDialogHub.show(this, "正在测距,请稍后...") - serialPortManager.detectDepth(tag) - object : CountDownTimer(15 * 1000, 1000) { - override fun onTick(millisUntilFinished: Long) { - - } - - override fun onFinish() { - LoadingDialogHub.dismiss() - "请重试".show(this@SearchLabelActivity) -// initSoundResource() -// serialPortManager.detectMarker() - } - }.start() - } - } else { - "标识器未安装,安装成功后才可读取埋深!".show(this) - } - } - - binding.markerInfoButton.setOnClickListener { - //查库 - val result = DataBaseManager.get.queryLabelById(markerId) - if (result.isNotEmpty()) { - navigatePageTo(result.first().toJson()) - } else { - navigatePageTo(markerId) - } - } - - //返回键监听,替换onBackPressed - onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - slowSoundPool.release() - fastSoundPool.release() - serialPortManager.closeSerialPort() - finish() - } - }) - } - - override fun onDataReceived(buffer: ByteArray) { - val hex = buffer.toHex() -// Log.d(kTag, "$kTag => $hex") - if (hex.startsWith("4E")) { - try { - //4E转为String为N,代表能量值 - //用能量值转动表盘 - val energyResponse = hex.take(10).hexToString() - val energy = energyResponse.substring(1).toInt() - if (energy >= 4000) { - isPlaying = if (!isPlaying) { - fastSoundPool.play(fastResId, 1f, 1f, 0, 0, 1f) - true - } else { - fastSoundPool.stop(fastResId) - false - } - } else { - isPlaying = if (!isPlaying) { - slowSoundPool.play(slowResId, 1f, 1f, 0, 0, 1f) - true - } else { - slowSoundPool.stop(slowResId) - false - } - } - - binding.resultTextView.text = "信号能量值:${energyResponse}" - - //转换为转动的角度 - val degree = (energy.toFloat() / (50 * 100)) * 180 - binding.energyValueView.text = decimal.format(degree) - - degreeCache["lastDegree"]?.apply { - val animation = RotateAnimation( - this, degree, - Animation.RELATIVE_TO_SELF, 0.5f, - Animation.RELATIVE_TO_SELF, 0.5f - ) - animation.duration = 0 - animation.fillAfter = true - binding.needleView.startAnimation(animation) - } - - //保存旋转后的角度 - degreeCache["lastDegree"] = degree - - if (energy <= 700) {//18° - binding.energyTipsView.text = "标识器信号较弱,可能距离较远" - binding.energyTipsView.setTextColor(Color.parseColor("#8D1717")) - binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_red) - - binding.depthButton.isEnabled = false - binding.depthButton.setTextColor(Color.parseColor("#CCCCCC")) - binding.depthButton.setBackgroundResource(R.mipmap.left_button_disable) - binding.markerInfoButton.isEnabled = false - binding.markerInfoButton.setTextColor(Color.parseColor("#CCCCCC")) - binding.markerInfoButton.setBackgroundResource(R.mipmap.right_button_disable) - - binding.searchResultView.text = "未检测到标识器" - binding.searchResultView.setTextColor(Color.parseColor("#8D1717")) - binding.searchResultView.setBackgroundResource(R.mipmap.bg_small_text_red) - } else if (energy >= 4100) {//148° - binding.energyTipsView.text = "标识器信号极强,可能在正下方" - binding.energyTipsView.setTextColor(Color.parseColor("#428d00")) - binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_green) - } else {//[18°,148°] - binding.energyTipsView.text = "已靠近标识器,请继续移动位置" - binding.energyTipsView.setTextColor(Color.parseColor("#8C5700")) - binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_yellow) - } - } catch (e: NumberFormatException) { - e.printStackTrace() - } - } else if (hex.startsWith("53")) { - LoadingDialogHub.dismiss() - try { - val depthResponse = hex.take(10).hexToString() - val depth = depthResponse.drop(4) - AlertMessageDialog.Builder() - .setContext(this@SearchLabelActivity) - .setTitle("温馨提示") - .setMessage("标识器埋深:${depth}厘米") - .setPositiveButton("知道了") - .setOnDialogButtonClickListener(object : - AlertMessageDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { -// initSoundResource() -// serialPortManager.detectMarker() - } - }).build().show() - } catch (e: NumberFormatException) { - e.printStackTrace() - } - } else { - if (hex.length >= 20) { - val id = hex.take(20).hexToString() - if (markerId.isNumber()) { - markerId = id - - binding.depthButton.isEnabled = true - binding.depthButton.setTextColor(Color.WHITE) - binding.depthButton.setBackgroundResource(R.mipmap.left_button_enable) - binding.markerInfoButton.isEnabled = true - binding.markerInfoButton.setTextColor(Color.WHITE) - binding.markerInfoButton.setBackgroundResource(R.mipmap.right_button_enable) - - binding.searchResultView.text = "已检测到标识器" - binding.searchResultView.setTextColor(Color.parseColor("#428d00")) - binding.searchResultView.setBackgroundResource(R.mipmap.bg_small_text_green) - - //自动上传标识器 - taskLabel = DataBaseManager.get.queryTaskLabelByIdAndState( - markerId, "未开始" - ) - taskLabel?.apply { - /** - * 此taskCode是 [com.casic.detector.model.TaskModel.MessageModel.TaskDetailInfosModel] 里面的主键,也就是这个标签在数据库里面的主键 - * */ - taskViewModel.uploadMarker(taskCode) - } - } - } - } - } - - private fun initSoundResource() { - /** - * 声音效果速度 - * ling - - (), - SerialPortManager.OnSerialPortListener { - - private val kTag = "InstallLabelActivity" - private val context = this@InstallLabelActivity - private val serialPortManager by lazy { SerialPortManager(this) } - private val calendar by lazy { Calendar.getInstance() } - private val audioAttributes = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_ALARM) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build() - private val realPaths = ArrayList() //真实图片路径 - private val locationHub by lazy { LocationHub(this) } - private lateinit var imageAdapter: EditableImageAdapter - private lateinit var taskViewModel: TaskViewModel - private var soundPool: SoundPool? = null - - override fun initViewBinding(): ActivityInstallLabelBinding { - return ActivityInstallLabelBinding.inflate(layoutInflater) - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN or WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) - - imageAdapter = EditableImageAdapter(this, 3, 3) - binding.cameraInclude.addImageRecyclerView.adapter = imageAdapter - - taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] - - //设置默认值 - binding.objectInclude.markerObjectTypeView.setText("markerObjectTypeView".getDefaultValue()) - binding.objectInclude.pipelineDiameterView.setText("pipelineDiameterView".getDefaultValue()) - binding.objectInclude.buryDeepView.setText("buryDeepView".getDefaultValue()) - binding.objectInclude.downPipeDiameterView.setText("downPipeDiameterView".getDefaultValue()) - binding.objectInclude.downPointDeepView.setText("downPointDeepView".getDefaultValue()) - binding.objectInclude.areaView.setText("areaView".getDefaultValue()) - binding.objectInclude.lineView.setText("lineView".getDefaultValue()) - binding.objectInclude.roadView.setText("roadView".getDefaultValue()) - binding.objectInclude.ownerView.setText("ownerView".getDefaultValue()) - binding.identifierInclude.identifierDeepView.setText("identifierDeepView".getDefaultValue()) - binding.identifierInclude.personDeptView.setText("personDeptView".getDefaultValue()) - } - - override fun initEvent() { - binding.titleInclude.leftBackView.setOnClickListener { finish() } - - /**************************************************************************************/ - binding.objectInclude.objectTypeSpinner.show(this, LocaleConstant.POINT_TYPE_ARRAY, 0) - binding.objectInclude.materialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 0) - binding.objectInclude.downPipeTypeSpinner.show(this, LocaleConstant.DOWN_PIPE_TYPE_ARRAY, 0) - binding.objectInclude.downPipeMaterialSpinner.show( - this, LocaleConstant.PIPE_MATERIAL_ARRAY, 0 - ) - binding.objectInclude.buryMethodSpinner.show(this, LocaleConstant.BURY_METHOD_ARRAY, 0) - - binding.objectInclude.constructDateView.setOnClickListener { - val datePicker = DatePickerDialog( - this, - null, - calendar.get(Calendar.YEAR), - calendar.get(Calendar.MONTH), - calendar.get(Calendar.DAY_OF_MONTH) - ) - datePicker.show() - - datePicker.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener { - val year = datePicker.datePicker.year - val month = datePicker.datePicker.month + 1 - val day = datePicker.datePicker.dayOfMonth - val selectedDate = String.format( - "%s-%s-%s", year, month.appendZero(), day.appendZero() - ) - - //当前时间 - val current = System.currentTimeMillis().timestampToTime() - val today = "$selectedDate $current".dateToTimestamp() - if (Date(today).after(Date())) { - "建设年代不能早于当前日期".show(context) - } else { - datePicker.dismiss() - binding.objectInclude.constructDateView.text = selectedDate - } - } - } - - binding.identifierInclude.identifierTypeSpinner.show( - this, LocaleConstant.IDENTIFIER_TYPE_ARRAY, 0 - ) - - binding.identifierInclude.installTimeView.text = - System.currentTimeMillis().timestampToCompleteDate() - locationHub.getCurrentLocation(true, object : ILocationListener { - override fun onAMapLocationGet(location: AMapLocation?) { - if (location != null) { - binding.identifierInclude.lngView.text = location.longitude.toString() - binding.identifierInclude.latView.text = location.latitude.toString() - } else { - "当前位置信号差,无法获取定位".show(context) - } - } - }) - - binding.identifierInclude.colorSpinner.show(this, LocaleConstant.COLOR_ARRAY, 0) - - imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { - override fun onAddImageClick() { - takePicture() - } - - override fun onItemClick(position: Int) { - if (realPaths[position].isEmpty()) { - "图片加载失败,无法查看大图".show(context) - } else { - context.navigatePageTo(position, realPaths) - } - } - - override fun onItemLongClick(view: View?, position: Int) { - imageAdapter.deleteImage(position) - } - }) - /**************************************************************************************/ - binding.installButton.setOnClickListener { - if (isNetworkConnected()) { - val companyId = SaveKeyValues.getValue(LocaleConstant.USER_COMPANY_ID, "") as String - val objectId = SaveKeyValues.getValue(LocaleConstant.OBJECT_ID, "") as String - if (binding.objectInclude.markerObjectTypeView.text.isNullOrBlank()) { - when (binding.objectInclude.objectTypeSpinner.selectedItem.toString()) { - "管线" -> { - "请输入管线种类!".show(this) - } - - "管线附属物" -> { - "请输入附属物名称!".show(this) - } - - "管线特征管点" -> { - "请输入特征管点!".show(this) - } - - "交叉穿越点" -> { - "请输入上层管种类!".show(this) - } - } - return@setOnClickListener - } - - if (binding.objectInclude.pipelineDiameterView.text.isNullOrBlank()) { - "请输入管径".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.buryDeepView.text.isNullOrBlank()) { - "请输入埋深".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.downPipeDiameterView.text.isNullOrBlank()) { - "请输入下层管管径".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.areaView.text.isNullOrBlank()) { - "请输入所属区域".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.lineView.text.isNullOrBlank()) { - "请输入所属线路".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.roadView.text.isNullOrBlank()) { - "请输入所属道路".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.constructDateView.text.isNullOrBlank()) { - "请选择建设年代".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.ownerView.text.isNullOrBlank()) { - "请输入权属单位".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.identifierIdView.text.isNullOrBlank()) { - "请先读取标识器获取ID".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.identifierDeepView.text.isNullOrBlank()) { - "请输入标识器埋深".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.personDeptView.text.isNullOrBlank()) { - "请输入标识器安装部门".show(this) - return@setOnClickListener - } - - //查本地库 - val markerId = binding.identifierInclude.identifierIdView.text.toString() - val result = DataBaseManager.get.queryLabelById(markerId) - if (result.isEmpty()) { - "".show(this) - return@setOnClickListener - } - - //先存本地再上传服务器 - saveLabelInLocal() - - taskViewModel.installLabel( - companyId, - binding.objectInclude.objectTypeSpinner.selectedItem.toString().toObjectType(), - binding.objectInclude.markerObjectTypeView.text.toString(), - binding.objectInclude.materialSpinner.selectedItem.toString(), - "${binding.objectInclude.pipelineDiameterView.text}mm", - "${binding.objectInclude.buryDeepView.text}mm", - binding.objectInclude.downPipeTypeSpinner.selectedItem.toString(), - binding.objectInclude.downPipeMaterialSpinner.selectedItem.toString(), - "${binding.objectInclude.downPipeDiameterView.text}mm", - "${binding.objectInclude.downPointDeepView.text}mm", - binding.objectInclude.buryMethodSpinner.selectedItem.toString(), - binding.objectInclude.areaView.text.toString(), - binding.objectInclude.lineView.text.toString(), - binding.objectInclude.roadView.text.toString(), - binding.objectInclude.constructDateView.text.toString(), - binding.objectInclude.ownerView.text.toString(), - objectId, - markerId, - binding.identifierInclude.identifierTypeSpinner.selectedItem.toString(), - "${binding.identifierInclude.identifierDeepView.text}mm", - binding.identifierInclude.personDeptView.text.toString(), - binding.identifierInclude.installTimeView.text.toString(), - binding.identifierInclude.lngView.text.toString(), - binding.identifierInclude.latView.text.toString(), - binding.identifierInclude.colorSpinner.selectedItem.toString().toColor(), - binding.remarkView.text.toString(), - realPaths - ) - - //保存默认值 - "markerObjectTypeView".setDefaultValue(binding.objectInclude.markerObjectTypeView.text.toString()) - "pipelineDiameterView".setDefaultValue(binding.objectInclude.pipelineDiameterView.text.toString()) - "buryDeepView".setDefaultValue(binding.objectInclude.buryDeepView.text.toString()) - "downPipeDiameterView".setDefaultValue(binding.objectInclude.downPipeDiameterView.text.toString()) - "downPointDeepView".setDefaultValue(binding.objectInclude.downPointDeepView.text.toString()) - "areaView".setDefaultValue(binding.objectInclude.areaView.text.toString()) - "lineView".setDefaultValue(binding.objectInclude.lineView.text.toString()) - "roadView".setDefaultValue(binding.objectInclude.roadView.text.toString()) - "ownerView".setDefaultValue(binding.objectInclude.ownerView.text.toString()) - "identifierDeepView".setDefaultValue(binding.identifierInclude.identifierDeepView.text.toString()) - "personDeptView".setDefaultValue(binding.identifierInclude.personDeptView.text.toString()) - } else { - NoNetworkDialog.Builder().setContext(context) - .setOnDialogButtonClickListener(object : - NoNetworkDialog.OnDialogButtonClickListener { - override fun onButtonClick() { - val intent = Intent(Settings.ACTION_SETTINGS) - startActivity(intent) - } - }).build().show() - } - } - - binding.readLabelButton.setOnClickListener { - LoadingDialogHub.show(this, "标识器读取中,请稍后...") - - soundPool = SoundPool.Builder() - .setMaxStreams(16) - .setAudioAttributes(audioAttributes) - .build() - soundPool?.apply { - val soundResId = load(context, R.raw.ring3, 1) - setOnLoadCompleteListener { soundPool, _, _ -> - soundPool.play(soundResId, 1f, 1f, 0, -1, 1f) - } - } - - serialPortManager.searchMarkerSignal() - } - } - - override fun onDataReceived(buffer: ByteArray) { - LoadingDialogHub.dismiss() - soundPool?.release() - - val hex = buffer.toHex() -// Log.d(kTag, "$kTag => $hex") - if (hex.length >= 20) { - val markerId = hex.take(20).hexToString() - if (markerId.isNumber()) { - binding.identifierInclude.identifierIdView.text = markerId - serialPortManager.closeSerialPort() - } - } - } - - private fun saveLabelInLocal() { - val objectId = SaveKeyValues.getValue(LocaleConstant.OBJECT_ID, "") as String - - val labelBean = LabelBean() - labelBean.objectType = binding.objectInclude.objectTypeSpinner.selectedItem.toString() - labelBean.pipelineType = binding.objectInclude.markerObjectTypeView.text.toString() - labelBean.pipelineMaterial = binding.objectInclude.materialSpinner.selectedItem.toString() - labelBean.pipelineDiameter = "${binding.objectInclude.pipelineDiameterView.text}mm" - labelBean.buryDeep = "${binding.objectInclude.buryDeepView.text}mm" - labelBean.lowerType = binding.objectInclude.downPipeTypeSpinner.selectedItem.toString() - labelBean.lowerMaterial = - binding.objectInclude.downPipeMaterialSpinner.selectedItem.toString() - labelBean.lowerDiameter = "${binding.objectInclude.downPipeDiameterView.text}mm" - labelBean.lowerDeep = "${binding.objectInclude.downPointDeepView.text}mm" - labelBean.buryMethod = binding.objectInclude.buryMethodSpinner.selectedItem.toString() - labelBean.area = binding.objectInclude.areaView.text.toString() - labelBean.line = binding.objectInclude.lineView.text.toString() - labelBean.road = binding.objectInclude.roadView.text.toString() - labelBean.constructTime = binding.objectInclude.constructDateView.text.toString() - labelBean.owner = binding.objectInclude.ownerView.text.toString() - labelBean.objectId = objectId - labelBean.identifierId = binding.identifierInclude.identifierIdView.text.toString() - labelBean.identifierType = - binding.identifierInclude.identifierTypeSpinner.selectedItem.toString() - labelBean.identifierDeep = "${binding.identifierInclude.identifierDeepView.text}mm" - labelBean.person = binding.identifierInclude.personDeptView.text.toString() - labelBean.installTime = binding.identifierInclude.installTimeView.text.toString() - labelBean.lng = binding.identifierInclude.lngView.text.toString() - labelBean.lat = binding.identifierInclude.latView.text.toString() - labelBean.color = binding.identifierInclude.colorSpinner.selectedItem.toString().toColor() - labelBean.remark = binding.remarkView.text.toString() - labelBean.imagePath = realPaths.toJson() - - DataBaseManager.get.insertTaskLabel(labelBean) - } - - private fun takePicture() { - PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - if (result == null) { - "拍照失败,请重试".show(context) - return - } - analyticalSelectResults(result[0]) - } - - override fun onCancel() { - - } - }) - } - - private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 - result.realPath.compressImage(this, object : OnImageCompressListener { - override fun onSuccess(file: File) { - realPaths.add(file.absolutePath) - imageAdapter.setupImage(realPaths) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) - } - - override fun observeRequestState() { - taskViewModel.loadState.observe(this) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "标识器安装中,请稍后...") - LoadState.Success -> { - LoadingDialogHub.dismiss() - finish() - } - - else -> LoadingDialogHub.dismiss() - } - } - } - - override fun setupTopBarLayout() { - binding.titleInclude.titleView.text = "安装新标识器" - binding.titleInclude.titleView.setTextColor(R.color.themeColor.convertColor(this)) - - binding.rootView.initImmersionBar(this, true, R.color.white) - } - - override fun onDestroy() { - super.onDestroy() - soundPool?.release() - locationHub.stopLocation() - } - - override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - if (keyCode == KeyEvent.KEYCODE_BACK) { - soundPool?.release() - } - return super.onKeyDown(keyCode, event) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/view/LoginActivity.kt b/app/src/main/java/com/casic/detector/view/LoginActivity.kt index 6a0cce9..dde848f 100644 --- a/app/src/main/java/com/casic/detector/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/detector/view/LoginActivity.kt @@ -4,13 +4,13 @@ import androidx.lifecycle.ViewModelProvider import com.amap.api.navi.NaviSetting import com.casic.detector.databinding.ActivityLoginBinding -import com.casic.detector.utils.LoadingDialogHub import com.casic.detector.utils.LocaleConstant import com.casic.detector.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertMessageDialog diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt index ae048ce..79e7e11 100644 --- a/app/src/main/java/com/casic/detector/view/MainActivity.kt +++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt @@ -60,7 +60,6 @@ import com.casic.detector.utils.ExcelHub import com.casic.detector.utils.FileType import com.casic.detector.utils.GpioManager -import com.casic.detector.utils.LoadingDialogHub import com.casic.detector.utils.LocaleConstant import com.casic.detector.utils.LocationHub import com.casic.detector.utils.RouteOnMap @@ -89,6 +88,7 @@ import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.FileDownloadManager import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -133,7 +133,7 @@ /***inner class 需要用到*****start*/ private val taskViewModel by lazy { ViewModelProvider(this)[TaskViewModel::class.java] } private val attr = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_MEDIA) + .setUsage(AudioAttributes.USAGE_ALARM) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build() private val soundPool = SoundPool.Builder().setMaxStreams(16).setAudioAttributes(attr).build() diff --git a/app/src/main/java/com/casic/detector/view/SearchLabelActivity.kt b/app/src/main/java/com/casic/detector/view/SearchLabelActivity.kt deleted file mode 100644 index 3d8bb94..0000000 --- a/app/src/main/java/com/casic/detector/view/SearchLabelActivity.kt +++ /dev/null @@ -1,301 +0,0 @@ -package com.casic.detector.view - -import android.graphics.Color -import android.media.AudioAttributes -import android.media.SoundPool -import android.os.Bundle -import android.os.CountDownTimer -import android.view.animation.Animation -import android.view.animation.RotateAnimation -import androidx.activity.OnBackPressedCallback -import androidx.lifecycle.ViewModelProvider -import com.casic.detector.R -import com.casic.detector.bean.TaskBean -import com.casic.detector.databinding.ActivitySearchLabelBinding -import com.casic.detector.extensions.hexToString -import com.casic.detector.extensions.isNumber -import com.casic.detector.extensions.toHex -import com.casic.detector.utils.DataBaseManager -import com.casic.detector.utils.LoadingDialogHub -import com.casic.detector.utils.LocationHub -import com.casic.detector.utils.SerialPortManager -import com.casic.detector.vm.TaskViewModel -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.utils.LoadState -import com.pengxh.kt.lite.widget.dialog.AlertMessageDialog -import java.text.DecimalFormat - -class SearchLabelActivity : KotlinBaseActivity(), - SerialPortManager.OnSerialPortListener { - - private val kTag = "SearchLabelActivity" - private val serialPortManager by lazy { SerialPortManager(this) } - private val decimal by lazy { DecimalFormat("0.0") } - private val degreeCache by lazy { HashMap() } - private val locationHub by lazy { LocationHub(this) } - private val audioAttributes = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_ALARM) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build() - private lateinit var taskViewModel: TaskViewModel - private lateinit var slowSoundPool: SoundPool - private lateinit var fastSoundPool: SoundPool - private var slowResId = 0 - private var fastResId = 0 - private var markerId = "" - private var taskLabel: TaskBean? = null - private var isPlaying = false - - override fun initOnCreate(savedInstanceState: Bundle?) { - initSoundResource() - serialPortManager.detectMarker() - - taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] - //角度 - degreeCache["lastDegree"] = 0f - - //实时定位 -// locationHub.getCurrentLocation(false, object : ILocationListener { -// override fun onAMapLocationGet(location: AMapLocation?) { -// if (location != null) { -// if (identifierId != "") { -// val label = DataBaseManager.get.queryLabelById(identifierId).first() -// -// val result = location.calculateAngle( -// LatLng(label.lat.toDouble(), label.lng.toDouble()) -// ) -// -// binding.resultTextView.text = -// "标识器ID ${identifierId},${result.direction} ${result.angle},距离 ${result.distance}" -// } -// } -// } -// }) - } - - override fun initEvent() { - binding.depthButton.setOnClickListener { -// serialPortManager.closeSerialPort() - val result = DataBaseManager.get.queryLabelById(markerId) - if (result.isNotEmpty()) { - val tag = when (result.first().identifierType) { - "EM30" -> '7' - "EM50" -> '8' - "EM14" -> '9' - else -> '1' - } - if (tag == '1') { - "此标识器无法读取埋深!".show(this) - } else { - // 发送读取标识器埋设深度指令 - LoadingDialogHub.show(this, "正在测距,请稍后...") - serialPortManager.detectDepth(tag) - object : CountDownTimer(15 * 1000, 1000) { - override fun onTick(millisUntilFinished: Long) { - - } - - override fun onFinish() { - LoadingDialogHub.dismiss() - "请重试".show(this@SearchLabelActivity) -// initSoundResource() -// serialPortManager.detectMarker() - } - }.start() - } - } else { - "标识器未安装,安装成功后才可读取埋深!".show(this) - } - } - - binding.markerInfoButton.setOnClickListener { - //查库 - val result = DataBaseManager.get.queryLabelById(markerId) - if (result.isNotEmpty()) { - navigatePageTo(result.first().toJson()) - } else { - navigatePageTo(markerId) - } - } - - //返回键监听,替换onBackPressed - onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - slowSoundPool.release() - fastSoundPool.release() - serialPortManager.closeSerialPort() - finish() - } - }) - } - - override fun onDataReceived(buffer: ByteArray) { - val hex = buffer.toHex() -// Log.d(kTag, "$kTag => $hex") - if (hex.startsWith("4E")) { - try { - //4E转为String为N,代表能量值 - //用能量值转动表盘 - val energyResponse = hex.take(10).hexToString() - val energy = energyResponse.substring(1).toInt() - if (energy >= 4000) { - isPlaying = if (!isPlaying) { - fastSoundPool.play(fastResId, 1f, 1f, 0, 0, 1f) - true - } else { - fastSoundPool.stop(fastResId) - false - } - } else { - isPlaying = if (!isPlaying) { - slowSoundPool.play(slowResId, 1f, 1f, 0, 0, 1f) - true - } else { - slowSoundPool.stop(slowResId) - false - } - } - - binding.resultTextView.text = "信号能量值:${energyResponse}" - - //转换为转动的角度 - val degree = (energy.toFloat() / (50 * 100)) * 180 - binding.energyValueView.text = decimal.format(degree) - - degreeCache["lastDegree"]?.apply { - val animation = RotateAnimation( - this, degree, - Animation.RELATIVE_TO_SELF, 0.5f, - Animation.RELATIVE_TO_SELF, 0.5f - ) - animation.duration = 0 - animation.fillAfter = true - binding.needleView.startAnimation(animation) - } - - //保存旋转后的角度 - degreeCache["lastDegree"] = degree - - if (energy <= 700) {//18° - binding.energyTipsView.text = "标识器信号较弱,可能距离较远" - binding.energyTipsView.setTextColor(Color.parseColor("#8D1717")) - binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_red) - - binding.depthButton.isEnabled = false - binding.depthButton.setTextColor(Color.parseColor("#CCCCCC")) - binding.depthButton.setBackgroundResource(R.mipmap.left_button_disable) - binding.markerInfoButton.isEnabled = false - binding.markerInfoButton.setTextColor(Color.parseColor("#CCCCCC")) - binding.markerInfoButton.setBackgroundResource(R.mipmap.right_button_disable) - - binding.searchResultView.text = "未检测到标识器" - binding.searchResultView.setTextColor(Color.parseColor("#8D1717")) - binding.searchResultView.setBackgroundResource(R.mipmap.bg_small_text_red) - } else if (energy >= 4100) {//148° - binding.energyTipsView.text = "标识器信号极强,可能在正下方" - binding.energyTipsView.setTextColor(Color.parseColor("#428d00")) - binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_green) - } else {//[18°,148°] - binding.energyTipsView.text = "已靠近标识器,请继续移动位置" - binding.energyTipsView.setTextColor(Color.parseColor("#8C5700")) - binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_yellow) - } - } catch (e: NumberFormatException) { - e.printStackTrace() - } - } else if (hex.startsWith("53")) { - LoadingDialogHub.dismiss() - try { - val depthResponse = hex.take(10).hexToString() - val depth = depthResponse.drop(4) - AlertMessageDialog.Builder() - .setContext(this@SearchLabelActivity) - .setTitle("温馨提示") - .setMessage("标识器埋深:${depth}厘米") - .setPositiveButton("知道了") - .setOnDialogButtonClickListener(object : - AlertMessageDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { -// initSoundResource() -// serialPortManager.detectMarker() - } - }).build().show() - } catch (e: NumberFormatException) { - e.printStackTrace() - } - } else { - if (hex.length >= 20) { - val id = hex.take(20).hexToString() - if (markerId.isNumber()) { - markerId = id - - binding.depthButton.isEnabled = true - binding.depthButton.setTextColor(Color.WHITE) - binding.depthButton.setBackgroundResource(R.mipmap.left_button_enable) - binding.markerInfoButton.isEnabled = true - binding.markerInfoButton.setTextColor(Color.WHITE) - binding.markerInfoButton.setBackgroundResource(R.mipmap.right_button_enable) - - binding.searchResultView.text = "已检测到标识器" - binding.searchResultView.setTextColor(Color.parseColor("#428d00")) - binding.searchResultView.setBackgroundResource(R.mipmap.bg_small_text_green) - - //自动上传标识器 - taskLabel = DataBaseManager.get.queryTaskLabelByIdAndState( - markerId, "未开始" - ) - taskLabel?.apply { - /** - * 此taskCode是 [com.casic.detector.model.TaskModel.MessageModel.TaskDetailInfosModel] 里面的主键,也就是这个标签在数据库里面的主键 - * */ - taskViewModel.uploadMarker(taskCode) - } - } - } - } - } - - private fun initSoundResource() { - /** - * 声音效果速度 - * ling - - (), - SerialPortManager.OnSerialPortListener { - - private val kTag = "InstallLabelActivity" - private val context = this@InstallLabelActivity - private val serialPortManager by lazy { SerialPortManager(this) } - private val calendar by lazy { Calendar.getInstance() } - private val audioAttributes = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_ALARM) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build() - private val realPaths = ArrayList() //真实图片路径 - private val locationHub by lazy { LocationHub(this) } - private lateinit var imageAdapter: EditableImageAdapter - private lateinit var taskViewModel: TaskViewModel - private var soundPool: SoundPool? = null - - override fun initViewBinding(): ActivityInstallLabelBinding { - return ActivityInstallLabelBinding.inflate(layoutInflater) - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN or WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) - - imageAdapter = EditableImageAdapter(this, 3, 3) - binding.cameraInclude.addImageRecyclerView.adapter = imageAdapter - - taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] - - //设置默认值 - binding.objectInclude.markerObjectTypeView.setText("markerObjectTypeView".getDefaultValue()) - binding.objectInclude.pipelineDiameterView.setText("pipelineDiameterView".getDefaultValue()) - binding.objectInclude.buryDeepView.setText("buryDeepView".getDefaultValue()) - binding.objectInclude.downPipeDiameterView.setText("downPipeDiameterView".getDefaultValue()) - binding.objectInclude.downPointDeepView.setText("downPointDeepView".getDefaultValue()) - binding.objectInclude.areaView.setText("areaView".getDefaultValue()) - binding.objectInclude.lineView.setText("lineView".getDefaultValue()) - binding.objectInclude.roadView.setText("roadView".getDefaultValue()) - binding.objectInclude.ownerView.setText("ownerView".getDefaultValue()) - binding.identifierInclude.identifierDeepView.setText("identifierDeepView".getDefaultValue()) - binding.identifierInclude.personDeptView.setText("personDeptView".getDefaultValue()) - } - - override fun initEvent() { - binding.titleInclude.leftBackView.setOnClickListener { finish() } - - /**************************************************************************************/ - binding.objectInclude.objectTypeSpinner.show(this, LocaleConstant.POINT_TYPE_ARRAY, 0) - binding.objectInclude.materialSpinner.show(this, LocaleConstant.PIPE_MATERIAL_ARRAY, 0) - binding.objectInclude.downPipeTypeSpinner.show(this, LocaleConstant.DOWN_PIPE_TYPE_ARRAY, 0) - binding.objectInclude.downPipeMaterialSpinner.show( - this, LocaleConstant.PIPE_MATERIAL_ARRAY, 0 - ) - binding.objectInclude.buryMethodSpinner.show(this, LocaleConstant.BURY_METHOD_ARRAY, 0) - - binding.objectInclude.constructDateView.setOnClickListener { - val datePicker = DatePickerDialog( - this, - null, - calendar.get(Calendar.YEAR), - calendar.get(Calendar.MONTH), - calendar.get(Calendar.DAY_OF_MONTH) - ) - datePicker.show() - - datePicker.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener { - val year = datePicker.datePicker.year - val month = datePicker.datePicker.month + 1 - val day = datePicker.datePicker.dayOfMonth - val selectedDate = String.format( - "%s-%s-%s", year, month.appendZero(), day.appendZero() - ) - - //当前时间 - val current = System.currentTimeMillis().timestampToTime() - val today = "$selectedDate $current".dateToTimestamp() - if (Date(today).after(Date())) { - "建设年代不能早于当前日期".show(context) - } else { - datePicker.dismiss() - binding.objectInclude.constructDateView.text = selectedDate - } - } - } - - binding.identifierInclude.identifierTypeSpinner.show( - this, LocaleConstant.IDENTIFIER_TYPE_ARRAY, 0 - ) - - binding.identifierInclude.installTimeView.text = - System.currentTimeMillis().timestampToCompleteDate() - locationHub.getCurrentLocation(true, object : ILocationListener { - override fun onAMapLocationGet(location: AMapLocation?) { - if (location != null) { - binding.identifierInclude.lngView.text = location.longitude.toString() - binding.identifierInclude.latView.text = location.latitude.toString() - } else { - "当前位置信号差,无法获取定位".show(context) - } - } - }) - - binding.identifierInclude.colorSpinner.show(this, LocaleConstant.COLOR_ARRAY, 0) - - imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { - override fun onAddImageClick() { - takePicture() - } - - override fun onItemClick(position: Int) { - if (realPaths[position].isEmpty()) { - "图片加载失败,无法查看大图".show(context) - } else { - context.navigatePageTo(position, realPaths) - } - } - - override fun onItemLongClick(view: View?, position: Int) { - imageAdapter.deleteImage(position) - } - }) - /**************************************************************************************/ - binding.installButton.setOnClickListener { - if (isNetworkConnected()) { - val companyId = SaveKeyValues.getValue(LocaleConstant.USER_COMPANY_ID, "") as String - val objectId = SaveKeyValues.getValue(LocaleConstant.OBJECT_ID, "") as String - if (binding.objectInclude.markerObjectTypeView.text.isNullOrBlank()) { - when (binding.objectInclude.objectTypeSpinner.selectedItem.toString()) { - "管线" -> { - "请输入管线种类!".show(this) - } - - "管线附属物" -> { - "请输入附属物名称!".show(this) - } - - "管线特征管点" -> { - "请输入特征管点!".show(this) - } - - "交叉穿越点" -> { - "请输入上层管种类!".show(this) - } - } - return@setOnClickListener - } - - if (binding.objectInclude.pipelineDiameterView.text.isNullOrBlank()) { - "请输入管径".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.buryDeepView.text.isNullOrBlank()) { - "请输入埋深".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.downPipeDiameterView.text.isNullOrBlank()) { - "请输入下层管管径".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.areaView.text.isNullOrBlank()) { - "请输入所属区域".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.lineView.text.isNullOrBlank()) { - "请输入所属线路".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.roadView.text.isNullOrBlank()) { - "请输入所属道路".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.constructDateView.text.isNullOrBlank()) { - "请选择建设年代".show(this) - return@setOnClickListener - } - - if (binding.objectInclude.ownerView.text.isNullOrBlank()) { - "请输入权属单位".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.identifierIdView.text.isNullOrBlank()) { - "请先读取标识器获取ID".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.identifierDeepView.text.isNullOrBlank()) { - "请输入标识器埋深".show(this) - return@setOnClickListener - } - - if (binding.identifierInclude.personDeptView.text.isNullOrBlank()) { - "请输入标识器安装部门".show(this) - return@setOnClickListener - } - - //查本地库 - val markerId = binding.identifierInclude.identifierIdView.text.toString() - val result = DataBaseManager.get.queryLabelById(markerId) - if (result.isEmpty()) { - "".show(this) - return@setOnClickListener - } - - //先存本地再上传服务器 - saveLabelInLocal() - - taskViewModel.installLabel( - companyId, - binding.objectInclude.objectTypeSpinner.selectedItem.toString().toObjectType(), - binding.objectInclude.markerObjectTypeView.text.toString(), - binding.objectInclude.materialSpinner.selectedItem.toString(), - "${binding.objectInclude.pipelineDiameterView.text}mm", - "${binding.objectInclude.buryDeepView.text}mm", - binding.objectInclude.downPipeTypeSpinner.selectedItem.toString(), - binding.objectInclude.downPipeMaterialSpinner.selectedItem.toString(), - "${binding.objectInclude.downPipeDiameterView.text}mm", - "${binding.objectInclude.downPointDeepView.text}mm", - binding.objectInclude.buryMethodSpinner.selectedItem.toString(), - binding.objectInclude.areaView.text.toString(), - binding.objectInclude.lineView.text.toString(), - binding.objectInclude.roadView.text.toString(), - binding.objectInclude.constructDateView.text.toString(), - binding.objectInclude.ownerView.text.toString(), - objectId, - markerId, - binding.identifierInclude.identifierTypeSpinner.selectedItem.toString(), - "${binding.identifierInclude.identifierDeepView.text}mm", - binding.identifierInclude.personDeptView.text.toString(), - binding.identifierInclude.installTimeView.text.toString(), - binding.identifierInclude.lngView.text.toString(), - binding.identifierInclude.latView.text.toString(), - binding.identifierInclude.colorSpinner.selectedItem.toString().toColor(), - binding.remarkView.text.toString(), - realPaths - ) - - //保存默认值 - "markerObjectTypeView".setDefaultValue(binding.objectInclude.markerObjectTypeView.text.toString()) - "pipelineDiameterView".setDefaultValue(binding.objectInclude.pipelineDiameterView.text.toString()) - "buryDeepView".setDefaultValue(binding.objectInclude.buryDeepView.text.toString()) - "downPipeDiameterView".setDefaultValue(binding.objectInclude.downPipeDiameterView.text.toString()) - "downPointDeepView".setDefaultValue(binding.objectInclude.downPointDeepView.text.toString()) - "areaView".setDefaultValue(binding.objectInclude.areaView.text.toString()) - "lineView".setDefaultValue(binding.objectInclude.lineView.text.toString()) - "roadView".setDefaultValue(binding.objectInclude.roadView.text.toString()) - "ownerView".setDefaultValue(binding.objectInclude.ownerView.text.toString()) - "identifierDeepView".setDefaultValue(binding.identifierInclude.identifierDeepView.text.toString()) - "personDeptView".setDefaultValue(binding.identifierInclude.personDeptView.text.toString()) - } else { - NoNetworkDialog.Builder().setContext(context) - .setOnDialogButtonClickListener(object : - NoNetworkDialog.OnDialogButtonClickListener { - override fun onButtonClick() { - val intent = Intent(Settings.ACTION_SETTINGS) - startActivity(intent) - } - }).build().show() - } - } - - binding.readLabelButton.setOnClickListener { - LoadingDialogHub.show(this, "标识器读取中,请稍后...") - - soundPool = SoundPool.Builder() - .setMaxStreams(16) - .setAudioAttributes(audioAttributes) - .build() - soundPool?.apply { - val soundResId = load(context, R.raw.ring3, 1) - setOnLoadCompleteListener { soundPool, _, _ -> - soundPool.play(soundResId, 1f, 1f, 0, -1, 1f) - } - } - - serialPortManager.searchMarkerSignal() - } - } - - override fun onDataReceived(buffer: ByteArray) { - LoadingDialogHub.dismiss() - soundPool?.release() - - val hex = buffer.toHex() -// Log.d(kTag, "$kTag => $hex") - if (hex.length >= 20) { - val markerId = hex.take(20).hexToString() - if (markerId.isNumber()) { - binding.identifierInclude.identifierIdView.text = markerId - serialPortManager.closeSerialPort() - } - } - } - - private fun saveLabelInLocal() { - val objectId = SaveKeyValues.getValue(LocaleConstant.OBJECT_ID, "") as String - - val labelBean = LabelBean() - labelBean.objectType = binding.objectInclude.objectTypeSpinner.selectedItem.toString() - labelBean.pipelineType = binding.objectInclude.markerObjectTypeView.text.toString() - labelBean.pipelineMaterial = binding.objectInclude.materialSpinner.selectedItem.toString() - labelBean.pipelineDiameter = "${binding.objectInclude.pipelineDiameterView.text}mm" - labelBean.buryDeep = "${binding.objectInclude.buryDeepView.text}mm" - labelBean.lowerType = binding.objectInclude.downPipeTypeSpinner.selectedItem.toString() - labelBean.lowerMaterial = - binding.objectInclude.downPipeMaterialSpinner.selectedItem.toString() - labelBean.lowerDiameter = "${binding.objectInclude.downPipeDiameterView.text}mm" - labelBean.lowerDeep = "${binding.objectInclude.downPointDeepView.text}mm" - labelBean.buryMethod = binding.objectInclude.buryMethodSpinner.selectedItem.toString() - labelBean.area = binding.objectInclude.areaView.text.toString() - labelBean.line = binding.objectInclude.lineView.text.toString() - labelBean.road = binding.objectInclude.roadView.text.toString() - labelBean.constructTime = binding.objectInclude.constructDateView.text.toString() - labelBean.owner = binding.objectInclude.ownerView.text.toString() - labelBean.objectId = objectId - labelBean.identifierId = binding.identifierInclude.identifierIdView.text.toString() - labelBean.identifierType = - binding.identifierInclude.identifierTypeSpinner.selectedItem.toString() - labelBean.identifierDeep = "${binding.identifierInclude.identifierDeepView.text}mm" - labelBean.person = binding.identifierInclude.personDeptView.text.toString() - labelBean.installTime = binding.identifierInclude.installTimeView.text.toString() - labelBean.lng = binding.identifierInclude.lngView.text.toString() - labelBean.lat = binding.identifierInclude.latView.text.toString() - labelBean.color = binding.identifierInclude.colorSpinner.selectedItem.toString().toColor() - labelBean.remark = binding.remarkView.text.toString() - labelBean.imagePath = realPaths.toJson() - - DataBaseManager.get.insertTaskLabel(labelBean) - } - - private fun takePicture() { - PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - if (result == null) { - "拍照失败,请重试".show(context) - return - } - analyticalSelectResults(result[0]) - } - - override fun onCancel() { - - } - }) - } - - private fun analyticalSelectResults(result: LocalMedia) { - //压缩图片 - result.realPath.compressImage(this, object : OnImageCompressListener { - override fun onSuccess(file: File) { - realPaths.add(file.absolutePath) - imageAdapter.setupImage(realPaths) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) - } - - override fun observeRequestState() { - taskViewModel.loadState.observe(this) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "标识器安装中,请稍后...") - LoadState.Success -> { - LoadingDialogHub.dismiss() - finish() - } - - else -> LoadingDialogHub.dismiss() - } - } - } - - override fun setupTopBarLayout() { - binding.titleInclude.titleView.text = "安装新标识器" - binding.titleInclude.titleView.setTextColor(R.color.themeColor.convertColor(this)) - - binding.rootView.initImmersionBar(this, true, R.color.white) - } - - override fun onDestroy() { - super.onDestroy() - soundPool?.release() - locationHub.stopLocation() - } - - override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - if (keyCode == KeyEvent.KEYCODE_BACK) { - soundPool?.release() - } - return super.onKeyDown(keyCode, event) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/view/LoginActivity.kt b/app/src/main/java/com/casic/detector/view/LoginActivity.kt index 6a0cce9..dde848f 100644 --- a/app/src/main/java/com/casic/detector/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/detector/view/LoginActivity.kt @@ -4,13 +4,13 @@ import androidx.lifecycle.ViewModelProvider import com.amap.api.navi.NaviSetting import com.casic.detector.databinding.ActivityLoginBinding -import com.casic.detector.utils.LoadingDialogHub import com.casic.detector.utils.LocaleConstant import com.casic.detector.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertMessageDialog diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt index ae048ce..79e7e11 100644 --- a/app/src/main/java/com/casic/detector/view/MainActivity.kt +++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt @@ -60,7 +60,6 @@ import com.casic.detector.utils.ExcelHub import com.casic.detector.utils.FileType import com.casic.detector.utils.GpioManager -import com.casic.detector.utils.LoadingDialogHub import com.casic.detector.utils.LocaleConstant import com.casic.detector.utils.LocationHub import com.casic.detector.utils.RouteOnMap @@ -89,6 +88,7 @@ import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.FileDownloadManager import com.pengxh.kt.lite.utils.LoadState +import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -133,7 +133,7 @@ /***inner class 需要用到*****start*/ private val taskViewModel by lazy { ViewModelProvider(this)[TaskViewModel::class.java] } private val attr = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_MEDIA) + .setUsage(AudioAttributes.USAGE_ALARM) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build() private val soundPool = SoundPool.Builder().setMaxStreams(16).setAudioAttributes(attr).build() diff --git a/app/src/main/java/com/casic/detector/view/SearchLabelActivity.kt b/app/src/main/java/com/casic/detector/view/SearchLabelActivity.kt deleted file mode 100644 index 3d8bb94..0000000 --- a/app/src/main/java/com/casic/detector/view/SearchLabelActivity.kt +++ /dev/null @@ -1,301 +0,0 @@ -package com.casic.detector.view - -import android.graphics.Color -import android.media.AudioAttributes -import android.media.SoundPool -import android.os.Bundle -import android.os.CountDownTimer -import android.view.animation.Animation -import android.view.animation.RotateAnimation -import androidx.activity.OnBackPressedCallback -import androidx.lifecycle.ViewModelProvider -import com.casic.detector.R -import com.casic.detector.bean.TaskBean -import com.casic.detector.databinding.ActivitySearchLabelBinding -import com.casic.detector.extensions.hexToString -import com.casic.detector.extensions.isNumber -import com.casic.detector.extensions.toHex -import com.casic.detector.utils.DataBaseManager -import com.casic.detector.utils.LoadingDialogHub -import com.casic.detector.utils.LocationHub -import com.casic.detector.utils.SerialPortManager -import com.casic.detector.vm.TaskViewModel -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.utils.LoadState -import com.pengxh.kt.lite.widget.dialog.AlertMessageDialog -import java.text.DecimalFormat - -class SearchLabelActivity : KotlinBaseActivity(), - SerialPortManager.OnSerialPortListener { - - private val kTag = "SearchLabelActivity" - private val serialPortManager by lazy { SerialPortManager(this) } - private val decimal by lazy { DecimalFormat("0.0") } - private val degreeCache by lazy { HashMap() } - private val locationHub by lazy { LocationHub(this) } - private val audioAttributes = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_ALARM) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build() - private lateinit var taskViewModel: TaskViewModel - private lateinit var slowSoundPool: SoundPool - private lateinit var fastSoundPool: SoundPool - private var slowResId = 0 - private var fastResId = 0 - private var markerId = "" - private var taskLabel: TaskBean? = null - private var isPlaying = false - - override fun initOnCreate(savedInstanceState: Bundle?) { - initSoundResource() - serialPortManager.detectMarker() - - taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] - //角度 - degreeCache["lastDegree"] = 0f - - //实时定位 -// locationHub.getCurrentLocation(false, object : ILocationListener { -// override fun onAMapLocationGet(location: AMapLocation?) { -// if (location != null) { -// if (identifierId != "") { -// val label = DataBaseManager.get.queryLabelById(identifierId).first() -// -// val result = location.calculateAngle( -// LatLng(label.lat.toDouble(), label.lng.toDouble()) -// ) -// -// binding.resultTextView.text = -// "标识器ID ${identifierId},${result.direction} ${result.angle},距离 ${result.distance}" -// } -// } -// } -// }) - } - - override fun initEvent() { - binding.depthButton.setOnClickListener { -// serialPortManager.closeSerialPort() - val result = DataBaseManager.get.queryLabelById(markerId) - if (result.isNotEmpty()) { - val tag = when (result.first().identifierType) { - "EM30" -> '7' - "EM50" -> '8' - "EM14" -> '9' - else -> '1' - } - if (tag == '1') { - "此标识器无法读取埋深!".show(this) - } else { - // 发送读取标识器埋设深度指令 - LoadingDialogHub.show(this, "正在测距,请稍后...") - serialPortManager.detectDepth(tag) - object : CountDownTimer(15 * 1000, 1000) { - override fun onTick(millisUntilFinished: Long) { - - } - - override fun onFinish() { - LoadingDialogHub.dismiss() - "请重试".show(this@SearchLabelActivity) -// initSoundResource() -// serialPortManager.detectMarker() - } - }.start() - } - } else { - "标识器未安装,安装成功后才可读取埋深!".show(this) - } - } - - binding.markerInfoButton.setOnClickListener { - //查库 - val result = DataBaseManager.get.queryLabelById(markerId) - if (result.isNotEmpty()) { - navigatePageTo(result.first().toJson()) - } else { - navigatePageTo(markerId) - } - } - - //返回键监听,替换onBackPressed - onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - slowSoundPool.release() - fastSoundPool.release() - serialPortManager.closeSerialPort() - finish() - } - }) - } - - override fun onDataReceived(buffer: ByteArray) { - val hex = buffer.toHex() -// Log.d(kTag, "$kTag => $hex") - if (hex.startsWith("4E")) { - try { - //4E转为String为N,代表能量值 - //用能量值转动表盘 - val energyResponse = hex.take(10).hexToString() - val energy = energyResponse.substring(1).toInt() - if (energy >= 4000) { - isPlaying = if (!isPlaying) { - fastSoundPool.play(fastResId, 1f, 1f, 0, 0, 1f) - true - } else { - fastSoundPool.stop(fastResId) - false - } - } else { - isPlaying = if (!isPlaying) { - slowSoundPool.play(slowResId, 1f, 1f, 0, 0, 1f) - true - } else { - slowSoundPool.stop(slowResId) - false - } - } - - binding.resultTextView.text = "信号能量值:${energyResponse}" - - //转换为转动的角度 - val degree = (energy.toFloat() / (50 * 100)) * 180 - binding.energyValueView.text = decimal.format(degree) - - degreeCache["lastDegree"]?.apply { - val animation = RotateAnimation( - this, degree, - Animation.RELATIVE_TO_SELF, 0.5f, - Animation.RELATIVE_TO_SELF, 0.5f - ) - animation.duration = 0 - animation.fillAfter = true - binding.needleView.startAnimation(animation) - } - - //保存旋转后的角度 - degreeCache["lastDegree"] = degree - - if (energy <= 700) {//18° - binding.energyTipsView.text = "标识器信号较弱,可能距离较远" - binding.energyTipsView.setTextColor(Color.parseColor("#8D1717")) - binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_red) - - binding.depthButton.isEnabled = false - binding.depthButton.setTextColor(Color.parseColor("#CCCCCC")) - binding.depthButton.setBackgroundResource(R.mipmap.left_button_disable) - binding.markerInfoButton.isEnabled = false - binding.markerInfoButton.setTextColor(Color.parseColor("#CCCCCC")) - binding.markerInfoButton.setBackgroundResource(R.mipmap.right_button_disable) - - binding.searchResultView.text = "未检测到标识器" - binding.searchResultView.setTextColor(Color.parseColor("#8D1717")) - binding.searchResultView.setBackgroundResource(R.mipmap.bg_small_text_red) - } else if (energy >= 4100) {//148° - binding.energyTipsView.text = "标识器信号极强,可能在正下方" - binding.energyTipsView.setTextColor(Color.parseColor("#428d00")) - binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_green) - } else {//[18°,148°] - binding.energyTipsView.text = "已靠近标识器,请继续移动位置" - binding.energyTipsView.setTextColor(Color.parseColor("#8C5700")) - binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_yellow) - } - } catch (e: NumberFormatException) { - e.printStackTrace() - } - } else if (hex.startsWith("53")) { - LoadingDialogHub.dismiss() - try { - val depthResponse = hex.take(10).hexToString() - val depth = depthResponse.drop(4) - AlertMessageDialog.Builder() - .setContext(this@SearchLabelActivity) - .setTitle("温馨提示") - .setMessage("标识器埋深:${depth}厘米") - .setPositiveButton("知道了") - .setOnDialogButtonClickListener(object : - AlertMessageDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { -// initSoundResource() -// serialPortManager.detectMarker() - } - }).build().show() - } catch (e: NumberFormatException) { - e.printStackTrace() - } - } else { - if (hex.length >= 20) { - val id = hex.take(20).hexToString() - if (markerId.isNumber()) { - markerId = id - - binding.depthButton.isEnabled = true - binding.depthButton.setTextColor(Color.WHITE) - binding.depthButton.setBackgroundResource(R.mipmap.left_button_enable) - binding.markerInfoButton.isEnabled = true - binding.markerInfoButton.setTextColor(Color.WHITE) - binding.markerInfoButton.setBackgroundResource(R.mipmap.right_button_enable) - - binding.searchResultView.text = "已检测到标识器" - binding.searchResultView.setTextColor(Color.parseColor("#428d00")) - binding.searchResultView.setBackgroundResource(R.mipmap.bg_small_text_green) - - //自动上传标识器 - taskLabel = DataBaseManager.get.queryTaskLabelByIdAndState( - markerId, "未开始" - ) - taskLabel?.apply { - /** - * 此taskCode是 [com.casic.detector.model.TaskModel.MessageModel.TaskDetailInfosModel] 里面的主键,也就是这个标签在数据库里面的主键 - * */ - taskViewModel.uploadMarker(taskCode) - } - } - } - } - } - - private fun initSoundResource() { - /** - * 声音效果速度 - * ling - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -