diff --git a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt index 4dfe42d..eb0d11c 100644 --- a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.br.operationsite.test.callback +package com.casic.br.ar.app.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt index 4dfe42d..eb0d11c 100644 --- a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.br.operationsite.test.callback +package com.casic.br.ar.app.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt index f71d6ab..b0c55c9 100644 --- a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt @@ -1,8 +1,9 @@ package com.casic.br.ar.app.extensions import android.content.Context +import com.casic.br.ar.app.callback.OnImageCompressListener import com.casic.br.ar.app.utils.LocaleConstant -import com.casic.br.operationsite.test.callback.OnImageCompressListener +import com.casic.br.ar.app.utils.RuntimeCache import com.google.gson.JsonParser import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues @@ -57,6 +58,15 @@ return scene } +fun String.getSceneCodeByName(): String { + for (scene in RuntimeCache.sceneDicModels) { + if (scene.name == this) { + return scene.value + } + } + return "" +} + fun String.isInScene(scene: String): Boolean { when (scene) { "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( diff --git a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt index 4dfe42d..eb0d11c 100644 --- a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.br.operationsite.test.callback +package com.casic.br.ar.app.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt index f71d6ab..b0c55c9 100644 --- a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt @@ -1,8 +1,9 @@ package com.casic.br.ar.app.extensions import android.content.Context +import com.casic.br.ar.app.callback.OnImageCompressListener import com.casic.br.ar.app.utils.LocaleConstant -import com.casic.br.operationsite.test.callback.OnImageCompressListener +import com.casic.br.ar.app.utils.RuntimeCache import com.google.gson.JsonParser import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues @@ -57,6 +58,15 @@ return scene } +fun String.getSceneCodeByName(): String { + for (scene in RuntimeCache.sceneDicModels) { + if (scene.name == this) { + return scene.value + } + } + return "" +} + fun String.isInScene(scene: String): Boolean { when (scene) { "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( diff --git a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt index f717f82..79e11c7 100644 --- a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt +++ b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt @@ -3,11 +3,9 @@ import com.casic.br.ar.app.model.DictionaryModel object RuntimeCache { - //TODO 未赋值 - var scene = "" - var sceneName = "" var inspectionId = "" var mainDicModels: MutableList = ArrayList() + var subDicModels: MutableList = ArrayList() var sceneDicModels: MutableList = ArrayList() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt index 4dfe42d..eb0d11c 100644 --- a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.br.operationsite.test.callback +package com.casic.br.ar.app.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt index f71d6ab..b0c55c9 100644 --- a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt @@ -1,8 +1,9 @@ package com.casic.br.ar.app.extensions import android.content.Context +import com.casic.br.ar.app.callback.OnImageCompressListener import com.casic.br.ar.app.utils.LocaleConstant -import com.casic.br.operationsite.test.callback.OnImageCompressListener +import com.casic.br.ar.app.utils.RuntimeCache import com.google.gson.JsonParser import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues @@ -57,6 +58,15 @@ return scene } +fun String.getSceneCodeByName(): String { + for (scene in RuntimeCache.sceneDicModels) { + if (scene.name == this) { + return scene.value + } + } + return "" +} + fun String.isInScene(scene: String): Boolean { when (scene) { "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( diff --git a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt index f717f82..79e11c7 100644 --- a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt +++ b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt @@ -3,11 +3,9 @@ import com.casic.br.ar.app.model.DictionaryModel object RuntimeCache { - //TODO 未赋值 - var scene = "" - var sceneName = "" var inspectionId = "" var mainDicModels: MutableList = ArrayList() + var subDicModels: MutableList = ArrayList() var sceneDicModels: MutableList = ArrayList() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt index 6a9e240..c1f9bb8 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt @@ -7,9 +7,8 @@ import android.widget.ArrayAdapter import androidx.lifecycle.ViewModelProvider import com.casic.br.ar.app.databinding.ActivityAddHiddenTroubleBinding -import com.casic.br.ar.app.model.DictionaryModel +import com.casic.br.ar.app.extensions.getSceneCodeByName import com.casic.br.ar.app.utils.RuntimeCache -import com.casic.br.ar.app.vm.ConfigViewModel import com.casic.br.ar.app.vm.HiddenTroubleViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show @@ -20,10 +19,7 @@ private val kTag = "AddHiddenTroubleActivity" private val imagePaths = ArrayList>() - private lateinit var configViewModel: ConfigViewModel private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel - private var mainDicModels: MutableList = ArrayList() - private var subDicModels: MutableList = ArrayList() private var selectedMainTypePosition = 0 private var selectedSubTypePosition = 0 @@ -48,30 +44,21 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - //转为实体类 - mainDicModels = RuntimeCache.mainDicModels val mainTypeArray = ArrayList() - mainDicModels.forEach { + RuntimeCache.mainDicModels.forEach { mainTypeArray.add(it.name) } val mainTypeAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mainTypeArray) binding.mainTypeSpinner.adapter = mainTypeAdapter - configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] - configViewModel.getDictionaryByCode(this, "pitfallSmallType") - configViewModel.dictionary.observe(this) { - if (it.code == 200) { - subDicModels = it.data - val subTypeArray = ArrayList() - subDicModels.forEach { dic -> - subTypeArray.add(dic.name) - } - val subTypeAdapter = ArrayAdapter( - this, android.R.layout.simple_list_item_1, subTypeArray - ) - binding.subTypeSpinner.adapter = subTypeAdapter - } + val subTypeArray = ArrayList() + RuntimeCache.subDicModels.forEach { dic -> + subTypeArray.add(dic.name) } + val subTypeAdapter = ArrayAdapter( + this, android.R.layout.simple_list_item_1, subTypeArray + ) + binding.subTypeSpinner.adapter = subTypeAdapter hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java] hiddenTroubleViewModel.addTroubleResult.observe(this) { @@ -116,14 +103,14 @@ selectedMainTypePosition.toString(), selectedSubTypePosition.toString(), RuntimeCache.sceneName, - subDicModels[selectedMainTypePosition].name, + RuntimeCache.subDicModels[selectedMainTypePosition].name, "", "", binding.hiddenTroubleContentView.text.toString(), - RuntimeCache.scene, + RuntimeCache.sceneName.getSceneCodeByName(), RuntimeCache.inspectionId, binding.hiddenTroubleNameView.text.toString(), - mainDicModels[selectedMainTypePosition].name, + RuntimeCache.mainDicModels[selectedMainTypePosition].name, "", imagePaths.toTypedArray() ) diff --git a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt index 4dfe42d..eb0d11c 100644 --- a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.br.operationsite.test.callback +package com.casic.br.ar.app.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt index f71d6ab..b0c55c9 100644 --- a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt @@ -1,8 +1,9 @@ package com.casic.br.ar.app.extensions import android.content.Context +import com.casic.br.ar.app.callback.OnImageCompressListener import com.casic.br.ar.app.utils.LocaleConstant -import com.casic.br.operationsite.test.callback.OnImageCompressListener +import com.casic.br.ar.app.utils.RuntimeCache import com.google.gson.JsonParser import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues @@ -57,6 +58,15 @@ return scene } +fun String.getSceneCodeByName(): String { + for (scene in RuntimeCache.sceneDicModels) { + if (scene.name == this) { + return scene.value + } + } + return "" +} + fun String.isInScene(scene: String): Boolean { when (scene) { "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( diff --git a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt index f717f82..79e11c7 100644 --- a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt +++ b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt @@ -3,11 +3,9 @@ import com.casic.br.ar.app.model.DictionaryModel object RuntimeCache { - //TODO 未赋值 - var scene = "" - var sceneName = "" var inspectionId = "" var mainDicModels: MutableList = ArrayList() + var subDicModels: MutableList = ArrayList() var sceneDicModels: MutableList = ArrayList() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt index 6a9e240..c1f9bb8 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt @@ -7,9 +7,8 @@ import android.widget.ArrayAdapter import androidx.lifecycle.ViewModelProvider import com.casic.br.ar.app.databinding.ActivityAddHiddenTroubleBinding -import com.casic.br.ar.app.model.DictionaryModel +import com.casic.br.ar.app.extensions.getSceneCodeByName import com.casic.br.ar.app.utils.RuntimeCache -import com.casic.br.ar.app.vm.ConfigViewModel import com.casic.br.ar.app.vm.HiddenTroubleViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show @@ -20,10 +19,7 @@ private val kTag = "AddHiddenTroubleActivity" private val imagePaths = ArrayList>() - private lateinit var configViewModel: ConfigViewModel private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel - private var mainDicModels: MutableList = ArrayList() - private var subDicModels: MutableList = ArrayList() private var selectedMainTypePosition = 0 private var selectedSubTypePosition = 0 @@ -48,30 +44,21 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - //转为实体类 - mainDicModels = RuntimeCache.mainDicModels val mainTypeArray = ArrayList() - mainDicModels.forEach { + RuntimeCache.mainDicModels.forEach { mainTypeArray.add(it.name) } val mainTypeAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mainTypeArray) binding.mainTypeSpinner.adapter = mainTypeAdapter - configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] - configViewModel.getDictionaryByCode(this, "pitfallSmallType") - configViewModel.dictionary.observe(this) { - if (it.code == 200) { - subDicModels = it.data - val subTypeArray = ArrayList() - subDicModels.forEach { dic -> - subTypeArray.add(dic.name) - } - val subTypeAdapter = ArrayAdapter( - this, android.R.layout.simple_list_item_1, subTypeArray - ) - binding.subTypeSpinner.adapter = subTypeAdapter - } + val subTypeArray = ArrayList() + RuntimeCache.subDicModels.forEach { dic -> + subTypeArray.add(dic.name) } + val subTypeAdapter = ArrayAdapter( + this, android.R.layout.simple_list_item_1, subTypeArray + ) + binding.subTypeSpinner.adapter = subTypeAdapter hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java] hiddenTroubleViewModel.addTroubleResult.observe(this) { @@ -116,14 +103,14 @@ selectedMainTypePosition.toString(), selectedSubTypePosition.toString(), RuntimeCache.sceneName, - subDicModels[selectedMainTypePosition].name, + RuntimeCache.subDicModels[selectedMainTypePosition].name, "", "", binding.hiddenTroubleContentView.text.toString(), - RuntimeCache.scene, + RuntimeCache.sceneName.getSceneCodeByName(), RuntimeCache.inspectionId, binding.hiddenTroubleNameView.text.toString(), - mainDicModels[selectedMainTypePosition].name, + RuntimeCache.mainDicModels[selectedMainTypePosition].name, "", imagePaths.toTypedArray() ) diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt index 43699d7..e51c29c 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt @@ -15,6 +15,7 @@ import com.casic.br.ar.app.databinding.ActivityCheckModeBinding import com.casic.br.ar.app.extensions.convert2YoloResult import com.casic.br.ar.app.extensions.getSceneByTarget +import com.casic.br.ar.app.extensions.getSceneCodeByName import com.casic.br.ar.app.extensions.isContains import com.casic.br.ar.app.extensions.isInScene import com.casic.br.ar.app.external.INativeCallback @@ -27,8 +28,10 @@ import com.casic.br.ar.app.vm.AlarmViewModel import com.casic.br.ar.app.vm.CheckManifestViewModel import com.casic.br.ar.app.vm.ConfigViewModel +import com.casic.br.ar.app.vm.HiddenTroubleViewModel import com.casic.br.ar.app.vm.ImageFileViewModel import com.casic.br.ar.app.vm.InspectionViewModel +import com.casic.br.ar.app.widgets.AddHiddenTroubleDialog import com.casic.br.ar.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @@ -60,13 +63,14 @@ private val mat by lazy { Mat() } private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private val detectResultDialog by lazy { DetectResultDialog(this) } + private val addHiddenTroubleDialog by lazy { AddHiddenTroubleDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private lateinit var imageFileViewModel: ImageFileViewModel private lateinit var alarmViewModel: AlarmViewModel private lateinit var checkManifestViewModel: CheckManifestViewModel + private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel private lateinit var timer: Timer - private var mainDicModels: MutableList = ArrayList() private var checkItemLinkedList = LinkedList() private var isDetectTarget = false private var alarmCode = "" @@ -116,7 +120,7 @@ configViewModel.getDictionaryByCode(context, "pitfallBigType") configViewModel.dictionary.observe(this) { if (it.code == 200) { - mainDicModels = it.data + RuntimeCache.mainDicModels = it.data } } @@ -140,22 +144,51 @@ } } + hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java] + hiddenTroubleViewModel.addTroubleResult.observe(this) { + if (it.code == 200) { + troubleCount++ + binding.troubleCountView.text = "${troubleCount}项" + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" + isConfirmedByUser = true + } + } + //队列处理清单内容 timer = Timer() timer.schedule(object : TimerTask() { override fun run() { - runOnUiThread { - binding.noCheckCountView.text = "${checkItemLinkedList.size}项" - } if (isConfirmedByUser && checkItemLinkedList.isNotEmpty()) { - isConfirmedByUser = false - //取出队列头部元素 - val headItem = checkItemLinkedList.poll() - if (headItem != null) { - val message = weakReferenceHandler.obtainMessage() - message.what = 2024091901 - message.obj = headItem.checkItem - weakReferenceHandler.sendMessage(message) + lifecycleScope.launch(Dispatchers.Main) { + if (!detectResultDialog.isShowing) { + isConfirmedByUser = false + //取出队列头部元素 + val headItem = checkItemLinkedList.poll() + if (headItem != null) { + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView( + headItem.checkItem, mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onCheckPassClick(file: File) { + checkPassCount++ + binding.checkedCountView.text = + "${checkPassCount}项" + binding.noCheckCountView.text = + "${checkItemLinkedList.size}项" + if (checkItemLinkedList.isEmpty()) { + stopCheck() + } + isConfirmedByUser = true + } + + override fun onHaveTroubleClick(file: File) { + //弹新的框 + showAddHiddenTroubleDialog() + } + }).show() + } + } + } } } } @@ -168,7 +201,6 @@ } binding.addHiddenTroubleButton.setOnClickListener { - RuntimeCache.mainDicModels = mainDicModels navigatePageTo() } @@ -534,12 +566,13 @@ } if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(target, mat, - object : DetectResultDialog.OnDialogButtonClickListener { + detectResultDialog.updateDialogContentView( + target, mat, object : DetectResultDialog.OnDialogButtonClickListener { override fun onCheckPassClick(file: File) { detectedTargetSet.add(target) checkPassCount++ binding.checkedCountView.text = "${checkPassCount}项" + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" if (checkItemLinkedList.isEmpty()) { stopCheck() } @@ -551,31 +584,7 @@ troubleCount++ binding.troubleCountView.text = "${troubleCount}项" - } - }).show() - } - } - - 2024091901 -> { - val target = msg.obj as String - if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(target, mat, - object : DetectResultDialog.OnDialogButtonClickListener { - override fun onCheckPassClick(file: File) { - checkPassCount++ - binding.checkedCountView.text = "${checkPassCount}项" - if (checkItemLinkedList.isEmpty()) { - stopCheck() - } - isConfirmedByUser = true - } - - override fun onHaveTroubleClick(file: File) { - imageFileViewModel.uploadImage(file) - - troubleCount++ - binding.troubleCountView.text = "${troubleCount}项" - isConfirmedByUser = true + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" } }).show() } @@ -584,6 +593,33 @@ return true } + private fun showAddHiddenTroubleDialog() { + addHiddenTroubleDialog.initDialogContentView(object : + AddHiddenTroubleDialog.OnDialogButtonClickListener { + override fun onConfirmClick( + mainType: DictionaryModel.DataModel, subType: DictionaryModel.DataModel, + troubleName: String, troubleContent: String + ) { + hiddenTroubleViewModel.addHiddenTrouble( + context, + mainType.value, + subType.value, + RuntimeCache.sceneName, + subType.name, + "", + "", + troubleContent, + RuntimeCache.sceneName.getSceneCodeByName(), + RuntimeCache.inspectionId, + troubleName, + mainType.name, + "", + arrayOf() + ) + } + }).show() + } + override fun onDestroy() { super.onDestroy() timer.cancel() diff --git a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt index 4dfe42d..eb0d11c 100644 --- a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.br.operationsite.test.callback +package com.casic.br.ar.app.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt index f71d6ab..b0c55c9 100644 --- a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt @@ -1,8 +1,9 @@ package com.casic.br.ar.app.extensions import android.content.Context +import com.casic.br.ar.app.callback.OnImageCompressListener import com.casic.br.ar.app.utils.LocaleConstant -import com.casic.br.operationsite.test.callback.OnImageCompressListener +import com.casic.br.ar.app.utils.RuntimeCache import com.google.gson.JsonParser import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues @@ -57,6 +58,15 @@ return scene } +fun String.getSceneCodeByName(): String { + for (scene in RuntimeCache.sceneDicModels) { + if (scene.name == this) { + return scene.value + } + } + return "" +} + fun String.isInScene(scene: String): Boolean { when (scene) { "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( diff --git a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt index f717f82..79e11c7 100644 --- a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt +++ b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt @@ -3,11 +3,9 @@ import com.casic.br.ar.app.model.DictionaryModel object RuntimeCache { - //TODO 未赋值 - var scene = "" - var sceneName = "" var inspectionId = "" var mainDicModels: MutableList = ArrayList() + var subDicModels: MutableList = ArrayList() var sceneDicModels: MutableList = ArrayList() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt index 6a9e240..c1f9bb8 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt @@ -7,9 +7,8 @@ import android.widget.ArrayAdapter import androidx.lifecycle.ViewModelProvider import com.casic.br.ar.app.databinding.ActivityAddHiddenTroubleBinding -import com.casic.br.ar.app.model.DictionaryModel +import com.casic.br.ar.app.extensions.getSceneCodeByName import com.casic.br.ar.app.utils.RuntimeCache -import com.casic.br.ar.app.vm.ConfigViewModel import com.casic.br.ar.app.vm.HiddenTroubleViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show @@ -20,10 +19,7 @@ private val kTag = "AddHiddenTroubleActivity" private val imagePaths = ArrayList>() - private lateinit var configViewModel: ConfigViewModel private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel - private var mainDicModels: MutableList = ArrayList() - private var subDicModels: MutableList = ArrayList() private var selectedMainTypePosition = 0 private var selectedSubTypePosition = 0 @@ -48,30 +44,21 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - //转为实体类 - mainDicModels = RuntimeCache.mainDicModels val mainTypeArray = ArrayList() - mainDicModels.forEach { + RuntimeCache.mainDicModels.forEach { mainTypeArray.add(it.name) } val mainTypeAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mainTypeArray) binding.mainTypeSpinner.adapter = mainTypeAdapter - configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] - configViewModel.getDictionaryByCode(this, "pitfallSmallType") - configViewModel.dictionary.observe(this) { - if (it.code == 200) { - subDicModels = it.data - val subTypeArray = ArrayList() - subDicModels.forEach { dic -> - subTypeArray.add(dic.name) - } - val subTypeAdapter = ArrayAdapter( - this, android.R.layout.simple_list_item_1, subTypeArray - ) - binding.subTypeSpinner.adapter = subTypeAdapter - } + val subTypeArray = ArrayList() + RuntimeCache.subDicModels.forEach { dic -> + subTypeArray.add(dic.name) } + val subTypeAdapter = ArrayAdapter( + this, android.R.layout.simple_list_item_1, subTypeArray + ) + binding.subTypeSpinner.adapter = subTypeAdapter hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java] hiddenTroubleViewModel.addTroubleResult.observe(this) { @@ -116,14 +103,14 @@ selectedMainTypePosition.toString(), selectedSubTypePosition.toString(), RuntimeCache.sceneName, - subDicModels[selectedMainTypePosition].name, + RuntimeCache.subDicModels[selectedMainTypePosition].name, "", "", binding.hiddenTroubleContentView.text.toString(), - RuntimeCache.scene, + RuntimeCache.sceneName.getSceneCodeByName(), RuntimeCache.inspectionId, binding.hiddenTroubleNameView.text.toString(), - mainDicModels[selectedMainTypePosition].name, + RuntimeCache.mainDicModels[selectedMainTypePosition].name, "", imagePaths.toTypedArray() ) diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt index 43699d7..e51c29c 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt @@ -15,6 +15,7 @@ import com.casic.br.ar.app.databinding.ActivityCheckModeBinding import com.casic.br.ar.app.extensions.convert2YoloResult import com.casic.br.ar.app.extensions.getSceneByTarget +import com.casic.br.ar.app.extensions.getSceneCodeByName import com.casic.br.ar.app.extensions.isContains import com.casic.br.ar.app.extensions.isInScene import com.casic.br.ar.app.external.INativeCallback @@ -27,8 +28,10 @@ import com.casic.br.ar.app.vm.AlarmViewModel import com.casic.br.ar.app.vm.CheckManifestViewModel import com.casic.br.ar.app.vm.ConfigViewModel +import com.casic.br.ar.app.vm.HiddenTroubleViewModel import com.casic.br.ar.app.vm.ImageFileViewModel import com.casic.br.ar.app.vm.InspectionViewModel +import com.casic.br.ar.app.widgets.AddHiddenTroubleDialog import com.casic.br.ar.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @@ -60,13 +63,14 @@ private val mat by lazy { Mat() } private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private val detectResultDialog by lazy { DetectResultDialog(this) } + private val addHiddenTroubleDialog by lazy { AddHiddenTroubleDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private lateinit var imageFileViewModel: ImageFileViewModel private lateinit var alarmViewModel: AlarmViewModel private lateinit var checkManifestViewModel: CheckManifestViewModel + private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel private lateinit var timer: Timer - private var mainDicModels: MutableList = ArrayList() private var checkItemLinkedList = LinkedList() private var isDetectTarget = false private var alarmCode = "" @@ -116,7 +120,7 @@ configViewModel.getDictionaryByCode(context, "pitfallBigType") configViewModel.dictionary.observe(this) { if (it.code == 200) { - mainDicModels = it.data + RuntimeCache.mainDicModels = it.data } } @@ -140,22 +144,51 @@ } } + hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java] + hiddenTroubleViewModel.addTroubleResult.observe(this) { + if (it.code == 200) { + troubleCount++ + binding.troubleCountView.text = "${troubleCount}项" + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" + isConfirmedByUser = true + } + } + //队列处理清单内容 timer = Timer() timer.schedule(object : TimerTask() { override fun run() { - runOnUiThread { - binding.noCheckCountView.text = "${checkItemLinkedList.size}项" - } if (isConfirmedByUser && checkItemLinkedList.isNotEmpty()) { - isConfirmedByUser = false - //取出队列头部元素 - val headItem = checkItemLinkedList.poll() - if (headItem != null) { - val message = weakReferenceHandler.obtainMessage() - message.what = 2024091901 - message.obj = headItem.checkItem - weakReferenceHandler.sendMessage(message) + lifecycleScope.launch(Dispatchers.Main) { + if (!detectResultDialog.isShowing) { + isConfirmedByUser = false + //取出队列头部元素 + val headItem = checkItemLinkedList.poll() + if (headItem != null) { + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView( + headItem.checkItem, mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onCheckPassClick(file: File) { + checkPassCount++ + binding.checkedCountView.text = + "${checkPassCount}项" + binding.noCheckCountView.text = + "${checkItemLinkedList.size}项" + if (checkItemLinkedList.isEmpty()) { + stopCheck() + } + isConfirmedByUser = true + } + + override fun onHaveTroubleClick(file: File) { + //弹新的框 + showAddHiddenTroubleDialog() + } + }).show() + } + } + } } } } @@ -168,7 +201,6 @@ } binding.addHiddenTroubleButton.setOnClickListener { - RuntimeCache.mainDicModels = mainDicModels navigatePageTo() } @@ -534,12 +566,13 @@ } if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(target, mat, - object : DetectResultDialog.OnDialogButtonClickListener { + detectResultDialog.updateDialogContentView( + target, mat, object : DetectResultDialog.OnDialogButtonClickListener { override fun onCheckPassClick(file: File) { detectedTargetSet.add(target) checkPassCount++ binding.checkedCountView.text = "${checkPassCount}项" + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" if (checkItemLinkedList.isEmpty()) { stopCheck() } @@ -551,31 +584,7 @@ troubleCount++ binding.troubleCountView.text = "${troubleCount}项" - } - }).show() - } - } - - 2024091901 -> { - val target = msg.obj as String - if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(target, mat, - object : DetectResultDialog.OnDialogButtonClickListener { - override fun onCheckPassClick(file: File) { - checkPassCount++ - binding.checkedCountView.text = "${checkPassCount}项" - if (checkItemLinkedList.isEmpty()) { - stopCheck() - } - isConfirmedByUser = true - } - - override fun onHaveTroubleClick(file: File) { - imageFileViewModel.uploadImage(file) - - troubleCount++ - binding.troubleCountView.text = "${troubleCount}项" - isConfirmedByUser = true + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" } }).show() } @@ -584,6 +593,33 @@ return true } + private fun showAddHiddenTroubleDialog() { + addHiddenTroubleDialog.initDialogContentView(object : + AddHiddenTroubleDialog.OnDialogButtonClickListener { + override fun onConfirmClick( + mainType: DictionaryModel.DataModel, subType: DictionaryModel.DataModel, + troubleName: String, troubleContent: String + ) { + hiddenTroubleViewModel.addHiddenTrouble( + context, + mainType.value, + subType.value, + RuntimeCache.sceneName, + subType.name, + "", + "", + troubleContent, + RuntimeCache.sceneName.getSceneCodeByName(), + RuntimeCache.inspectionId, + troubleName, + mainType.name, + "", + arrayOf() + ) + } + }).show() + } + override fun onDestroy() { super.onDestroy() timer.cancel() diff --git a/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt index 3e592f3..a9144a0 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt @@ -5,8 +5,11 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.lifecycle.ViewModelProvider import com.casic.br.ar.app.R import com.casic.br.ar.app.databinding.ActivitySelectCheckModeBinding +import com.casic.br.ar.app.utils.RuntimeCache +import com.casic.br.ar.app.vm.ConfigViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -17,6 +20,7 @@ class SelectCheckModeActivity : KotlinBaseActivity() { private val marginOffset by lazy { 25.dp2px(this) } + private lateinit var configViewModel: ConfigViewModel private lateinit var itemAdapter: NormalRecyclerAdapter override fun initEvent() { @@ -32,6 +36,14 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { + configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] + configViewModel.getDictionaryByCode(this, "pitfallSmallType") + configViewModel.dictionary.observe(this) { + if (it.code == 200) { + RuntimeCache.subDicModels = it.data + } + } + itemAdapter = object : NormalRecyclerAdapter( R.layout.item_main_rv_l, arrayListOf("检查模式", "自由模式") ) { diff --git a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt index 4dfe42d..eb0d11c 100644 --- a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.br.operationsite.test.callback +package com.casic.br.ar.app.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt index f71d6ab..b0c55c9 100644 --- a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt @@ -1,8 +1,9 @@ package com.casic.br.ar.app.extensions import android.content.Context +import com.casic.br.ar.app.callback.OnImageCompressListener import com.casic.br.ar.app.utils.LocaleConstant -import com.casic.br.operationsite.test.callback.OnImageCompressListener +import com.casic.br.ar.app.utils.RuntimeCache import com.google.gson.JsonParser import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues @@ -57,6 +58,15 @@ return scene } +fun String.getSceneCodeByName(): String { + for (scene in RuntimeCache.sceneDicModels) { + if (scene.name == this) { + return scene.value + } + } + return "" +} + fun String.isInScene(scene: String): Boolean { when (scene) { "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( diff --git a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt index f717f82..79e11c7 100644 --- a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt +++ b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt @@ -3,11 +3,9 @@ import com.casic.br.ar.app.model.DictionaryModel object RuntimeCache { - //TODO 未赋值 - var scene = "" - var sceneName = "" var inspectionId = "" var mainDicModels: MutableList = ArrayList() + var subDicModels: MutableList = ArrayList() var sceneDicModels: MutableList = ArrayList() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt index 6a9e240..c1f9bb8 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt @@ -7,9 +7,8 @@ import android.widget.ArrayAdapter import androidx.lifecycle.ViewModelProvider import com.casic.br.ar.app.databinding.ActivityAddHiddenTroubleBinding -import com.casic.br.ar.app.model.DictionaryModel +import com.casic.br.ar.app.extensions.getSceneCodeByName import com.casic.br.ar.app.utils.RuntimeCache -import com.casic.br.ar.app.vm.ConfigViewModel import com.casic.br.ar.app.vm.HiddenTroubleViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show @@ -20,10 +19,7 @@ private val kTag = "AddHiddenTroubleActivity" private val imagePaths = ArrayList>() - private lateinit var configViewModel: ConfigViewModel private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel - private var mainDicModels: MutableList = ArrayList() - private var subDicModels: MutableList = ArrayList() private var selectedMainTypePosition = 0 private var selectedSubTypePosition = 0 @@ -48,30 +44,21 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - //转为实体类 - mainDicModels = RuntimeCache.mainDicModels val mainTypeArray = ArrayList() - mainDicModels.forEach { + RuntimeCache.mainDicModels.forEach { mainTypeArray.add(it.name) } val mainTypeAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mainTypeArray) binding.mainTypeSpinner.adapter = mainTypeAdapter - configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] - configViewModel.getDictionaryByCode(this, "pitfallSmallType") - configViewModel.dictionary.observe(this) { - if (it.code == 200) { - subDicModels = it.data - val subTypeArray = ArrayList() - subDicModels.forEach { dic -> - subTypeArray.add(dic.name) - } - val subTypeAdapter = ArrayAdapter( - this, android.R.layout.simple_list_item_1, subTypeArray - ) - binding.subTypeSpinner.adapter = subTypeAdapter - } + val subTypeArray = ArrayList() + RuntimeCache.subDicModels.forEach { dic -> + subTypeArray.add(dic.name) } + val subTypeAdapter = ArrayAdapter( + this, android.R.layout.simple_list_item_1, subTypeArray + ) + binding.subTypeSpinner.adapter = subTypeAdapter hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java] hiddenTroubleViewModel.addTroubleResult.observe(this) { @@ -116,14 +103,14 @@ selectedMainTypePosition.toString(), selectedSubTypePosition.toString(), RuntimeCache.sceneName, - subDicModels[selectedMainTypePosition].name, + RuntimeCache.subDicModels[selectedMainTypePosition].name, "", "", binding.hiddenTroubleContentView.text.toString(), - RuntimeCache.scene, + RuntimeCache.sceneName.getSceneCodeByName(), RuntimeCache.inspectionId, binding.hiddenTroubleNameView.text.toString(), - mainDicModels[selectedMainTypePosition].name, + RuntimeCache.mainDicModels[selectedMainTypePosition].name, "", imagePaths.toTypedArray() ) diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt index 43699d7..e51c29c 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt @@ -15,6 +15,7 @@ import com.casic.br.ar.app.databinding.ActivityCheckModeBinding import com.casic.br.ar.app.extensions.convert2YoloResult import com.casic.br.ar.app.extensions.getSceneByTarget +import com.casic.br.ar.app.extensions.getSceneCodeByName import com.casic.br.ar.app.extensions.isContains import com.casic.br.ar.app.extensions.isInScene import com.casic.br.ar.app.external.INativeCallback @@ -27,8 +28,10 @@ import com.casic.br.ar.app.vm.AlarmViewModel import com.casic.br.ar.app.vm.CheckManifestViewModel import com.casic.br.ar.app.vm.ConfigViewModel +import com.casic.br.ar.app.vm.HiddenTroubleViewModel import com.casic.br.ar.app.vm.ImageFileViewModel import com.casic.br.ar.app.vm.InspectionViewModel +import com.casic.br.ar.app.widgets.AddHiddenTroubleDialog import com.casic.br.ar.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @@ -60,13 +63,14 @@ private val mat by lazy { Mat() } private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private val detectResultDialog by lazy { DetectResultDialog(this) } + private val addHiddenTroubleDialog by lazy { AddHiddenTroubleDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private lateinit var imageFileViewModel: ImageFileViewModel private lateinit var alarmViewModel: AlarmViewModel private lateinit var checkManifestViewModel: CheckManifestViewModel + private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel private lateinit var timer: Timer - private var mainDicModels: MutableList = ArrayList() private var checkItemLinkedList = LinkedList() private var isDetectTarget = false private var alarmCode = "" @@ -116,7 +120,7 @@ configViewModel.getDictionaryByCode(context, "pitfallBigType") configViewModel.dictionary.observe(this) { if (it.code == 200) { - mainDicModels = it.data + RuntimeCache.mainDicModels = it.data } } @@ -140,22 +144,51 @@ } } + hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java] + hiddenTroubleViewModel.addTroubleResult.observe(this) { + if (it.code == 200) { + troubleCount++ + binding.troubleCountView.text = "${troubleCount}项" + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" + isConfirmedByUser = true + } + } + //队列处理清单内容 timer = Timer() timer.schedule(object : TimerTask() { override fun run() { - runOnUiThread { - binding.noCheckCountView.text = "${checkItemLinkedList.size}项" - } if (isConfirmedByUser && checkItemLinkedList.isNotEmpty()) { - isConfirmedByUser = false - //取出队列头部元素 - val headItem = checkItemLinkedList.poll() - if (headItem != null) { - val message = weakReferenceHandler.obtainMessage() - message.what = 2024091901 - message.obj = headItem.checkItem - weakReferenceHandler.sendMessage(message) + lifecycleScope.launch(Dispatchers.Main) { + if (!detectResultDialog.isShowing) { + isConfirmedByUser = false + //取出队列头部元素 + val headItem = checkItemLinkedList.poll() + if (headItem != null) { + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView( + headItem.checkItem, mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onCheckPassClick(file: File) { + checkPassCount++ + binding.checkedCountView.text = + "${checkPassCount}项" + binding.noCheckCountView.text = + "${checkItemLinkedList.size}项" + if (checkItemLinkedList.isEmpty()) { + stopCheck() + } + isConfirmedByUser = true + } + + override fun onHaveTroubleClick(file: File) { + //弹新的框 + showAddHiddenTroubleDialog() + } + }).show() + } + } + } } } } @@ -168,7 +201,6 @@ } binding.addHiddenTroubleButton.setOnClickListener { - RuntimeCache.mainDicModels = mainDicModels navigatePageTo() } @@ -534,12 +566,13 @@ } if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(target, mat, - object : DetectResultDialog.OnDialogButtonClickListener { + detectResultDialog.updateDialogContentView( + target, mat, object : DetectResultDialog.OnDialogButtonClickListener { override fun onCheckPassClick(file: File) { detectedTargetSet.add(target) checkPassCount++ binding.checkedCountView.text = "${checkPassCount}项" + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" if (checkItemLinkedList.isEmpty()) { stopCheck() } @@ -551,31 +584,7 @@ troubleCount++ binding.troubleCountView.text = "${troubleCount}项" - } - }).show() - } - } - - 2024091901 -> { - val target = msg.obj as String - if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(target, mat, - object : DetectResultDialog.OnDialogButtonClickListener { - override fun onCheckPassClick(file: File) { - checkPassCount++ - binding.checkedCountView.text = "${checkPassCount}项" - if (checkItemLinkedList.isEmpty()) { - stopCheck() - } - isConfirmedByUser = true - } - - override fun onHaveTroubleClick(file: File) { - imageFileViewModel.uploadImage(file) - - troubleCount++ - binding.troubleCountView.text = "${troubleCount}项" - isConfirmedByUser = true + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" } }).show() } @@ -584,6 +593,33 @@ return true } + private fun showAddHiddenTroubleDialog() { + addHiddenTroubleDialog.initDialogContentView(object : + AddHiddenTroubleDialog.OnDialogButtonClickListener { + override fun onConfirmClick( + mainType: DictionaryModel.DataModel, subType: DictionaryModel.DataModel, + troubleName: String, troubleContent: String + ) { + hiddenTroubleViewModel.addHiddenTrouble( + context, + mainType.value, + subType.value, + RuntimeCache.sceneName, + subType.name, + "", + "", + troubleContent, + RuntimeCache.sceneName.getSceneCodeByName(), + RuntimeCache.inspectionId, + troubleName, + mainType.name, + "", + arrayOf() + ) + } + }).show() + } + override fun onDestroy() { super.onDestroy() timer.cancel() diff --git a/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt index 3e592f3..a9144a0 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt @@ -5,8 +5,11 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.lifecycle.ViewModelProvider import com.casic.br.ar.app.R import com.casic.br.ar.app.databinding.ActivitySelectCheckModeBinding +import com.casic.br.ar.app.utils.RuntimeCache +import com.casic.br.ar.app.vm.ConfigViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -17,6 +20,7 @@ class SelectCheckModeActivity : KotlinBaseActivity() { private val marginOffset by lazy { 25.dp2px(this) } + private lateinit var configViewModel: ConfigViewModel private lateinit var itemAdapter: NormalRecyclerAdapter override fun initEvent() { @@ -32,6 +36,14 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { + configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] + configViewModel.getDictionaryByCode(this, "pitfallSmallType") + configViewModel.dictionary.observe(this) { + if (it.code == 200) { + RuntimeCache.subDicModels = it.data + } + } + itemAdapter = object : NormalRecyclerAdapter( R.layout.item_main_rv_l, arrayListOf("检查模式", "自由模式") ) { diff --git a/app/src/main/java/com/casic/br/ar/app/widgets/AddHiddenTroubleDialog.kt b/app/src/main/java/com/casic/br/ar/app/widgets/AddHiddenTroubleDialog.kt new file mode 100644 index 0000000..6561cf8 --- /dev/null +++ b/app/src/main/java/com/casic/br/ar/app/widgets/AddHiddenTroubleDialog.kt @@ -0,0 +1,120 @@ +package com.casic.br.ar.app.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Typeface +import android.os.Bundle +import android.widget.LinearLayout +import android.widget.TextView +import com.casic.br.ar.app.R +import com.casic.br.ar.app.databinding.DialogAddHiddenTroubleBinding +import com.casic.br.ar.app.model.DictionaryModel +import com.casic.br.ar.app.utils.RuntimeCache +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.dp2px +import com.pengxh.kt.lite.extensions.initDialogLayoutParams + +class AddHiddenTroubleDialog(context: Context) : Dialog(context) { + + private val binding: DialogAddHiddenTroubleBinding by binding() + private val marginOffset by lazy { 5.dp2px(context) } + private lateinit var listener: OnDialogButtonClickListener + private lateinit var mainDictionary: DictionaryModel.DataModel + private lateinit var subDictionary: DictionaryModel.DataModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + initDialogLayoutParams(1f) + + val mainTypeAdapter = object : NormalRecyclerAdapter( + R.layout.item_add_trouble_dialog_rv_l, RuntimeCache.mainDicModels + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: DictionaryModel.DataModel + ) { + viewHolder.setText(R.id.itemTextView, item.name) + viewHolder.getView(R.id.itemRootView) + .setOnFocusChangeListener { v, hasFocus -> + val textView = v.findViewById(R.id.itemTextView) + if (hasFocus) { + textView.typeface = Typeface.DEFAULT_BOLD + v.setBackgroundResource(R.drawable.dialog_view_item_border_selected) + } else { + textView.typeface = Typeface.DEFAULT + v.setBackgroundResource(R.drawable.dialog_view_item_border) + } + } + } + } + binding.mainRecyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, 0, marginOffset, 0) + ) + binding.mainRecyclerView.adapter = mainTypeAdapter + mainTypeAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: DictionaryModel.DataModel) { + mainDictionary = t + } + }) + + val subTypeAdapter = object : NormalRecyclerAdapter( + R.layout.item_add_trouble_dialog_rv_l, RuntimeCache.subDicModels + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: DictionaryModel.DataModel + ) { + viewHolder.setText(R.id.itemTextView, item.name) + viewHolder.getView(R.id.itemRootView) + .setOnFocusChangeListener { v, hasFocus -> + val textView = v.findViewById(R.id.itemTextView) + if (hasFocus) { + textView.typeface = Typeface.DEFAULT_BOLD + v.setBackgroundResource(R.drawable.dialog_view_item_border_selected) + } else { + textView.typeface = Typeface.DEFAULT + v.setBackgroundResource(R.drawable.dialog_view_item_border) + } + } + } + } + binding.subRecyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, 0, marginOffset, 0) + ) + binding.subRecyclerView.adapter = subTypeAdapter + subTypeAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: DictionaryModel.DataModel) { + subDictionary = t + } + }) + + binding.checkPassButton.setOnClickListener { + listener.onConfirmClick( + mainDictionary, + subDictionary, + binding.hiddenTroubleNameView.text.toString(), + binding.hiddenTroubleContentView.text.toString() + ) + dismiss() + } + + binding.cancelButton.setOnClickListener { dismiss() } + } + + fun initDialogContentView(listener: OnDialogButtonClickListener): AddHiddenTroubleDialog { + this.listener = listener + return this + } + + interface OnDialogButtonClickListener { + fun onConfirmClick( + mainType: DictionaryModel.DataModel, subType: DictionaryModel.DataModel, + troubleName: String, troubleContent: String + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt index 4dfe42d..eb0d11c 100644 --- a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.br.operationsite.test.callback +package com.casic.br.ar.app.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt index f71d6ab..b0c55c9 100644 --- a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt @@ -1,8 +1,9 @@ package com.casic.br.ar.app.extensions import android.content.Context +import com.casic.br.ar.app.callback.OnImageCompressListener import com.casic.br.ar.app.utils.LocaleConstant -import com.casic.br.operationsite.test.callback.OnImageCompressListener +import com.casic.br.ar.app.utils.RuntimeCache import com.google.gson.JsonParser import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues @@ -57,6 +58,15 @@ return scene } +fun String.getSceneCodeByName(): String { + for (scene in RuntimeCache.sceneDicModels) { + if (scene.name == this) { + return scene.value + } + } + return "" +} + fun String.isInScene(scene: String): Boolean { when (scene) { "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( diff --git a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt index f717f82..79e11c7 100644 --- a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt +++ b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt @@ -3,11 +3,9 @@ import com.casic.br.ar.app.model.DictionaryModel object RuntimeCache { - //TODO 未赋值 - var scene = "" - var sceneName = "" var inspectionId = "" var mainDicModels: MutableList = ArrayList() + var subDicModels: MutableList = ArrayList() var sceneDicModels: MutableList = ArrayList() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt index 6a9e240..c1f9bb8 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt @@ -7,9 +7,8 @@ import android.widget.ArrayAdapter import androidx.lifecycle.ViewModelProvider import com.casic.br.ar.app.databinding.ActivityAddHiddenTroubleBinding -import com.casic.br.ar.app.model.DictionaryModel +import com.casic.br.ar.app.extensions.getSceneCodeByName import com.casic.br.ar.app.utils.RuntimeCache -import com.casic.br.ar.app.vm.ConfigViewModel import com.casic.br.ar.app.vm.HiddenTroubleViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show @@ -20,10 +19,7 @@ private val kTag = "AddHiddenTroubleActivity" private val imagePaths = ArrayList>() - private lateinit var configViewModel: ConfigViewModel private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel - private var mainDicModels: MutableList = ArrayList() - private var subDicModels: MutableList = ArrayList() private var selectedMainTypePosition = 0 private var selectedSubTypePosition = 0 @@ -48,30 +44,21 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - //转为实体类 - mainDicModels = RuntimeCache.mainDicModels val mainTypeArray = ArrayList() - mainDicModels.forEach { + RuntimeCache.mainDicModels.forEach { mainTypeArray.add(it.name) } val mainTypeAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mainTypeArray) binding.mainTypeSpinner.adapter = mainTypeAdapter - configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] - configViewModel.getDictionaryByCode(this, "pitfallSmallType") - configViewModel.dictionary.observe(this) { - if (it.code == 200) { - subDicModels = it.data - val subTypeArray = ArrayList() - subDicModels.forEach { dic -> - subTypeArray.add(dic.name) - } - val subTypeAdapter = ArrayAdapter( - this, android.R.layout.simple_list_item_1, subTypeArray - ) - binding.subTypeSpinner.adapter = subTypeAdapter - } + val subTypeArray = ArrayList() + RuntimeCache.subDicModels.forEach { dic -> + subTypeArray.add(dic.name) } + val subTypeAdapter = ArrayAdapter( + this, android.R.layout.simple_list_item_1, subTypeArray + ) + binding.subTypeSpinner.adapter = subTypeAdapter hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java] hiddenTroubleViewModel.addTroubleResult.observe(this) { @@ -116,14 +103,14 @@ selectedMainTypePosition.toString(), selectedSubTypePosition.toString(), RuntimeCache.sceneName, - subDicModels[selectedMainTypePosition].name, + RuntimeCache.subDicModels[selectedMainTypePosition].name, "", "", binding.hiddenTroubleContentView.text.toString(), - RuntimeCache.scene, + RuntimeCache.sceneName.getSceneCodeByName(), RuntimeCache.inspectionId, binding.hiddenTroubleNameView.text.toString(), - mainDicModels[selectedMainTypePosition].name, + RuntimeCache.mainDicModels[selectedMainTypePosition].name, "", imagePaths.toTypedArray() ) diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt index 43699d7..e51c29c 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt @@ -15,6 +15,7 @@ import com.casic.br.ar.app.databinding.ActivityCheckModeBinding import com.casic.br.ar.app.extensions.convert2YoloResult import com.casic.br.ar.app.extensions.getSceneByTarget +import com.casic.br.ar.app.extensions.getSceneCodeByName import com.casic.br.ar.app.extensions.isContains import com.casic.br.ar.app.extensions.isInScene import com.casic.br.ar.app.external.INativeCallback @@ -27,8 +28,10 @@ import com.casic.br.ar.app.vm.AlarmViewModel import com.casic.br.ar.app.vm.CheckManifestViewModel import com.casic.br.ar.app.vm.ConfigViewModel +import com.casic.br.ar.app.vm.HiddenTroubleViewModel import com.casic.br.ar.app.vm.ImageFileViewModel import com.casic.br.ar.app.vm.InspectionViewModel +import com.casic.br.ar.app.widgets.AddHiddenTroubleDialog import com.casic.br.ar.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @@ -60,13 +63,14 @@ private val mat by lazy { Mat() } private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private val detectResultDialog by lazy { DetectResultDialog(this) } + private val addHiddenTroubleDialog by lazy { AddHiddenTroubleDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private lateinit var imageFileViewModel: ImageFileViewModel private lateinit var alarmViewModel: AlarmViewModel private lateinit var checkManifestViewModel: CheckManifestViewModel + private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel private lateinit var timer: Timer - private var mainDicModels: MutableList = ArrayList() private var checkItemLinkedList = LinkedList() private var isDetectTarget = false private var alarmCode = "" @@ -116,7 +120,7 @@ configViewModel.getDictionaryByCode(context, "pitfallBigType") configViewModel.dictionary.observe(this) { if (it.code == 200) { - mainDicModels = it.data + RuntimeCache.mainDicModels = it.data } } @@ -140,22 +144,51 @@ } } + hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java] + hiddenTroubleViewModel.addTroubleResult.observe(this) { + if (it.code == 200) { + troubleCount++ + binding.troubleCountView.text = "${troubleCount}项" + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" + isConfirmedByUser = true + } + } + //队列处理清单内容 timer = Timer() timer.schedule(object : TimerTask() { override fun run() { - runOnUiThread { - binding.noCheckCountView.text = "${checkItemLinkedList.size}项" - } if (isConfirmedByUser && checkItemLinkedList.isNotEmpty()) { - isConfirmedByUser = false - //取出队列头部元素 - val headItem = checkItemLinkedList.poll() - if (headItem != null) { - val message = weakReferenceHandler.obtainMessage() - message.what = 2024091901 - message.obj = headItem.checkItem - weakReferenceHandler.sendMessage(message) + lifecycleScope.launch(Dispatchers.Main) { + if (!detectResultDialog.isShowing) { + isConfirmedByUser = false + //取出队列头部元素 + val headItem = checkItemLinkedList.poll() + if (headItem != null) { + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView( + headItem.checkItem, mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onCheckPassClick(file: File) { + checkPassCount++ + binding.checkedCountView.text = + "${checkPassCount}项" + binding.noCheckCountView.text = + "${checkItemLinkedList.size}项" + if (checkItemLinkedList.isEmpty()) { + stopCheck() + } + isConfirmedByUser = true + } + + override fun onHaveTroubleClick(file: File) { + //弹新的框 + showAddHiddenTroubleDialog() + } + }).show() + } + } + } } } } @@ -168,7 +201,6 @@ } binding.addHiddenTroubleButton.setOnClickListener { - RuntimeCache.mainDicModels = mainDicModels navigatePageTo() } @@ -534,12 +566,13 @@ } if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(target, mat, - object : DetectResultDialog.OnDialogButtonClickListener { + detectResultDialog.updateDialogContentView( + target, mat, object : DetectResultDialog.OnDialogButtonClickListener { override fun onCheckPassClick(file: File) { detectedTargetSet.add(target) checkPassCount++ binding.checkedCountView.text = "${checkPassCount}项" + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" if (checkItemLinkedList.isEmpty()) { stopCheck() } @@ -551,31 +584,7 @@ troubleCount++ binding.troubleCountView.text = "${troubleCount}项" - } - }).show() - } - } - - 2024091901 -> { - val target = msg.obj as String - if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(target, mat, - object : DetectResultDialog.OnDialogButtonClickListener { - override fun onCheckPassClick(file: File) { - checkPassCount++ - binding.checkedCountView.text = "${checkPassCount}项" - if (checkItemLinkedList.isEmpty()) { - stopCheck() - } - isConfirmedByUser = true - } - - override fun onHaveTroubleClick(file: File) { - imageFileViewModel.uploadImage(file) - - troubleCount++ - binding.troubleCountView.text = "${troubleCount}项" - isConfirmedByUser = true + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" } }).show() } @@ -584,6 +593,33 @@ return true } + private fun showAddHiddenTroubleDialog() { + addHiddenTroubleDialog.initDialogContentView(object : + AddHiddenTroubleDialog.OnDialogButtonClickListener { + override fun onConfirmClick( + mainType: DictionaryModel.DataModel, subType: DictionaryModel.DataModel, + troubleName: String, troubleContent: String + ) { + hiddenTroubleViewModel.addHiddenTrouble( + context, + mainType.value, + subType.value, + RuntimeCache.sceneName, + subType.name, + "", + "", + troubleContent, + RuntimeCache.sceneName.getSceneCodeByName(), + RuntimeCache.inspectionId, + troubleName, + mainType.name, + "", + arrayOf() + ) + } + }).show() + } + override fun onDestroy() { super.onDestroy() timer.cancel() diff --git a/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt index 3e592f3..a9144a0 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt @@ -5,8 +5,11 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.lifecycle.ViewModelProvider import com.casic.br.ar.app.R import com.casic.br.ar.app.databinding.ActivitySelectCheckModeBinding +import com.casic.br.ar.app.utils.RuntimeCache +import com.casic.br.ar.app.vm.ConfigViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -17,6 +20,7 @@ class SelectCheckModeActivity : KotlinBaseActivity() { private val marginOffset by lazy { 25.dp2px(this) } + private lateinit var configViewModel: ConfigViewModel private lateinit var itemAdapter: NormalRecyclerAdapter override fun initEvent() { @@ -32,6 +36,14 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { + configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] + configViewModel.getDictionaryByCode(this, "pitfallSmallType") + configViewModel.dictionary.observe(this) { + if (it.code == 200) { + RuntimeCache.subDicModels = it.data + } + } + itemAdapter = object : NormalRecyclerAdapter( R.layout.item_main_rv_l, arrayListOf("检查模式", "自由模式") ) { diff --git a/app/src/main/java/com/casic/br/ar/app/widgets/AddHiddenTroubleDialog.kt b/app/src/main/java/com/casic/br/ar/app/widgets/AddHiddenTroubleDialog.kt new file mode 100644 index 0000000..6561cf8 --- /dev/null +++ b/app/src/main/java/com/casic/br/ar/app/widgets/AddHiddenTroubleDialog.kt @@ -0,0 +1,120 @@ +package com.casic.br.ar.app.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Typeface +import android.os.Bundle +import android.widget.LinearLayout +import android.widget.TextView +import com.casic.br.ar.app.R +import com.casic.br.ar.app.databinding.DialogAddHiddenTroubleBinding +import com.casic.br.ar.app.model.DictionaryModel +import com.casic.br.ar.app.utils.RuntimeCache +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.dp2px +import com.pengxh.kt.lite.extensions.initDialogLayoutParams + +class AddHiddenTroubleDialog(context: Context) : Dialog(context) { + + private val binding: DialogAddHiddenTroubleBinding by binding() + private val marginOffset by lazy { 5.dp2px(context) } + private lateinit var listener: OnDialogButtonClickListener + private lateinit var mainDictionary: DictionaryModel.DataModel + private lateinit var subDictionary: DictionaryModel.DataModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + initDialogLayoutParams(1f) + + val mainTypeAdapter = object : NormalRecyclerAdapter( + R.layout.item_add_trouble_dialog_rv_l, RuntimeCache.mainDicModels + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: DictionaryModel.DataModel + ) { + viewHolder.setText(R.id.itemTextView, item.name) + viewHolder.getView(R.id.itemRootView) + .setOnFocusChangeListener { v, hasFocus -> + val textView = v.findViewById(R.id.itemTextView) + if (hasFocus) { + textView.typeface = Typeface.DEFAULT_BOLD + v.setBackgroundResource(R.drawable.dialog_view_item_border_selected) + } else { + textView.typeface = Typeface.DEFAULT + v.setBackgroundResource(R.drawable.dialog_view_item_border) + } + } + } + } + binding.mainRecyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, 0, marginOffset, 0) + ) + binding.mainRecyclerView.adapter = mainTypeAdapter + mainTypeAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: DictionaryModel.DataModel) { + mainDictionary = t + } + }) + + val subTypeAdapter = object : NormalRecyclerAdapter( + R.layout.item_add_trouble_dialog_rv_l, RuntimeCache.subDicModels + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: DictionaryModel.DataModel + ) { + viewHolder.setText(R.id.itemTextView, item.name) + viewHolder.getView(R.id.itemRootView) + .setOnFocusChangeListener { v, hasFocus -> + val textView = v.findViewById(R.id.itemTextView) + if (hasFocus) { + textView.typeface = Typeface.DEFAULT_BOLD + v.setBackgroundResource(R.drawable.dialog_view_item_border_selected) + } else { + textView.typeface = Typeface.DEFAULT + v.setBackgroundResource(R.drawable.dialog_view_item_border) + } + } + } + } + binding.subRecyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, 0, marginOffset, 0) + ) + binding.subRecyclerView.adapter = subTypeAdapter + subTypeAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: DictionaryModel.DataModel) { + subDictionary = t + } + }) + + binding.checkPassButton.setOnClickListener { + listener.onConfirmClick( + mainDictionary, + subDictionary, + binding.hiddenTroubleNameView.text.toString(), + binding.hiddenTroubleContentView.text.toString() + ) + dismiss() + } + + binding.cancelButton.setOnClickListener { dismiss() } + } + + fun initDialogContentView(listener: OnDialogButtonClickListener): AddHiddenTroubleDialog { + this.listener = listener + return this + } + + interface OnDialogButtonClickListener { + fun onConfirmClick( + mainType: DictionaryModel.DataModel, subType: DictionaryModel.DataModel, + troubleName: String, troubleContent: String + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt index 8833949..942e682 100644 --- a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt +++ b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt @@ -4,9 +4,9 @@ import android.content.Context import android.graphics.Bitmap import android.os.Bundle +import com.casic.br.ar.app.callback.OnImageCompressListener import com.casic.br.ar.app.databinding.DialogDetectResultBinding import com.casic.br.ar.app.extensions.compressImage -import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.createImageFileDir import com.pengxh.kt.lite.extensions.initDialogLayoutParams diff --git a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt index 4dfe42d..eb0d11c 100644 --- a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.br.operationsite.test.callback +package com.casic.br.ar.app.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt index f71d6ab..b0c55c9 100644 --- a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt @@ -1,8 +1,9 @@ package com.casic.br.ar.app.extensions import android.content.Context +import com.casic.br.ar.app.callback.OnImageCompressListener import com.casic.br.ar.app.utils.LocaleConstant -import com.casic.br.operationsite.test.callback.OnImageCompressListener +import com.casic.br.ar.app.utils.RuntimeCache import com.google.gson.JsonParser import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues @@ -57,6 +58,15 @@ return scene } +fun String.getSceneCodeByName(): String { + for (scene in RuntimeCache.sceneDicModels) { + if (scene.name == this) { + return scene.value + } + } + return "" +} + fun String.isInScene(scene: String): Boolean { when (scene) { "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( diff --git a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt index f717f82..79e11c7 100644 --- a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt +++ b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt @@ -3,11 +3,9 @@ import com.casic.br.ar.app.model.DictionaryModel object RuntimeCache { - //TODO 未赋值 - var scene = "" - var sceneName = "" var inspectionId = "" var mainDicModels: MutableList = ArrayList() + var subDicModels: MutableList = ArrayList() var sceneDicModels: MutableList = ArrayList() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt index 6a9e240..c1f9bb8 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt @@ -7,9 +7,8 @@ import android.widget.ArrayAdapter import androidx.lifecycle.ViewModelProvider import com.casic.br.ar.app.databinding.ActivityAddHiddenTroubleBinding -import com.casic.br.ar.app.model.DictionaryModel +import com.casic.br.ar.app.extensions.getSceneCodeByName import com.casic.br.ar.app.utils.RuntimeCache -import com.casic.br.ar.app.vm.ConfigViewModel import com.casic.br.ar.app.vm.HiddenTroubleViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show @@ -20,10 +19,7 @@ private val kTag = "AddHiddenTroubleActivity" private val imagePaths = ArrayList>() - private lateinit var configViewModel: ConfigViewModel private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel - private var mainDicModels: MutableList = ArrayList() - private var subDicModels: MutableList = ArrayList() private var selectedMainTypePosition = 0 private var selectedSubTypePosition = 0 @@ -48,30 +44,21 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - //转为实体类 - mainDicModels = RuntimeCache.mainDicModels val mainTypeArray = ArrayList() - mainDicModels.forEach { + RuntimeCache.mainDicModels.forEach { mainTypeArray.add(it.name) } val mainTypeAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mainTypeArray) binding.mainTypeSpinner.adapter = mainTypeAdapter - configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] - configViewModel.getDictionaryByCode(this, "pitfallSmallType") - configViewModel.dictionary.observe(this) { - if (it.code == 200) { - subDicModels = it.data - val subTypeArray = ArrayList() - subDicModels.forEach { dic -> - subTypeArray.add(dic.name) - } - val subTypeAdapter = ArrayAdapter( - this, android.R.layout.simple_list_item_1, subTypeArray - ) - binding.subTypeSpinner.adapter = subTypeAdapter - } + val subTypeArray = ArrayList() + RuntimeCache.subDicModels.forEach { dic -> + subTypeArray.add(dic.name) } + val subTypeAdapter = ArrayAdapter( + this, android.R.layout.simple_list_item_1, subTypeArray + ) + binding.subTypeSpinner.adapter = subTypeAdapter hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java] hiddenTroubleViewModel.addTroubleResult.observe(this) { @@ -116,14 +103,14 @@ selectedMainTypePosition.toString(), selectedSubTypePosition.toString(), RuntimeCache.sceneName, - subDicModels[selectedMainTypePosition].name, + RuntimeCache.subDicModels[selectedMainTypePosition].name, "", "", binding.hiddenTroubleContentView.text.toString(), - RuntimeCache.scene, + RuntimeCache.sceneName.getSceneCodeByName(), RuntimeCache.inspectionId, binding.hiddenTroubleNameView.text.toString(), - mainDicModels[selectedMainTypePosition].name, + RuntimeCache.mainDicModels[selectedMainTypePosition].name, "", imagePaths.toTypedArray() ) diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt index 43699d7..e51c29c 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt @@ -15,6 +15,7 @@ import com.casic.br.ar.app.databinding.ActivityCheckModeBinding import com.casic.br.ar.app.extensions.convert2YoloResult import com.casic.br.ar.app.extensions.getSceneByTarget +import com.casic.br.ar.app.extensions.getSceneCodeByName import com.casic.br.ar.app.extensions.isContains import com.casic.br.ar.app.extensions.isInScene import com.casic.br.ar.app.external.INativeCallback @@ -27,8 +28,10 @@ import com.casic.br.ar.app.vm.AlarmViewModel import com.casic.br.ar.app.vm.CheckManifestViewModel import com.casic.br.ar.app.vm.ConfigViewModel +import com.casic.br.ar.app.vm.HiddenTroubleViewModel import com.casic.br.ar.app.vm.ImageFileViewModel import com.casic.br.ar.app.vm.InspectionViewModel +import com.casic.br.ar.app.widgets.AddHiddenTroubleDialog import com.casic.br.ar.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @@ -60,13 +63,14 @@ private val mat by lazy { Mat() } private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private val detectResultDialog by lazy { DetectResultDialog(this) } + private val addHiddenTroubleDialog by lazy { AddHiddenTroubleDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private lateinit var imageFileViewModel: ImageFileViewModel private lateinit var alarmViewModel: AlarmViewModel private lateinit var checkManifestViewModel: CheckManifestViewModel + private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel private lateinit var timer: Timer - private var mainDicModels: MutableList = ArrayList() private var checkItemLinkedList = LinkedList() private var isDetectTarget = false private var alarmCode = "" @@ -116,7 +120,7 @@ configViewModel.getDictionaryByCode(context, "pitfallBigType") configViewModel.dictionary.observe(this) { if (it.code == 200) { - mainDicModels = it.data + RuntimeCache.mainDicModels = it.data } } @@ -140,22 +144,51 @@ } } + hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java] + hiddenTroubleViewModel.addTroubleResult.observe(this) { + if (it.code == 200) { + troubleCount++ + binding.troubleCountView.text = "${troubleCount}项" + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" + isConfirmedByUser = true + } + } + //队列处理清单内容 timer = Timer() timer.schedule(object : TimerTask() { override fun run() { - runOnUiThread { - binding.noCheckCountView.text = "${checkItemLinkedList.size}项" - } if (isConfirmedByUser && checkItemLinkedList.isNotEmpty()) { - isConfirmedByUser = false - //取出队列头部元素 - val headItem = checkItemLinkedList.poll() - if (headItem != null) { - val message = weakReferenceHandler.obtainMessage() - message.what = 2024091901 - message.obj = headItem.checkItem - weakReferenceHandler.sendMessage(message) + lifecycleScope.launch(Dispatchers.Main) { + if (!detectResultDialog.isShowing) { + isConfirmedByUser = false + //取出队列头部元素 + val headItem = checkItemLinkedList.poll() + if (headItem != null) { + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView( + headItem.checkItem, mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onCheckPassClick(file: File) { + checkPassCount++ + binding.checkedCountView.text = + "${checkPassCount}项" + binding.noCheckCountView.text = + "${checkItemLinkedList.size}项" + if (checkItemLinkedList.isEmpty()) { + stopCheck() + } + isConfirmedByUser = true + } + + override fun onHaveTroubleClick(file: File) { + //弹新的框 + showAddHiddenTroubleDialog() + } + }).show() + } + } + } } } } @@ -168,7 +201,6 @@ } binding.addHiddenTroubleButton.setOnClickListener { - RuntimeCache.mainDicModels = mainDicModels navigatePageTo() } @@ -534,12 +566,13 @@ } if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(target, mat, - object : DetectResultDialog.OnDialogButtonClickListener { + detectResultDialog.updateDialogContentView( + target, mat, object : DetectResultDialog.OnDialogButtonClickListener { override fun onCheckPassClick(file: File) { detectedTargetSet.add(target) checkPassCount++ binding.checkedCountView.text = "${checkPassCount}项" + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" if (checkItemLinkedList.isEmpty()) { stopCheck() } @@ -551,31 +584,7 @@ troubleCount++ binding.troubleCountView.text = "${troubleCount}项" - } - }).show() - } - } - - 2024091901 -> { - val target = msg.obj as String - if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(target, mat, - object : DetectResultDialog.OnDialogButtonClickListener { - override fun onCheckPassClick(file: File) { - checkPassCount++ - binding.checkedCountView.text = "${checkPassCount}项" - if (checkItemLinkedList.isEmpty()) { - stopCheck() - } - isConfirmedByUser = true - } - - override fun onHaveTroubleClick(file: File) { - imageFileViewModel.uploadImage(file) - - troubleCount++ - binding.troubleCountView.text = "${troubleCount}项" - isConfirmedByUser = true + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" } }).show() } @@ -584,6 +593,33 @@ return true } + private fun showAddHiddenTroubleDialog() { + addHiddenTroubleDialog.initDialogContentView(object : + AddHiddenTroubleDialog.OnDialogButtonClickListener { + override fun onConfirmClick( + mainType: DictionaryModel.DataModel, subType: DictionaryModel.DataModel, + troubleName: String, troubleContent: String + ) { + hiddenTroubleViewModel.addHiddenTrouble( + context, + mainType.value, + subType.value, + RuntimeCache.sceneName, + subType.name, + "", + "", + troubleContent, + RuntimeCache.sceneName.getSceneCodeByName(), + RuntimeCache.inspectionId, + troubleName, + mainType.name, + "", + arrayOf() + ) + } + }).show() + } + override fun onDestroy() { super.onDestroy() timer.cancel() diff --git a/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt index 3e592f3..a9144a0 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt @@ -5,8 +5,11 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.lifecycle.ViewModelProvider import com.casic.br.ar.app.R import com.casic.br.ar.app.databinding.ActivitySelectCheckModeBinding +import com.casic.br.ar.app.utils.RuntimeCache +import com.casic.br.ar.app.vm.ConfigViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -17,6 +20,7 @@ class SelectCheckModeActivity : KotlinBaseActivity() { private val marginOffset by lazy { 25.dp2px(this) } + private lateinit var configViewModel: ConfigViewModel private lateinit var itemAdapter: NormalRecyclerAdapter override fun initEvent() { @@ -32,6 +36,14 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { + configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] + configViewModel.getDictionaryByCode(this, "pitfallSmallType") + configViewModel.dictionary.observe(this) { + if (it.code == 200) { + RuntimeCache.subDicModels = it.data + } + } + itemAdapter = object : NormalRecyclerAdapter( R.layout.item_main_rv_l, arrayListOf("检查模式", "自由模式") ) { diff --git a/app/src/main/java/com/casic/br/ar/app/widgets/AddHiddenTroubleDialog.kt b/app/src/main/java/com/casic/br/ar/app/widgets/AddHiddenTroubleDialog.kt new file mode 100644 index 0000000..6561cf8 --- /dev/null +++ b/app/src/main/java/com/casic/br/ar/app/widgets/AddHiddenTroubleDialog.kt @@ -0,0 +1,120 @@ +package com.casic.br.ar.app.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Typeface +import android.os.Bundle +import android.widget.LinearLayout +import android.widget.TextView +import com.casic.br.ar.app.R +import com.casic.br.ar.app.databinding.DialogAddHiddenTroubleBinding +import com.casic.br.ar.app.model.DictionaryModel +import com.casic.br.ar.app.utils.RuntimeCache +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.dp2px +import com.pengxh.kt.lite.extensions.initDialogLayoutParams + +class AddHiddenTroubleDialog(context: Context) : Dialog(context) { + + private val binding: DialogAddHiddenTroubleBinding by binding() + private val marginOffset by lazy { 5.dp2px(context) } + private lateinit var listener: OnDialogButtonClickListener + private lateinit var mainDictionary: DictionaryModel.DataModel + private lateinit var subDictionary: DictionaryModel.DataModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + initDialogLayoutParams(1f) + + val mainTypeAdapter = object : NormalRecyclerAdapter( + R.layout.item_add_trouble_dialog_rv_l, RuntimeCache.mainDicModels + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: DictionaryModel.DataModel + ) { + viewHolder.setText(R.id.itemTextView, item.name) + viewHolder.getView(R.id.itemRootView) + .setOnFocusChangeListener { v, hasFocus -> + val textView = v.findViewById(R.id.itemTextView) + if (hasFocus) { + textView.typeface = Typeface.DEFAULT_BOLD + v.setBackgroundResource(R.drawable.dialog_view_item_border_selected) + } else { + textView.typeface = Typeface.DEFAULT + v.setBackgroundResource(R.drawable.dialog_view_item_border) + } + } + } + } + binding.mainRecyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, 0, marginOffset, 0) + ) + binding.mainRecyclerView.adapter = mainTypeAdapter + mainTypeAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: DictionaryModel.DataModel) { + mainDictionary = t + } + }) + + val subTypeAdapter = object : NormalRecyclerAdapter( + R.layout.item_add_trouble_dialog_rv_l, RuntimeCache.subDicModels + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: DictionaryModel.DataModel + ) { + viewHolder.setText(R.id.itemTextView, item.name) + viewHolder.getView(R.id.itemRootView) + .setOnFocusChangeListener { v, hasFocus -> + val textView = v.findViewById(R.id.itemTextView) + if (hasFocus) { + textView.typeface = Typeface.DEFAULT_BOLD + v.setBackgroundResource(R.drawable.dialog_view_item_border_selected) + } else { + textView.typeface = Typeface.DEFAULT + v.setBackgroundResource(R.drawable.dialog_view_item_border) + } + } + } + } + binding.subRecyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, 0, marginOffset, 0) + ) + binding.subRecyclerView.adapter = subTypeAdapter + subTypeAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: DictionaryModel.DataModel) { + subDictionary = t + } + }) + + binding.checkPassButton.setOnClickListener { + listener.onConfirmClick( + mainDictionary, + subDictionary, + binding.hiddenTroubleNameView.text.toString(), + binding.hiddenTroubleContentView.text.toString() + ) + dismiss() + } + + binding.cancelButton.setOnClickListener { dismiss() } + } + + fun initDialogContentView(listener: OnDialogButtonClickListener): AddHiddenTroubleDialog { + this.listener = listener + return this + } + + interface OnDialogButtonClickListener { + fun onConfirmClick( + mainType: DictionaryModel.DataModel, subType: DictionaryModel.DataModel, + troubleName: String, troubleContent: String + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt index 8833949..942e682 100644 --- a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt +++ b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt @@ -4,9 +4,9 @@ import android.content.Context import android.graphics.Bitmap import android.os.Bundle +import com.casic.br.ar.app.callback.OnImageCompressListener import com.casic.br.ar.app.databinding.DialogDetectResultBinding import com.casic.br.ar.app.extensions.compressImage -import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.createImageFileDir import com.pengxh.kt.lite.extensions.initDialogLayoutParams diff --git a/app/src/main/res/drawable/dialog_view_item_border.xml b/app/src/main/res/drawable/dialog_view_item_border.xml new file mode 100644 index 0000000..ee5fc50 --- /dev/null +++ b/app/src/main/res/drawable/dialog_view_item_border.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt index 4dfe42d..eb0d11c 100644 --- a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.br.operationsite.test.callback +package com.casic.br.ar.app.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt index f71d6ab..b0c55c9 100644 --- a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt @@ -1,8 +1,9 @@ package com.casic.br.ar.app.extensions import android.content.Context +import com.casic.br.ar.app.callback.OnImageCompressListener import com.casic.br.ar.app.utils.LocaleConstant -import com.casic.br.operationsite.test.callback.OnImageCompressListener +import com.casic.br.ar.app.utils.RuntimeCache import com.google.gson.JsonParser import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues @@ -57,6 +58,15 @@ return scene } +fun String.getSceneCodeByName(): String { + for (scene in RuntimeCache.sceneDicModels) { + if (scene.name == this) { + return scene.value + } + } + return "" +} + fun String.isInScene(scene: String): Boolean { when (scene) { "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( diff --git a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt index f717f82..79e11c7 100644 --- a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt +++ b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt @@ -3,11 +3,9 @@ import com.casic.br.ar.app.model.DictionaryModel object RuntimeCache { - //TODO 未赋值 - var scene = "" - var sceneName = "" var inspectionId = "" var mainDicModels: MutableList = ArrayList() + var subDicModels: MutableList = ArrayList() var sceneDicModels: MutableList = ArrayList() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt index 6a9e240..c1f9bb8 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt @@ -7,9 +7,8 @@ import android.widget.ArrayAdapter import androidx.lifecycle.ViewModelProvider import com.casic.br.ar.app.databinding.ActivityAddHiddenTroubleBinding -import com.casic.br.ar.app.model.DictionaryModel +import com.casic.br.ar.app.extensions.getSceneCodeByName import com.casic.br.ar.app.utils.RuntimeCache -import com.casic.br.ar.app.vm.ConfigViewModel import com.casic.br.ar.app.vm.HiddenTroubleViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show @@ -20,10 +19,7 @@ private val kTag = "AddHiddenTroubleActivity" private val imagePaths = ArrayList>() - private lateinit var configViewModel: ConfigViewModel private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel - private var mainDicModels: MutableList = ArrayList() - private var subDicModels: MutableList = ArrayList() private var selectedMainTypePosition = 0 private var selectedSubTypePosition = 0 @@ -48,30 +44,21 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - //转为实体类 - mainDicModels = RuntimeCache.mainDicModels val mainTypeArray = ArrayList() - mainDicModels.forEach { + RuntimeCache.mainDicModels.forEach { mainTypeArray.add(it.name) } val mainTypeAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mainTypeArray) binding.mainTypeSpinner.adapter = mainTypeAdapter - configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] - configViewModel.getDictionaryByCode(this, "pitfallSmallType") - configViewModel.dictionary.observe(this) { - if (it.code == 200) { - subDicModels = it.data - val subTypeArray = ArrayList() - subDicModels.forEach { dic -> - subTypeArray.add(dic.name) - } - val subTypeAdapter = ArrayAdapter( - this, android.R.layout.simple_list_item_1, subTypeArray - ) - binding.subTypeSpinner.adapter = subTypeAdapter - } + val subTypeArray = ArrayList() + RuntimeCache.subDicModels.forEach { dic -> + subTypeArray.add(dic.name) } + val subTypeAdapter = ArrayAdapter( + this, android.R.layout.simple_list_item_1, subTypeArray + ) + binding.subTypeSpinner.adapter = subTypeAdapter hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java] hiddenTroubleViewModel.addTroubleResult.observe(this) { @@ -116,14 +103,14 @@ selectedMainTypePosition.toString(), selectedSubTypePosition.toString(), RuntimeCache.sceneName, - subDicModels[selectedMainTypePosition].name, + RuntimeCache.subDicModels[selectedMainTypePosition].name, "", "", binding.hiddenTroubleContentView.text.toString(), - RuntimeCache.scene, + RuntimeCache.sceneName.getSceneCodeByName(), RuntimeCache.inspectionId, binding.hiddenTroubleNameView.text.toString(), - mainDicModels[selectedMainTypePosition].name, + RuntimeCache.mainDicModels[selectedMainTypePosition].name, "", imagePaths.toTypedArray() ) diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt index 43699d7..e51c29c 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt @@ -15,6 +15,7 @@ import com.casic.br.ar.app.databinding.ActivityCheckModeBinding import com.casic.br.ar.app.extensions.convert2YoloResult import com.casic.br.ar.app.extensions.getSceneByTarget +import com.casic.br.ar.app.extensions.getSceneCodeByName import com.casic.br.ar.app.extensions.isContains import com.casic.br.ar.app.extensions.isInScene import com.casic.br.ar.app.external.INativeCallback @@ -27,8 +28,10 @@ import com.casic.br.ar.app.vm.AlarmViewModel import com.casic.br.ar.app.vm.CheckManifestViewModel import com.casic.br.ar.app.vm.ConfigViewModel +import com.casic.br.ar.app.vm.HiddenTroubleViewModel import com.casic.br.ar.app.vm.ImageFileViewModel import com.casic.br.ar.app.vm.InspectionViewModel +import com.casic.br.ar.app.widgets.AddHiddenTroubleDialog import com.casic.br.ar.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @@ -60,13 +63,14 @@ private val mat by lazy { Mat() } private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private val detectResultDialog by lazy { DetectResultDialog(this) } + private val addHiddenTroubleDialog by lazy { AddHiddenTroubleDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private lateinit var imageFileViewModel: ImageFileViewModel private lateinit var alarmViewModel: AlarmViewModel private lateinit var checkManifestViewModel: CheckManifestViewModel + private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel private lateinit var timer: Timer - private var mainDicModels: MutableList = ArrayList() private var checkItemLinkedList = LinkedList() private var isDetectTarget = false private var alarmCode = "" @@ -116,7 +120,7 @@ configViewModel.getDictionaryByCode(context, "pitfallBigType") configViewModel.dictionary.observe(this) { if (it.code == 200) { - mainDicModels = it.data + RuntimeCache.mainDicModels = it.data } } @@ -140,22 +144,51 @@ } } + hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java] + hiddenTroubleViewModel.addTroubleResult.observe(this) { + if (it.code == 200) { + troubleCount++ + binding.troubleCountView.text = "${troubleCount}项" + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" + isConfirmedByUser = true + } + } + //队列处理清单内容 timer = Timer() timer.schedule(object : TimerTask() { override fun run() { - runOnUiThread { - binding.noCheckCountView.text = "${checkItemLinkedList.size}项" - } if (isConfirmedByUser && checkItemLinkedList.isNotEmpty()) { - isConfirmedByUser = false - //取出队列头部元素 - val headItem = checkItemLinkedList.poll() - if (headItem != null) { - val message = weakReferenceHandler.obtainMessage() - message.what = 2024091901 - message.obj = headItem.checkItem - weakReferenceHandler.sendMessage(message) + lifecycleScope.launch(Dispatchers.Main) { + if (!detectResultDialog.isShowing) { + isConfirmedByUser = false + //取出队列头部元素 + val headItem = checkItemLinkedList.poll() + if (headItem != null) { + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView( + headItem.checkItem, mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onCheckPassClick(file: File) { + checkPassCount++ + binding.checkedCountView.text = + "${checkPassCount}项" + binding.noCheckCountView.text = + "${checkItemLinkedList.size}项" + if (checkItemLinkedList.isEmpty()) { + stopCheck() + } + isConfirmedByUser = true + } + + override fun onHaveTroubleClick(file: File) { + //弹新的框 + showAddHiddenTroubleDialog() + } + }).show() + } + } + } } } } @@ -168,7 +201,6 @@ } binding.addHiddenTroubleButton.setOnClickListener { - RuntimeCache.mainDicModels = mainDicModels navigatePageTo() } @@ -534,12 +566,13 @@ } if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(target, mat, - object : DetectResultDialog.OnDialogButtonClickListener { + detectResultDialog.updateDialogContentView( + target, mat, object : DetectResultDialog.OnDialogButtonClickListener { override fun onCheckPassClick(file: File) { detectedTargetSet.add(target) checkPassCount++ binding.checkedCountView.text = "${checkPassCount}项" + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" if (checkItemLinkedList.isEmpty()) { stopCheck() } @@ -551,31 +584,7 @@ troubleCount++ binding.troubleCountView.text = "${troubleCount}项" - } - }).show() - } - } - - 2024091901 -> { - val target = msg.obj as String - if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(target, mat, - object : DetectResultDialog.OnDialogButtonClickListener { - override fun onCheckPassClick(file: File) { - checkPassCount++ - binding.checkedCountView.text = "${checkPassCount}项" - if (checkItemLinkedList.isEmpty()) { - stopCheck() - } - isConfirmedByUser = true - } - - override fun onHaveTroubleClick(file: File) { - imageFileViewModel.uploadImage(file) - - troubleCount++ - binding.troubleCountView.text = "${troubleCount}项" - isConfirmedByUser = true + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" } }).show() } @@ -584,6 +593,33 @@ return true } + private fun showAddHiddenTroubleDialog() { + addHiddenTroubleDialog.initDialogContentView(object : + AddHiddenTroubleDialog.OnDialogButtonClickListener { + override fun onConfirmClick( + mainType: DictionaryModel.DataModel, subType: DictionaryModel.DataModel, + troubleName: String, troubleContent: String + ) { + hiddenTroubleViewModel.addHiddenTrouble( + context, + mainType.value, + subType.value, + RuntimeCache.sceneName, + subType.name, + "", + "", + troubleContent, + RuntimeCache.sceneName.getSceneCodeByName(), + RuntimeCache.inspectionId, + troubleName, + mainType.name, + "", + arrayOf() + ) + } + }).show() + } + override fun onDestroy() { super.onDestroy() timer.cancel() diff --git a/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt index 3e592f3..a9144a0 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt @@ -5,8 +5,11 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.lifecycle.ViewModelProvider import com.casic.br.ar.app.R import com.casic.br.ar.app.databinding.ActivitySelectCheckModeBinding +import com.casic.br.ar.app.utils.RuntimeCache +import com.casic.br.ar.app.vm.ConfigViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -17,6 +20,7 @@ class SelectCheckModeActivity : KotlinBaseActivity() { private val marginOffset by lazy { 25.dp2px(this) } + private lateinit var configViewModel: ConfigViewModel private lateinit var itemAdapter: NormalRecyclerAdapter override fun initEvent() { @@ -32,6 +36,14 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { + configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] + configViewModel.getDictionaryByCode(this, "pitfallSmallType") + configViewModel.dictionary.observe(this) { + if (it.code == 200) { + RuntimeCache.subDicModels = it.data + } + } + itemAdapter = object : NormalRecyclerAdapter( R.layout.item_main_rv_l, arrayListOf("检查模式", "自由模式") ) { diff --git a/app/src/main/java/com/casic/br/ar/app/widgets/AddHiddenTroubleDialog.kt b/app/src/main/java/com/casic/br/ar/app/widgets/AddHiddenTroubleDialog.kt new file mode 100644 index 0000000..6561cf8 --- /dev/null +++ b/app/src/main/java/com/casic/br/ar/app/widgets/AddHiddenTroubleDialog.kt @@ -0,0 +1,120 @@ +package com.casic.br.ar.app.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Typeface +import android.os.Bundle +import android.widget.LinearLayout +import android.widget.TextView +import com.casic.br.ar.app.R +import com.casic.br.ar.app.databinding.DialogAddHiddenTroubleBinding +import com.casic.br.ar.app.model.DictionaryModel +import com.casic.br.ar.app.utils.RuntimeCache +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.dp2px +import com.pengxh.kt.lite.extensions.initDialogLayoutParams + +class AddHiddenTroubleDialog(context: Context) : Dialog(context) { + + private val binding: DialogAddHiddenTroubleBinding by binding() + private val marginOffset by lazy { 5.dp2px(context) } + private lateinit var listener: OnDialogButtonClickListener + private lateinit var mainDictionary: DictionaryModel.DataModel + private lateinit var subDictionary: DictionaryModel.DataModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + initDialogLayoutParams(1f) + + val mainTypeAdapter = object : NormalRecyclerAdapter( + R.layout.item_add_trouble_dialog_rv_l, RuntimeCache.mainDicModels + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: DictionaryModel.DataModel + ) { + viewHolder.setText(R.id.itemTextView, item.name) + viewHolder.getView(R.id.itemRootView) + .setOnFocusChangeListener { v, hasFocus -> + val textView = v.findViewById(R.id.itemTextView) + if (hasFocus) { + textView.typeface = Typeface.DEFAULT_BOLD + v.setBackgroundResource(R.drawable.dialog_view_item_border_selected) + } else { + textView.typeface = Typeface.DEFAULT + v.setBackgroundResource(R.drawable.dialog_view_item_border) + } + } + } + } + binding.mainRecyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, 0, marginOffset, 0) + ) + binding.mainRecyclerView.adapter = mainTypeAdapter + mainTypeAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: DictionaryModel.DataModel) { + mainDictionary = t + } + }) + + val subTypeAdapter = object : NormalRecyclerAdapter( + R.layout.item_add_trouble_dialog_rv_l, RuntimeCache.subDicModels + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: DictionaryModel.DataModel + ) { + viewHolder.setText(R.id.itemTextView, item.name) + viewHolder.getView(R.id.itemRootView) + .setOnFocusChangeListener { v, hasFocus -> + val textView = v.findViewById(R.id.itemTextView) + if (hasFocus) { + textView.typeface = Typeface.DEFAULT_BOLD + v.setBackgroundResource(R.drawable.dialog_view_item_border_selected) + } else { + textView.typeface = Typeface.DEFAULT + v.setBackgroundResource(R.drawable.dialog_view_item_border) + } + } + } + } + binding.subRecyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, 0, marginOffset, 0) + ) + binding.subRecyclerView.adapter = subTypeAdapter + subTypeAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: DictionaryModel.DataModel) { + subDictionary = t + } + }) + + binding.checkPassButton.setOnClickListener { + listener.onConfirmClick( + mainDictionary, + subDictionary, + binding.hiddenTroubleNameView.text.toString(), + binding.hiddenTroubleContentView.text.toString() + ) + dismiss() + } + + binding.cancelButton.setOnClickListener { dismiss() } + } + + fun initDialogContentView(listener: OnDialogButtonClickListener): AddHiddenTroubleDialog { + this.listener = listener + return this + } + + interface OnDialogButtonClickListener { + fun onConfirmClick( + mainType: DictionaryModel.DataModel, subType: DictionaryModel.DataModel, + troubleName: String, troubleContent: String + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt index 8833949..942e682 100644 --- a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt +++ b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt @@ -4,9 +4,9 @@ import android.content.Context import android.graphics.Bitmap import android.os.Bundle +import com.casic.br.ar.app.callback.OnImageCompressListener import com.casic.br.ar.app.databinding.DialogDetectResultBinding import com.casic.br.ar.app.extensions.compressImage -import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.createImageFileDir import com.pengxh.kt.lite.extensions.initDialogLayoutParams diff --git a/app/src/main/res/drawable/dialog_view_item_border.xml b/app/src/main/res/drawable/dialog_view_item_border.xml new file mode 100644 index 0000000..ee5fc50 --- /dev/null +++ b/app/src/main/res/drawable/dialog_view_item_border.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/dialog_view_item_border_selected.xml b/app/src/main/res/drawable/dialog_view_item_border_selected.xml new file mode 100644 index 0000000..3e415f7 --- /dev/null +++ b/app/src/main/res/drawable/dialog_view_item_border_selected.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt index 4dfe42d..eb0d11c 100644 --- a/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/ar/app/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.br.operationsite.test.callback +package com.casic.br.ar.app.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt index f71d6ab..b0c55c9 100644 --- a/app/src/main/java/com/casic/br/ar/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/ar/app/extensions/String.kt @@ -1,8 +1,9 @@ package com.casic.br.ar.app.extensions import android.content.Context +import com.casic.br.ar.app.callback.OnImageCompressListener import com.casic.br.ar.app.utils.LocaleConstant -import com.casic.br.operationsite.test.callback.OnImageCompressListener +import com.casic.br.ar.app.utils.RuntimeCache import com.google.gson.JsonParser import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues @@ -57,6 +58,15 @@ return scene } +fun String.getSceneCodeByName(): String { + for (scene in RuntimeCache.sceneDicModels) { + if (scene.name == this) { + return scene.value + } + } + return "" +} + fun String.isInScene(scene: String): Boolean { when (scene) { "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( diff --git a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt index f717f82..79e11c7 100644 --- a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt +++ b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt @@ -3,11 +3,9 @@ import com.casic.br.ar.app.model.DictionaryModel object RuntimeCache { - //TODO 未赋值 - var scene = "" - var sceneName = "" var inspectionId = "" var mainDicModels: MutableList = ArrayList() + var subDicModels: MutableList = ArrayList() var sceneDicModels: MutableList = ArrayList() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt index 6a9e240..c1f9bb8 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt @@ -7,9 +7,8 @@ import android.widget.ArrayAdapter import androidx.lifecycle.ViewModelProvider import com.casic.br.ar.app.databinding.ActivityAddHiddenTroubleBinding -import com.casic.br.ar.app.model.DictionaryModel +import com.casic.br.ar.app.extensions.getSceneCodeByName import com.casic.br.ar.app.utils.RuntimeCache -import com.casic.br.ar.app.vm.ConfigViewModel import com.casic.br.ar.app.vm.HiddenTroubleViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show @@ -20,10 +19,7 @@ private val kTag = "AddHiddenTroubleActivity" private val imagePaths = ArrayList>() - private lateinit var configViewModel: ConfigViewModel private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel - private var mainDicModels: MutableList = ArrayList() - private var subDicModels: MutableList = ArrayList() private var selectedMainTypePosition = 0 private var selectedSubTypePosition = 0 @@ -48,30 +44,21 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - //转为实体类 - mainDicModels = RuntimeCache.mainDicModels val mainTypeArray = ArrayList() - mainDicModels.forEach { + RuntimeCache.mainDicModels.forEach { mainTypeArray.add(it.name) } val mainTypeAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mainTypeArray) binding.mainTypeSpinner.adapter = mainTypeAdapter - configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] - configViewModel.getDictionaryByCode(this, "pitfallSmallType") - configViewModel.dictionary.observe(this) { - if (it.code == 200) { - subDicModels = it.data - val subTypeArray = ArrayList() - subDicModels.forEach { dic -> - subTypeArray.add(dic.name) - } - val subTypeAdapter = ArrayAdapter( - this, android.R.layout.simple_list_item_1, subTypeArray - ) - binding.subTypeSpinner.adapter = subTypeAdapter - } + val subTypeArray = ArrayList() + RuntimeCache.subDicModels.forEach { dic -> + subTypeArray.add(dic.name) } + val subTypeAdapter = ArrayAdapter( + this, android.R.layout.simple_list_item_1, subTypeArray + ) + binding.subTypeSpinner.adapter = subTypeAdapter hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java] hiddenTroubleViewModel.addTroubleResult.observe(this) { @@ -116,14 +103,14 @@ selectedMainTypePosition.toString(), selectedSubTypePosition.toString(), RuntimeCache.sceneName, - subDicModels[selectedMainTypePosition].name, + RuntimeCache.subDicModels[selectedMainTypePosition].name, "", "", binding.hiddenTroubleContentView.text.toString(), - RuntimeCache.scene, + RuntimeCache.sceneName.getSceneCodeByName(), RuntimeCache.inspectionId, binding.hiddenTroubleNameView.text.toString(), - mainDicModels[selectedMainTypePosition].name, + RuntimeCache.mainDicModels[selectedMainTypePosition].name, "", imagePaths.toTypedArray() ) diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt index 43699d7..e51c29c 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt @@ -15,6 +15,7 @@ import com.casic.br.ar.app.databinding.ActivityCheckModeBinding import com.casic.br.ar.app.extensions.convert2YoloResult import com.casic.br.ar.app.extensions.getSceneByTarget +import com.casic.br.ar.app.extensions.getSceneCodeByName import com.casic.br.ar.app.extensions.isContains import com.casic.br.ar.app.extensions.isInScene import com.casic.br.ar.app.external.INativeCallback @@ -27,8 +28,10 @@ import com.casic.br.ar.app.vm.AlarmViewModel import com.casic.br.ar.app.vm.CheckManifestViewModel import com.casic.br.ar.app.vm.ConfigViewModel +import com.casic.br.ar.app.vm.HiddenTroubleViewModel import com.casic.br.ar.app.vm.ImageFileViewModel import com.casic.br.ar.app.vm.InspectionViewModel +import com.casic.br.ar.app.widgets.AddHiddenTroubleDialog import com.casic.br.ar.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @@ -60,13 +63,14 @@ private val mat by lazy { Mat() } private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } private val detectResultDialog by lazy { DetectResultDialog(this) } + private val addHiddenTroubleDialog by lazy { AddHiddenTroubleDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private lateinit var imageFileViewModel: ImageFileViewModel private lateinit var alarmViewModel: AlarmViewModel private lateinit var checkManifestViewModel: CheckManifestViewModel + private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel private lateinit var timer: Timer - private var mainDicModels: MutableList = ArrayList() private var checkItemLinkedList = LinkedList() private var isDetectTarget = false private var alarmCode = "" @@ -116,7 +120,7 @@ configViewModel.getDictionaryByCode(context, "pitfallBigType") configViewModel.dictionary.observe(this) { if (it.code == 200) { - mainDicModels = it.data + RuntimeCache.mainDicModels = it.data } } @@ -140,22 +144,51 @@ } } + hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java] + hiddenTroubleViewModel.addTroubleResult.observe(this) { + if (it.code == 200) { + troubleCount++ + binding.troubleCountView.text = "${troubleCount}项" + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" + isConfirmedByUser = true + } + } + //队列处理清单内容 timer = Timer() timer.schedule(object : TimerTask() { override fun run() { - runOnUiThread { - binding.noCheckCountView.text = "${checkItemLinkedList.size}项" - } if (isConfirmedByUser && checkItemLinkedList.isNotEmpty()) { - isConfirmedByUser = false - //取出队列头部元素 - val headItem = checkItemLinkedList.poll() - if (headItem != null) { - val message = weakReferenceHandler.obtainMessage() - message.what = 2024091901 - message.obj = headItem.checkItem - weakReferenceHandler.sendMessage(message) + lifecycleScope.launch(Dispatchers.Main) { + if (!detectResultDialog.isShowing) { + isConfirmedByUser = false + //取出队列头部元素 + val headItem = checkItemLinkedList.poll() + if (headItem != null) { + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView( + headItem.checkItem, mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onCheckPassClick(file: File) { + checkPassCount++ + binding.checkedCountView.text = + "${checkPassCount}项" + binding.noCheckCountView.text = + "${checkItemLinkedList.size}项" + if (checkItemLinkedList.isEmpty()) { + stopCheck() + } + isConfirmedByUser = true + } + + override fun onHaveTroubleClick(file: File) { + //弹新的框 + showAddHiddenTroubleDialog() + } + }).show() + } + } + } } } } @@ -168,7 +201,6 @@ } binding.addHiddenTroubleButton.setOnClickListener { - RuntimeCache.mainDicModels = mainDicModels navigatePageTo() } @@ -534,12 +566,13 @@ } if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(target, mat, - object : DetectResultDialog.OnDialogButtonClickListener { + detectResultDialog.updateDialogContentView( + target, mat, object : DetectResultDialog.OnDialogButtonClickListener { override fun onCheckPassClick(file: File) { detectedTargetSet.add(target) checkPassCount++ binding.checkedCountView.text = "${checkPassCount}项" + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" if (checkItemLinkedList.isEmpty()) { stopCheck() } @@ -551,31 +584,7 @@ troubleCount++ binding.troubleCountView.text = "${troubleCount}项" - } - }).show() - } - } - - 2024091901 -> { - val target = msg.obj as String - if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(target, mat, - object : DetectResultDialog.OnDialogButtonClickListener { - override fun onCheckPassClick(file: File) { - checkPassCount++ - binding.checkedCountView.text = "${checkPassCount}项" - if (checkItemLinkedList.isEmpty()) { - stopCheck() - } - isConfirmedByUser = true - } - - override fun onHaveTroubleClick(file: File) { - imageFileViewModel.uploadImage(file) - - troubleCount++ - binding.troubleCountView.text = "${troubleCount}项" - isConfirmedByUser = true + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" } }).show() } @@ -584,6 +593,33 @@ return true } + private fun showAddHiddenTroubleDialog() { + addHiddenTroubleDialog.initDialogContentView(object : + AddHiddenTroubleDialog.OnDialogButtonClickListener { + override fun onConfirmClick( + mainType: DictionaryModel.DataModel, subType: DictionaryModel.DataModel, + troubleName: String, troubleContent: String + ) { + hiddenTroubleViewModel.addHiddenTrouble( + context, + mainType.value, + subType.value, + RuntimeCache.sceneName, + subType.name, + "", + "", + troubleContent, + RuntimeCache.sceneName.getSceneCodeByName(), + RuntimeCache.inspectionId, + troubleName, + mainType.name, + "", + arrayOf() + ) + } + }).show() + } + override fun onDestroy() { super.onDestroy() timer.cancel() diff --git a/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt index 3e592f3..a9144a0 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/SelectCheckModeActivity.kt @@ -5,8 +5,11 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView +import androidx.lifecycle.ViewModelProvider import com.casic.br.ar.app.R import com.casic.br.ar.app.databinding.ActivitySelectCheckModeBinding +import com.casic.br.ar.app.utils.RuntimeCache +import com.casic.br.ar.app.vm.ConfigViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -17,6 +20,7 @@ class SelectCheckModeActivity : KotlinBaseActivity() { private val marginOffset by lazy { 25.dp2px(this) } + private lateinit var configViewModel: ConfigViewModel private lateinit var itemAdapter: NormalRecyclerAdapter override fun initEvent() { @@ -32,6 +36,14 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { + configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] + configViewModel.getDictionaryByCode(this, "pitfallSmallType") + configViewModel.dictionary.observe(this) { + if (it.code == 200) { + RuntimeCache.subDicModels = it.data + } + } + itemAdapter = object : NormalRecyclerAdapter( R.layout.item_main_rv_l, arrayListOf("检查模式", "自由模式") ) { diff --git a/app/src/main/java/com/casic/br/ar/app/widgets/AddHiddenTroubleDialog.kt b/app/src/main/java/com/casic/br/ar/app/widgets/AddHiddenTroubleDialog.kt new file mode 100644 index 0000000..6561cf8 --- /dev/null +++ b/app/src/main/java/com/casic/br/ar/app/widgets/AddHiddenTroubleDialog.kt @@ -0,0 +1,120 @@ +package com.casic.br.ar.app.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Typeface +import android.os.Bundle +import android.widget.LinearLayout +import android.widget.TextView +import com.casic.br.ar.app.R +import com.casic.br.ar.app.databinding.DialogAddHiddenTroubleBinding +import com.casic.br.ar.app.model.DictionaryModel +import com.casic.br.ar.app.utils.RuntimeCache +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.dp2px +import com.pengxh.kt.lite.extensions.initDialogLayoutParams + +class AddHiddenTroubleDialog(context: Context) : Dialog(context) { + + private val binding: DialogAddHiddenTroubleBinding by binding() + private val marginOffset by lazy { 5.dp2px(context) } + private lateinit var listener: OnDialogButtonClickListener + private lateinit var mainDictionary: DictionaryModel.DataModel + private lateinit var subDictionary: DictionaryModel.DataModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + initDialogLayoutParams(1f) + + val mainTypeAdapter = object : NormalRecyclerAdapter( + R.layout.item_add_trouble_dialog_rv_l, RuntimeCache.mainDicModels + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: DictionaryModel.DataModel + ) { + viewHolder.setText(R.id.itemTextView, item.name) + viewHolder.getView(R.id.itemRootView) + .setOnFocusChangeListener { v, hasFocus -> + val textView = v.findViewById(R.id.itemTextView) + if (hasFocus) { + textView.typeface = Typeface.DEFAULT_BOLD + v.setBackgroundResource(R.drawable.dialog_view_item_border_selected) + } else { + textView.typeface = Typeface.DEFAULT + v.setBackgroundResource(R.drawable.dialog_view_item_border) + } + } + } + } + binding.mainRecyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, 0, marginOffset, 0) + ) + binding.mainRecyclerView.adapter = mainTypeAdapter + mainTypeAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: DictionaryModel.DataModel) { + mainDictionary = t + } + }) + + val subTypeAdapter = object : NormalRecyclerAdapter( + R.layout.item_add_trouble_dialog_rv_l, RuntimeCache.subDicModels + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: DictionaryModel.DataModel + ) { + viewHolder.setText(R.id.itemTextView, item.name) + viewHolder.getView(R.id.itemRootView) + .setOnFocusChangeListener { v, hasFocus -> + val textView = v.findViewById(R.id.itemTextView) + if (hasFocus) { + textView.typeface = Typeface.DEFAULT_BOLD + v.setBackgroundResource(R.drawable.dialog_view_item_border_selected) + } else { + textView.typeface = Typeface.DEFAULT + v.setBackgroundResource(R.drawable.dialog_view_item_border) + } + } + } + } + binding.subRecyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, 0, marginOffset, 0) + ) + binding.subRecyclerView.adapter = subTypeAdapter + subTypeAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked(position: Int, t: DictionaryModel.DataModel) { + subDictionary = t + } + }) + + binding.checkPassButton.setOnClickListener { + listener.onConfirmClick( + mainDictionary, + subDictionary, + binding.hiddenTroubleNameView.text.toString(), + binding.hiddenTroubleContentView.text.toString() + ) + dismiss() + } + + binding.cancelButton.setOnClickListener { dismiss() } + } + + fun initDialogContentView(listener: OnDialogButtonClickListener): AddHiddenTroubleDialog { + this.listener = listener + return this + } + + interface OnDialogButtonClickListener { + fun onConfirmClick( + mainType: DictionaryModel.DataModel, subType: DictionaryModel.DataModel, + troubleName: String, troubleContent: String + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt index 8833949..942e682 100644 --- a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt +++ b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt @@ -4,9 +4,9 @@ import android.content.Context import android.graphics.Bitmap import android.os.Bundle +import com.casic.br.ar.app.callback.OnImageCompressListener import com.casic.br.ar.app.databinding.DialogDetectResultBinding import com.casic.br.ar.app.extensions.compressImage -import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.createImageFileDir import com.pengxh.kt.lite.extensions.initDialogLayoutParams diff --git a/app/src/main/res/drawable/dialog_view_item_border.xml b/app/src/main/res/drawable/dialog_view_item_border.xml new file mode 100644 index 0000000..ee5fc50 --- /dev/null +++ b/app/src/main/res/drawable/dialog_view_item_border.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/dialog_view_item_border_selected.xml b/app/src/main/res/drawable/dialog_view_item_border_selected.xml new file mode 100644 index 0000000..3e415f7 --- /dev/null +++ b/app/src/main/res/drawable/dialog_view_item_border_selected.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_add_hidden_trouble.xml b/app/src/main/res/layout/dialog_add_hidden_trouble.xml new file mode 100644 index 0000000..8a39c97 --- /dev/null +++ b/app/src/main/res/layout/dialog_add_hidden_trouble.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +