diff --git a/.gitignore b/.gitignore index 294a48a..f25d5b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,7 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -/.idea/misc.xml +/.idea .DS_Store /build /captures diff --git a/.gitignore b/.gitignore index 294a48a..f25d5b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,7 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -/.idea/misc.xml +/.idea .DS_Store /build /captures diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index c09fb28..e2c683c 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -266,9 +266,9 @@ /** * 设置区域 * */ - suspend fun setVideoRegion(position: FloatArray): String { + suspend fun setVideoRegion(position: ArrayList): String { val param = JsonObject() - val typeToken = object : TypeToken() {}.type + val typeToken = object : TypeToken>() {}.type param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) val requestBody = param.toString().toRequestBody( diff --git a/.gitignore b/.gitignore index 294a48a..f25d5b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,7 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -/.idea/misc.xml +/.idea .DS_Store /build /captures diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index c09fb28..e2c683c 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -266,9 +266,9 @@ /** * 设置区域 * */ - suspend fun setVideoRegion(position: FloatArray): String { + suspend fun setVideoRegion(position: ArrayList): String { val param = JsonObject() - val typeToken = object : TypeToken() {}.type + val typeToken = object : TypeToken>() {}.type param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) val requestBody = param.toString().toRequestBody( diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index ee3e446..5a7b2af 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -68,6 +68,20 @@ const val TCP_PORT = 9000 //施工交底 - val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) - val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //作业前检测 + val START_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //劳保检测 + val START_SUPPLIES_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_VIDEO_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/.gitignore b/.gitignore index 294a48a..f25d5b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,7 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -/.idea/misc.xml +/.idea .DS_Store /build /captures diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index c09fb28..e2c683c 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -266,9 +266,9 @@ /** * 设置区域 * */ - suspend fun setVideoRegion(position: FloatArray): String { + suspend fun setVideoRegion(position: ArrayList): String { val param = JsonObject() - val typeToken = object : TypeToken() {}.type + val typeToken = object : TypeToken>() {}.type param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) val requestBody = param.toString().toRequestBody( diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index ee3e446..5a7b2af 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -68,6 +68,20 @@ const val TCP_PORT = 9000 //施工交底 - val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) - val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //作业前检测 + val START_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //劳保检测 + val START_SUPPLIES_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_VIDEO_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt index 5be0440..269677d 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -1,26 +1,34 @@ package com.casic.br.operationsite.view +import android.content.Intent import android.os.Bundle import android.os.Handler import android.os.Message import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.R import com.casic.br.operationsite.callback.OnImageCompressListener import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.extensions.initImmersionBar import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.AlarmViewModel +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.casic.br.operationsite.vm.UploadFileViewModel -import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.TitleBarView import java.io.File class ConstructionCheckActivity : KotlinBaseActivity(), @@ -33,60 +41,175 @@ private val kTag = "ConstructionCheckActivity" private val context = this private lateinit var uploadFileViewModel: UploadFileViewModel + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel + private var isConnected = false + private var isCompletedFirst = false + private var isCompletedSecond = false + private var isCompletedThird = false override fun initEvent() { + binding.connectTcpButton.setOnClickListener { + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + binding.startCheckButton.setOnClickListener { - when (binding.startCheckTextView.text) { - "开始交底" -> { - //连接TCP服务 - LoadingDialogHub.show(this, "处理中,请稍后...") - SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) - } - - "拍照确认" -> { - PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - analyticalSelectResults(first()) - } - } - - override fun onCancel() { - - } - }) - } - - "确认完交底" -> { - //发送指令 - SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) - binding.startCheckTextView.text = "开始交底" - } + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener } + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + } + + binding.captureDisclosureImageButton.setOnClickListener { + captureImage() + } + + binding.endCheckButton.setOnClickListener { + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + isCompletedFirst = true + } + + binding.startEnvCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) + constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") + } + + binding.captureEnvImageButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + captureImage() + } + + binding.endEnvCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) + } + + binding.endGasCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) + isCompletedSecond = true + } + + binding.startSuppliesCheckButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + } + + binding.startVideoCheckButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) + } + + binding.captureBlowerImageButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") + captureImage() + isCompletedThird = true + } + + binding.setVideoRegionButton.setOnClickListener { + if (!isCompletedThird) { + "请先完成劳保用品检测".show(this) + return@setOnClickListener + } + val intent = Intent(this, VideoBoundaryActivity::class.java) + intent.putExtra(Constant.INTENT_PARAM, "192.168.10.137") + videoRegionLauncher.launch(intent) + } + + binding.endAllCheckButton.setOnClickListener { + finish() } } - private fun analyticalSelectResults(result: LocalMedia) { - result.realPath.compressImage(this, object : OnImageCompressListener { - override fun onSuccess(file: File) { - uploadFileViewModel.uploadImage(context, file) - } + private val startVideoLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + Log.d(kTag, "startVideoLauncher: ") + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) + } - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) + private val videoRegionLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + Log.d(kTag, "videoRegionLauncher: ") + constructionCheckViewModel.setCurrentPhase(this, "in_operation") + } + + private fun captureImage() { + PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + first().realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + } + + override fun onCancel() { + + } + }) } override fun handleMessage(msg: Message): Boolean { - if (msg.what == 2024061801) { - //成功 - LoadingDialogHub.dismiss() - //发送指令 - SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) - binding.startCheckTextView.text = "拍照确认" - } + isConnected = msg.what == 2024061801 return true } @@ -100,10 +223,14 @@ val url = it.data.toString() if (url.isNotBlank()) { Log.d(kTag, "url: $url") - binding.startCheckTextView.text = "确认完交底" + "完成确认".show(this) } } } + + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] } override fun initViewBinding(): ActivityConstructionCheckBinding { @@ -120,6 +247,15 @@ } override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(false).init() + binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } + + override fun onRightClick() { + + } + }) } } \ No newline at end of file diff --git a/.gitignore b/.gitignore index 294a48a..f25d5b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,7 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -/.idea/misc.xml +/.idea .DS_Store /build /captures diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index c09fb28..e2c683c 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -266,9 +266,9 @@ /** * 设置区域 * */ - suspend fun setVideoRegion(position: FloatArray): String { + suspend fun setVideoRegion(position: ArrayList): String { val param = JsonObject() - val typeToken = object : TypeToken() {}.type + val typeToken = object : TypeToken>() {}.type param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) val requestBody = param.toString().toRequestBody( diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index ee3e446..5a7b2af 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -68,6 +68,20 @@ const val TCP_PORT = 9000 //施工交底 - val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) - val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //作业前检测 + val START_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //劳保检测 + val START_SUPPLIES_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_VIDEO_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt index 5be0440..269677d 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -1,26 +1,34 @@ package com.casic.br.operationsite.view +import android.content.Intent import android.os.Bundle import android.os.Handler import android.os.Message import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.R import com.casic.br.operationsite.callback.OnImageCompressListener import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.extensions.initImmersionBar import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.AlarmViewModel +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.casic.br.operationsite.vm.UploadFileViewModel -import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.TitleBarView import java.io.File class ConstructionCheckActivity : KotlinBaseActivity(), @@ -33,60 +41,175 @@ private val kTag = "ConstructionCheckActivity" private val context = this private lateinit var uploadFileViewModel: UploadFileViewModel + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel + private var isConnected = false + private var isCompletedFirst = false + private var isCompletedSecond = false + private var isCompletedThird = false override fun initEvent() { + binding.connectTcpButton.setOnClickListener { + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + binding.startCheckButton.setOnClickListener { - when (binding.startCheckTextView.text) { - "开始交底" -> { - //连接TCP服务 - LoadingDialogHub.show(this, "处理中,请稍后...") - SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) - } - - "拍照确认" -> { - PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - analyticalSelectResults(first()) - } - } - - override fun onCancel() { - - } - }) - } - - "确认完交底" -> { - //发送指令 - SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) - binding.startCheckTextView.text = "开始交底" - } + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener } + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + } + + binding.captureDisclosureImageButton.setOnClickListener { + captureImage() + } + + binding.endCheckButton.setOnClickListener { + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + isCompletedFirst = true + } + + binding.startEnvCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) + constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") + } + + binding.captureEnvImageButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + captureImage() + } + + binding.endEnvCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) + } + + binding.endGasCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) + isCompletedSecond = true + } + + binding.startSuppliesCheckButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + } + + binding.startVideoCheckButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) + } + + binding.captureBlowerImageButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") + captureImage() + isCompletedThird = true + } + + binding.setVideoRegionButton.setOnClickListener { + if (!isCompletedThird) { + "请先完成劳保用品检测".show(this) + return@setOnClickListener + } + val intent = Intent(this, VideoBoundaryActivity::class.java) + intent.putExtra(Constant.INTENT_PARAM, "192.168.10.137") + videoRegionLauncher.launch(intent) + } + + binding.endAllCheckButton.setOnClickListener { + finish() } } - private fun analyticalSelectResults(result: LocalMedia) { - result.realPath.compressImage(this, object : OnImageCompressListener { - override fun onSuccess(file: File) { - uploadFileViewModel.uploadImage(context, file) - } + private val startVideoLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + Log.d(kTag, "startVideoLauncher: ") + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) + } - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) + private val videoRegionLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + Log.d(kTag, "videoRegionLauncher: ") + constructionCheckViewModel.setCurrentPhase(this, "in_operation") + } + + private fun captureImage() { + PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + first().realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + } + + override fun onCancel() { + + } + }) } override fun handleMessage(msg: Message): Boolean { - if (msg.what == 2024061801) { - //成功 - LoadingDialogHub.dismiss() - //发送指令 - SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) - binding.startCheckTextView.text = "拍照确认" - } + isConnected = msg.what == 2024061801 return true } @@ -100,10 +223,14 @@ val url = it.data.toString() if (url.isNotBlank()) { Log.d(kTag, "url: $url") - binding.startCheckTextView.text = "确认完交底" + "完成确认".show(this) } } } + + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] } override fun initViewBinding(): ActivityConstructionCheckBinding { @@ -120,6 +247,15 @@ } override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(false).init() + binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } + + override fun onRightClick() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt index 89454cf..aeaea64 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.operationsite.view +import android.content.Intent import android.graphics.Bitmap import android.os.Bundle import android.view.ViewGroup @@ -82,6 +83,8 @@ binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { override fun onLeftClick() { + val intent = Intent() + setResult(RESULT_OK, intent) finish() } diff --git a/.gitignore b/.gitignore index 294a48a..f25d5b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,7 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -/.idea/misc.xml +/.idea .DS_Store /build /captures diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index c09fb28..e2c683c 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -266,9 +266,9 @@ /** * 设置区域 * */ - suspend fun setVideoRegion(position: FloatArray): String { + suspend fun setVideoRegion(position: ArrayList): String { val param = JsonObject() - val typeToken = object : TypeToken() {}.type + val typeToken = object : TypeToken>() {}.type param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) val requestBody = param.toString().toRequestBody( diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index ee3e446..5a7b2af 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -68,6 +68,20 @@ const val TCP_PORT = 9000 //施工交底 - val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) - val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //作业前检测 + val START_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //劳保检测 + val START_SUPPLIES_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_VIDEO_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt index 5be0440..269677d 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -1,26 +1,34 @@ package com.casic.br.operationsite.view +import android.content.Intent import android.os.Bundle import android.os.Handler import android.os.Message import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.R import com.casic.br.operationsite.callback.OnImageCompressListener import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.extensions.initImmersionBar import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.AlarmViewModel +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.casic.br.operationsite.vm.UploadFileViewModel -import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.TitleBarView import java.io.File class ConstructionCheckActivity : KotlinBaseActivity(), @@ -33,60 +41,175 @@ private val kTag = "ConstructionCheckActivity" private val context = this private lateinit var uploadFileViewModel: UploadFileViewModel + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel + private var isConnected = false + private var isCompletedFirst = false + private var isCompletedSecond = false + private var isCompletedThird = false override fun initEvent() { + binding.connectTcpButton.setOnClickListener { + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + binding.startCheckButton.setOnClickListener { - when (binding.startCheckTextView.text) { - "开始交底" -> { - //连接TCP服务 - LoadingDialogHub.show(this, "处理中,请稍后...") - SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) - } - - "拍照确认" -> { - PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - analyticalSelectResults(first()) - } - } - - override fun onCancel() { - - } - }) - } - - "确认完交底" -> { - //发送指令 - SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) - binding.startCheckTextView.text = "开始交底" - } + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener } + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + } + + binding.captureDisclosureImageButton.setOnClickListener { + captureImage() + } + + binding.endCheckButton.setOnClickListener { + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + isCompletedFirst = true + } + + binding.startEnvCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) + constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") + } + + binding.captureEnvImageButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + captureImage() + } + + binding.endEnvCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) + } + + binding.endGasCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) + isCompletedSecond = true + } + + binding.startSuppliesCheckButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + } + + binding.startVideoCheckButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) + } + + binding.captureBlowerImageButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") + captureImage() + isCompletedThird = true + } + + binding.setVideoRegionButton.setOnClickListener { + if (!isCompletedThird) { + "请先完成劳保用品检测".show(this) + return@setOnClickListener + } + val intent = Intent(this, VideoBoundaryActivity::class.java) + intent.putExtra(Constant.INTENT_PARAM, "192.168.10.137") + videoRegionLauncher.launch(intent) + } + + binding.endAllCheckButton.setOnClickListener { + finish() } } - private fun analyticalSelectResults(result: LocalMedia) { - result.realPath.compressImage(this, object : OnImageCompressListener { - override fun onSuccess(file: File) { - uploadFileViewModel.uploadImage(context, file) - } + private val startVideoLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + Log.d(kTag, "startVideoLauncher: ") + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) + } - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) + private val videoRegionLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + Log.d(kTag, "videoRegionLauncher: ") + constructionCheckViewModel.setCurrentPhase(this, "in_operation") + } + + private fun captureImage() { + PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + first().realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + } + + override fun onCancel() { + + } + }) } override fun handleMessage(msg: Message): Boolean { - if (msg.what == 2024061801) { - //成功 - LoadingDialogHub.dismiss() - //发送指令 - SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) - binding.startCheckTextView.text = "拍照确认" - } + isConnected = msg.what == 2024061801 return true } @@ -100,10 +223,14 @@ val url = it.data.toString() if (url.isNotBlank()) { Log.d(kTag, "url: $url") - binding.startCheckTextView.text = "确认完交底" + "完成确认".show(this) } } } + + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] } override fun initViewBinding(): ActivityConstructionCheckBinding { @@ -120,6 +247,15 @@ } override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(false).init() + binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } + + override fun onRightClick() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt index 89454cf..aeaea64 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.operationsite.view +import android.content.Intent import android.graphics.Bitmap import android.os.Bundle import android.view.ViewGroup @@ -82,6 +83,8 @@ binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { override fun onLeftClick() { + val intent = Intent() + setResult(RESULT_OK, intent) finish() } diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt index 426f3fd..d6c48dc 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -1,96 +1,52 @@ package com.casic.br.operationsite.view -import android.content.Context -import android.net.ConnectivityManager -import android.net.Network -import android.net.NetworkCapabilities -import android.net.NetworkRequest +import android.content.Intent import android.net.Uri -import android.net.wifi.WifiManager -import android.net.wifi.WifiNetworkSpecifier -import android.os.Build import android.os.Bundle import android.util.Log import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.DeviceType -import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.RuntimeCache -import com.casic.br.operationsite.vm.RegionViewModel +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.getScreenWidth -import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.TitleBarView class VideoBoundaryActivity : KotlinBaseActivity() { private val kTag = "VideoBoundaryActivity" private val context = this@VideoBoundaryActivity - private val wifiManager by lazy { getSystemService() } - private val wifiSsids = ArrayList() - private val cameraItems = ArrayList() - private var connectivityManager: ConnectivityManager? = null private var isStarted = false - private lateinit var regionViewModel: RegionViewModel + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel + private lateinit var cameraAddresses: String + + override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + + cameraAddresses = intent.getStringExtra(Constant.INTENT_PARAM) as String + + val params = binding.fragmentContainer.layoutParams + params.width = getScreenWidth() + params.height = ((9 / 16f) * params.width).toInt() + binding.fragmentContainer.layoutParams = params + + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] + constructionCheckViewModel.postResult.observe(this) { + if (it.code == 200) { + "区域配置成功".show(this) + val intent = Intent() + setResult(RESULT_OK, intent) + finish() + } + } + } override fun initEvent() { - binding.titleInclude.leftBackView.setOnClickListener { finish() } - - val bottomActionSheet = BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(cameraItems) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - binding.configSelectView.text = cameraItems[position] - //切换摄像头的时候需要重新读取RTSP流 - binding.videoSurfaceView.stopPlayback() - binding.videoSurfaceView.clearFocus() - isStarted = false - binding.videoSurfaceView.setVideoURI( - Uri.parse("rtsp://${binding.configSelectView.text}:554/live/site") - ) - } - }).build() - binding.configSelectView.setOnClickListener { bottomActionSheet.show() } - - binding.netSelectView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(wifiSsids) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - binding.netSelectView.text = wifiSsids[position] - - //连接wifi - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - val specifier = WifiNetworkSpecifier.Builder() - .setSsid(wifiSsids[position]) - .setWpa2Passphrase(LocaleConstant.WIFI_PASSWORD) - .build() - - val request = NetworkRequest.Builder() - .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) - .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .setNetworkSpecifier(specifier) - .build() - - connectivityManager = context.getSystemService( - Context.CONNECTIVITY_SERVICE - ) as ConnectivityManager - connectivityManager?.requestNetwork(request, networkCallback) - } - } - }).build().show() - } - binding.startRtspButton.setOnClickListener { if (isStarted) { binding.videoSurfaceView.stopPlayback() @@ -100,7 +56,8 @@ } else { //播放RTSP流 binding.videoSurfaceView.setVideoURI( - Uri.parse("rtsp://${binding.configSelectView.text}:554/live/site") + //rtsp://admin:admin@192.168.10.137:554/h264/ch1/main/av_stream + Uri.parse("rtsp://admin:admin${cameraAddresses}:554/h264/ch1/main/av_stream") ) } } @@ -113,42 +70,10 @@ } binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedRegion() + val region = binding.regionView.getConfirmedPoints() Log.d(kTag, region.toJson()) -// regionViewModel.postRegion(region) - } - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - val params = binding.fragmentContainer.layoutParams - params.width = getScreenWidth() - params.height = ((9 / 16f) * params.width).toInt() - binding.fragmentContainer.layoutParams = params - - RuntimeCache.deviceModels.forEach { - if (it.deviceType == DeviceType.CAMERA) { - cameraItems.add(it.host) - } - } - binding.configSelectView.text = cameraItems[0] - - //获取wifi列表 - wifiSsids.clear() - wifiManager?.scanResults?.forEach { res -> - //只要YTJ-010002 - if (res.SSID == "YTJ-010002") { - wifiSsids.add(res.SSID) - } - } - - regionViewModel = ViewModelProvider(this)[RegionViewModel::class.java] - regionViewModel.postResult.observe(this) { - if (it.code == 200) { - "区域配置成功".show(this) - finish() - } + constructionCheckViewModel.setVideoRegion(this, region) } } @@ -162,29 +87,19 @@ override fun setupTopBarLayout() { binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } - binding.titleInclude.titleView.text = "摄像头区域配置" - binding.titleInclude.rightOptionView.text = "重画" - binding.titleInclude.rightOptionView.setOnClickListener { - binding.regionView.clearRoutePath() - } - } + override fun onRightClick() { - private val networkCallback = object : ConnectivityManager.NetworkCallback() { - override fun onAvailable(network: Network) { - super.onAvailable(network) - connectivityManager?.bindProcessToNetwork(network) - } - - override fun onUnavailable() { - - } + } + }) } override fun onDestroy() { super.onDestroy() - connectivityManager?.bindProcessToNetwork(null) - connectivityManager?.unregisterNetworkCallback(networkCallback) binding.videoSurfaceView.suspend() } } \ No newline at end of file diff --git a/.gitignore b/.gitignore index 294a48a..f25d5b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,7 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -/.idea/misc.xml +/.idea .DS_Store /build /captures diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index c09fb28..e2c683c 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -266,9 +266,9 @@ /** * 设置区域 * */ - suspend fun setVideoRegion(position: FloatArray): String { + suspend fun setVideoRegion(position: ArrayList): String { val param = JsonObject() - val typeToken = object : TypeToken() {}.type + val typeToken = object : TypeToken>() {}.type param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) val requestBody = param.toString().toRequestBody( diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index ee3e446..5a7b2af 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -68,6 +68,20 @@ const val TCP_PORT = 9000 //施工交底 - val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) - val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //作业前检测 + val START_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //劳保检测 + val START_SUPPLIES_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_VIDEO_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt index 5be0440..269677d 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -1,26 +1,34 @@ package com.casic.br.operationsite.view +import android.content.Intent import android.os.Bundle import android.os.Handler import android.os.Message import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.R import com.casic.br.operationsite.callback.OnImageCompressListener import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.extensions.initImmersionBar import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.AlarmViewModel +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.casic.br.operationsite.vm.UploadFileViewModel -import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.TitleBarView import java.io.File class ConstructionCheckActivity : KotlinBaseActivity(), @@ -33,60 +41,175 @@ private val kTag = "ConstructionCheckActivity" private val context = this private lateinit var uploadFileViewModel: UploadFileViewModel + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel + private var isConnected = false + private var isCompletedFirst = false + private var isCompletedSecond = false + private var isCompletedThird = false override fun initEvent() { + binding.connectTcpButton.setOnClickListener { + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + binding.startCheckButton.setOnClickListener { - when (binding.startCheckTextView.text) { - "开始交底" -> { - //连接TCP服务 - LoadingDialogHub.show(this, "处理中,请稍后...") - SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) - } - - "拍照确认" -> { - PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - analyticalSelectResults(first()) - } - } - - override fun onCancel() { - - } - }) - } - - "确认完交底" -> { - //发送指令 - SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) - binding.startCheckTextView.text = "开始交底" - } + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener } + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + } + + binding.captureDisclosureImageButton.setOnClickListener { + captureImage() + } + + binding.endCheckButton.setOnClickListener { + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + isCompletedFirst = true + } + + binding.startEnvCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) + constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") + } + + binding.captureEnvImageButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + captureImage() + } + + binding.endEnvCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) + } + + binding.endGasCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) + isCompletedSecond = true + } + + binding.startSuppliesCheckButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + } + + binding.startVideoCheckButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) + } + + binding.captureBlowerImageButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") + captureImage() + isCompletedThird = true + } + + binding.setVideoRegionButton.setOnClickListener { + if (!isCompletedThird) { + "请先完成劳保用品检测".show(this) + return@setOnClickListener + } + val intent = Intent(this, VideoBoundaryActivity::class.java) + intent.putExtra(Constant.INTENT_PARAM, "192.168.10.137") + videoRegionLauncher.launch(intent) + } + + binding.endAllCheckButton.setOnClickListener { + finish() } } - private fun analyticalSelectResults(result: LocalMedia) { - result.realPath.compressImage(this, object : OnImageCompressListener { - override fun onSuccess(file: File) { - uploadFileViewModel.uploadImage(context, file) - } + private val startVideoLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + Log.d(kTag, "startVideoLauncher: ") + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) + } - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) + private val videoRegionLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + Log.d(kTag, "videoRegionLauncher: ") + constructionCheckViewModel.setCurrentPhase(this, "in_operation") + } + + private fun captureImage() { + PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + first().realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + } + + override fun onCancel() { + + } + }) } override fun handleMessage(msg: Message): Boolean { - if (msg.what == 2024061801) { - //成功 - LoadingDialogHub.dismiss() - //发送指令 - SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) - binding.startCheckTextView.text = "拍照确认" - } + isConnected = msg.what == 2024061801 return true } @@ -100,10 +223,14 @@ val url = it.data.toString() if (url.isNotBlank()) { Log.d(kTag, "url: $url") - binding.startCheckTextView.text = "确认完交底" + "完成确认".show(this) } } } + + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] } override fun initViewBinding(): ActivityConstructionCheckBinding { @@ -120,6 +247,15 @@ } override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(false).init() + binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } + + override fun onRightClick() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt index 89454cf..aeaea64 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.operationsite.view +import android.content.Intent import android.graphics.Bitmap import android.os.Bundle import android.view.ViewGroup @@ -82,6 +83,8 @@ binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { override fun onLeftClick() { + val intent = Intent() + setResult(RESULT_OK, intent) finish() } diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt index 426f3fd..d6c48dc 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -1,96 +1,52 @@ package com.casic.br.operationsite.view -import android.content.Context -import android.net.ConnectivityManager -import android.net.Network -import android.net.NetworkCapabilities -import android.net.NetworkRequest +import android.content.Intent import android.net.Uri -import android.net.wifi.WifiManager -import android.net.wifi.WifiNetworkSpecifier -import android.os.Build import android.os.Bundle import android.util.Log import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.DeviceType -import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.RuntimeCache -import com.casic.br.operationsite.vm.RegionViewModel +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.getScreenWidth -import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.TitleBarView class VideoBoundaryActivity : KotlinBaseActivity() { private val kTag = "VideoBoundaryActivity" private val context = this@VideoBoundaryActivity - private val wifiManager by lazy { getSystemService() } - private val wifiSsids = ArrayList() - private val cameraItems = ArrayList() - private var connectivityManager: ConnectivityManager? = null private var isStarted = false - private lateinit var regionViewModel: RegionViewModel + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel + private lateinit var cameraAddresses: String + + override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + + cameraAddresses = intent.getStringExtra(Constant.INTENT_PARAM) as String + + val params = binding.fragmentContainer.layoutParams + params.width = getScreenWidth() + params.height = ((9 / 16f) * params.width).toInt() + binding.fragmentContainer.layoutParams = params + + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] + constructionCheckViewModel.postResult.observe(this) { + if (it.code == 200) { + "区域配置成功".show(this) + val intent = Intent() + setResult(RESULT_OK, intent) + finish() + } + } + } override fun initEvent() { - binding.titleInclude.leftBackView.setOnClickListener { finish() } - - val bottomActionSheet = BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(cameraItems) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - binding.configSelectView.text = cameraItems[position] - //切换摄像头的时候需要重新读取RTSP流 - binding.videoSurfaceView.stopPlayback() - binding.videoSurfaceView.clearFocus() - isStarted = false - binding.videoSurfaceView.setVideoURI( - Uri.parse("rtsp://${binding.configSelectView.text}:554/live/site") - ) - } - }).build() - binding.configSelectView.setOnClickListener { bottomActionSheet.show() } - - binding.netSelectView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(wifiSsids) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - binding.netSelectView.text = wifiSsids[position] - - //连接wifi - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - val specifier = WifiNetworkSpecifier.Builder() - .setSsid(wifiSsids[position]) - .setWpa2Passphrase(LocaleConstant.WIFI_PASSWORD) - .build() - - val request = NetworkRequest.Builder() - .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) - .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .setNetworkSpecifier(specifier) - .build() - - connectivityManager = context.getSystemService( - Context.CONNECTIVITY_SERVICE - ) as ConnectivityManager - connectivityManager?.requestNetwork(request, networkCallback) - } - } - }).build().show() - } - binding.startRtspButton.setOnClickListener { if (isStarted) { binding.videoSurfaceView.stopPlayback() @@ -100,7 +56,8 @@ } else { //播放RTSP流 binding.videoSurfaceView.setVideoURI( - Uri.parse("rtsp://${binding.configSelectView.text}:554/live/site") + //rtsp://admin:admin@192.168.10.137:554/h264/ch1/main/av_stream + Uri.parse("rtsp://admin:admin${cameraAddresses}:554/h264/ch1/main/av_stream") ) } } @@ -113,42 +70,10 @@ } binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedRegion() + val region = binding.regionView.getConfirmedPoints() Log.d(kTag, region.toJson()) -// regionViewModel.postRegion(region) - } - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - val params = binding.fragmentContainer.layoutParams - params.width = getScreenWidth() - params.height = ((9 / 16f) * params.width).toInt() - binding.fragmentContainer.layoutParams = params - - RuntimeCache.deviceModels.forEach { - if (it.deviceType == DeviceType.CAMERA) { - cameraItems.add(it.host) - } - } - binding.configSelectView.text = cameraItems[0] - - //获取wifi列表 - wifiSsids.clear() - wifiManager?.scanResults?.forEach { res -> - //只要YTJ-010002 - if (res.SSID == "YTJ-010002") { - wifiSsids.add(res.SSID) - } - } - - regionViewModel = ViewModelProvider(this)[RegionViewModel::class.java] - regionViewModel.postResult.observe(this) { - if (it.code == 200) { - "区域配置成功".show(this) - finish() - } + constructionCheckViewModel.setVideoRegion(this, region) } } @@ -162,29 +87,19 @@ override fun setupTopBarLayout() { binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } - binding.titleInclude.titleView.text = "摄像头区域配置" - binding.titleInclude.rightOptionView.text = "重画" - binding.titleInclude.rightOptionView.setOnClickListener { - binding.regionView.clearRoutePath() - } - } + override fun onRightClick() { - private val networkCallback = object : ConnectivityManager.NetworkCallback() { - override fun onAvailable(network: Network) { - super.onAvailable(network) - connectivityManager?.bindProcessToNetwork(network) - } - - override fun onUnavailable() { - - } + } + }) } override fun onDestroy() { super.onDestroy() - connectivityManager?.bindProcessToNetwork(null) - connectivityManager?.unregisterNetworkCallback(networkCallback) binding.videoSurfaceView.suspend() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 9575c82..f92b514 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -6,7 +6,6 @@ import com.casic.br.operationsite.extensions.getResponseMessage import com.casic.br.operationsite.model.AlarmDetailModel import com.casic.br.operationsite.model.AlarmListModel -import com.casic.br.operationsite.model.CommonResultModel import com.casic.br.operationsite.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -14,7 +13,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.LoadState -import org.json.JSONObject class AlarmViewModel : BaseViewModel() { @@ -65,43 +63,33 @@ it.printStackTrace() }) - fun getAlarmState(context: Context) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getAlarmState() - when (response.getResponseCode()) { - 200 -> { - alarmState.value = JSONObject(response).getString("message") - loadState.value = LoadState.Success - } - - else -> { - loadState.value = LoadState.Fail - response.getResponseMessage().show(context) - } - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) - fun changeAlarmState(context: Context, deviceIp: String, state: String) = launch({ - loadState.value = LoadState.Loading val response = RetrofitServiceManager.changeAlarmState(state) when (response.getResponseCode()) { 200 -> { - gson.fromJson( - response, object : TypeToken() {}.type - ) - loadState.value = LoadState.Success + } else -> { - loadState.value = LoadState.Fail response.getResponseMessage().show(context) } } }, { - loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getAlarmState(context: Context) = launch({ + val response = RetrofitServiceManager.getAlarmState() + when (response.getResponseCode()) { + 200 -> { + + } + + else -> { + response.getResponseMessage().show(context) + } + } + }, { it.printStackTrace() }) } \ No newline at end of file diff --git a/.gitignore b/.gitignore index 294a48a..f25d5b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,7 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -/.idea/misc.xml +/.idea .DS_Store /build /captures diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index c09fb28..e2c683c 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -266,9 +266,9 @@ /** * 设置区域 * */ - suspend fun setVideoRegion(position: FloatArray): String { + suspend fun setVideoRegion(position: ArrayList): String { val param = JsonObject() - val typeToken = object : TypeToken() {}.type + val typeToken = object : TypeToken>() {}.type param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) val requestBody = param.toString().toRequestBody( diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index ee3e446..5a7b2af 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -68,6 +68,20 @@ const val TCP_PORT = 9000 //施工交底 - val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) - val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //作业前检测 + val START_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //劳保检测 + val START_SUPPLIES_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_VIDEO_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt index 5be0440..269677d 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -1,26 +1,34 @@ package com.casic.br.operationsite.view +import android.content.Intent import android.os.Bundle import android.os.Handler import android.os.Message import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.R import com.casic.br.operationsite.callback.OnImageCompressListener import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.extensions.initImmersionBar import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.AlarmViewModel +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.casic.br.operationsite.vm.UploadFileViewModel -import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.TitleBarView import java.io.File class ConstructionCheckActivity : KotlinBaseActivity(), @@ -33,60 +41,175 @@ private val kTag = "ConstructionCheckActivity" private val context = this private lateinit var uploadFileViewModel: UploadFileViewModel + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel + private var isConnected = false + private var isCompletedFirst = false + private var isCompletedSecond = false + private var isCompletedThird = false override fun initEvent() { + binding.connectTcpButton.setOnClickListener { + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + binding.startCheckButton.setOnClickListener { - when (binding.startCheckTextView.text) { - "开始交底" -> { - //连接TCP服务 - LoadingDialogHub.show(this, "处理中,请稍后...") - SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) - } - - "拍照确认" -> { - PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - analyticalSelectResults(first()) - } - } - - override fun onCancel() { - - } - }) - } - - "确认完交底" -> { - //发送指令 - SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) - binding.startCheckTextView.text = "开始交底" - } + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener } + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + } + + binding.captureDisclosureImageButton.setOnClickListener { + captureImage() + } + + binding.endCheckButton.setOnClickListener { + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + isCompletedFirst = true + } + + binding.startEnvCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) + constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") + } + + binding.captureEnvImageButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + captureImage() + } + + binding.endEnvCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) + } + + binding.endGasCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) + isCompletedSecond = true + } + + binding.startSuppliesCheckButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + } + + binding.startVideoCheckButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) + } + + binding.captureBlowerImageButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") + captureImage() + isCompletedThird = true + } + + binding.setVideoRegionButton.setOnClickListener { + if (!isCompletedThird) { + "请先完成劳保用品检测".show(this) + return@setOnClickListener + } + val intent = Intent(this, VideoBoundaryActivity::class.java) + intent.putExtra(Constant.INTENT_PARAM, "192.168.10.137") + videoRegionLauncher.launch(intent) + } + + binding.endAllCheckButton.setOnClickListener { + finish() } } - private fun analyticalSelectResults(result: LocalMedia) { - result.realPath.compressImage(this, object : OnImageCompressListener { - override fun onSuccess(file: File) { - uploadFileViewModel.uploadImage(context, file) - } + private val startVideoLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + Log.d(kTag, "startVideoLauncher: ") + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) + } - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) + private val videoRegionLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + Log.d(kTag, "videoRegionLauncher: ") + constructionCheckViewModel.setCurrentPhase(this, "in_operation") + } + + private fun captureImage() { + PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + first().realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + } + + override fun onCancel() { + + } + }) } override fun handleMessage(msg: Message): Boolean { - if (msg.what == 2024061801) { - //成功 - LoadingDialogHub.dismiss() - //发送指令 - SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) - binding.startCheckTextView.text = "拍照确认" - } + isConnected = msg.what == 2024061801 return true } @@ -100,10 +223,14 @@ val url = it.data.toString() if (url.isNotBlank()) { Log.d(kTag, "url: $url") - binding.startCheckTextView.text = "确认完交底" + "完成确认".show(this) } } } + + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] } override fun initViewBinding(): ActivityConstructionCheckBinding { @@ -120,6 +247,15 @@ } override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(false).init() + binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } + + override fun onRightClick() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt index 89454cf..aeaea64 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.operationsite.view +import android.content.Intent import android.graphics.Bitmap import android.os.Bundle import android.view.ViewGroup @@ -82,6 +83,8 @@ binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { override fun onLeftClick() { + val intent = Intent() + setResult(RESULT_OK, intent) finish() } diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt index 426f3fd..d6c48dc 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -1,96 +1,52 @@ package com.casic.br.operationsite.view -import android.content.Context -import android.net.ConnectivityManager -import android.net.Network -import android.net.NetworkCapabilities -import android.net.NetworkRequest +import android.content.Intent import android.net.Uri -import android.net.wifi.WifiManager -import android.net.wifi.WifiNetworkSpecifier -import android.os.Build import android.os.Bundle import android.util.Log import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.DeviceType -import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.RuntimeCache -import com.casic.br.operationsite.vm.RegionViewModel +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.getScreenWidth -import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.TitleBarView class VideoBoundaryActivity : KotlinBaseActivity() { private val kTag = "VideoBoundaryActivity" private val context = this@VideoBoundaryActivity - private val wifiManager by lazy { getSystemService() } - private val wifiSsids = ArrayList() - private val cameraItems = ArrayList() - private var connectivityManager: ConnectivityManager? = null private var isStarted = false - private lateinit var regionViewModel: RegionViewModel + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel + private lateinit var cameraAddresses: String + + override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + + cameraAddresses = intent.getStringExtra(Constant.INTENT_PARAM) as String + + val params = binding.fragmentContainer.layoutParams + params.width = getScreenWidth() + params.height = ((9 / 16f) * params.width).toInt() + binding.fragmentContainer.layoutParams = params + + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] + constructionCheckViewModel.postResult.observe(this) { + if (it.code == 200) { + "区域配置成功".show(this) + val intent = Intent() + setResult(RESULT_OK, intent) + finish() + } + } + } override fun initEvent() { - binding.titleInclude.leftBackView.setOnClickListener { finish() } - - val bottomActionSheet = BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(cameraItems) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - binding.configSelectView.text = cameraItems[position] - //切换摄像头的时候需要重新读取RTSP流 - binding.videoSurfaceView.stopPlayback() - binding.videoSurfaceView.clearFocus() - isStarted = false - binding.videoSurfaceView.setVideoURI( - Uri.parse("rtsp://${binding.configSelectView.text}:554/live/site") - ) - } - }).build() - binding.configSelectView.setOnClickListener { bottomActionSheet.show() } - - binding.netSelectView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(wifiSsids) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - binding.netSelectView.text = wifiSsids[position] - - //连接wifi - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - val specifier = WifiNetworkSpecifier.Builder() - .setSsid(wifiSsids[position]) - .setWpa2Passphrase(LocaleConstant.WIFI_PASSWORD) - .build() - - val request = NetworkRequest.Builder() - .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) - .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .setNetworkSpecifier(specifier) - .build() - - connectivityManager = context.getSystemService( - Context.CONNECTIVITY_SERVICE - ) as ConnectivityManager - connectivityManager?.requestNetwork(request, networkCallback) - } - } - }).build().show() - } - binding.startRtspButton.setOnClickListener { if (isStarted) { binding.videoSurfaceView.stopPlayback() @@ -100,7 +56,8 @@ } else { //播放RTSP流 binding.videoSurfaceView.setVideoURI( - Uri.parse("rtsp://${binding.configSelectView.text}:554/live/site") + //rtsp://admin:admin@192.168.10.137:554/h264/ch1/main/av_stream + Uri.parse("rtsp://admin:admin${cameraAddresses}:554/h264/ch1/main/av_stream") ) } } @@ -113,42 +70,10 @@ } binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedRegion() + val region = binding.regionView.getConfirmedPoints() Log.d(kTag, region.toJson()) -// regionViewModel.postRegion(region) - } - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - val params = binding.fragmentContainer.layoutParams - params.width = getScreenWidth() - params.height = ((9 / 16f) * params.width).toInt() - binding.fragmentContainer.layoutParams = params - - RuntimeCache.deviceModels.forEach { - if (it.deviceType == DeviceType.CAMERA) { - cameraItems.add(it.host) - } - } - binding.configSelectView.text = cameraItems[0] - - //获取wifi列表 - wifiSsids.clear() - wifiManager?.scanResults?.forEach { res -> - //只要YTJ-010002 - if (res.SSID == "YTJ-010002") { - wifiSsids.add(res.SSID) - } - } - - regionViewModel = ViewModelProvider(this)[RegionViewModel::class.java] - regionViewModel.postResult.observe(this) { - if (it.code == 200) { - "区域配置成功".show(this) - finish() - } + constructionCheckViewModel.setVideoRegion(this, region) } } @@ -162,29 +87,19 @@ override fun setupTopBarLayout() { binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } - binding.titleInclude.titleView.text = "摄像头区域配置" - binding.titleInclude.rightOptionView.text = "重画" - binding.titleInclude.rightOptionView.setOnClickListener { - binding.regionView.clearRoutePath() - } - } + override fun onRightClick() { - private val networkCallback = object : ConnectivityManager.NetworkCallback() { - override fun onAvailable(network: Network) { - super.onAvailable(network) - connectivityManager?.bindProcessToNetwork(network) - } - - override fun onUnavailable() { - - } + } + }) } override fun onDestroy() { super.onDestroy() - connectivityManager?.bindProcessToNetwork(null) - connectivityManager?.unregisterNetworkCallback(networkCallback) binding.videoSurfaceView.suspend() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 9575c82..f92b514 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -6,7 +6,6 @@ import com.casic.br.operationsite.extensions.getResponseMessage import com.casic.br.operationsite.model.AlarmDetailModel import com.casic.br.operationsite.model.AlarmListModel -import com.casic.br.operationsite.model.CommonResultModel import com.casic.br.operationsite.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -14,7 +13,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.LoadState -import org.json.JSONObject class AlarmViewModel : BaseViewModel() { @@ -65,43 +63,33 @@ it.printStackTrace() }) - fun getAlarmState(context: Context) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getAlarmState() - when (response.getResponseCode()) { - 200 -> { - alarmState.value = JSONObject(response).getString("message") - loadState.value = LoadState.Success - } - - else -> { - loadState.value = LoadState.Fail - response.getResponseMessage().show(context) - } - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) - fun changeAlarmState(context: Context, deviceIp: String, state: String) = launch({ - loadState.value = LoadState.Loading val response = RetrofitServiceManager.changeAlarmState(state) when (response.getResponseCode()) { 200 -> { - gson.fromJson( - response, object : TypeToken() {}.type - ) - loadState.value = LoadState.Success + } else -> { - loadState.value = LoadState.Fail response.getResponseMessage().show(context) } } }, { - loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getAlarmState(context: Context) = launch({ + val response = RetrofitServiceManager.getAlarmState() + when (response.getResponseCode()) { + 200 -> { + + } + + else -> { + response.getResponseMessage().show(context) + } + } + }, { it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt new file mode 100644 index 0000000..8317578 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt @@ -0,0 +1,48 @@ +package com.casic.br.operationsite.vm + +import android.content.Context +import androidx.lifecycle.MutableLiveData +import com.casic.br.operationsite.extensions.getResponseCode +import com.casic.br.operationsite.extensions.getResponseMessage +import com.casic.br.operationsite.model.CommonResultModel +import com.casic.br.operationsite.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show + +class ConstructionCheckViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val postResult = MutableLiveData() + + fun setCurrentPhase(context: Context, phase: String) = launch({ + val response = RetrofitServiceManager.setCurrentPhase(phase) + when (response.getResponseCode()) { + 200 -> { + + } + + else -> { + response.getResponseMessage().show(context) + } + } + }, { + it.printStackTrace() + }) + + fun setVideoRegion(context: Context, position: ArrayList) = launch({ + val response = RetrofitServiceManager.setVideoRegion(position) + when (response.getResponseCode()) { + 200 -> { + + } + + else -> { + response.getResponseMessage().show(context) + } + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 294a48a..f25d5b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,7 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -/.idea/misc.xml +/.idea .DS_Store /build /captures diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index c09fb28..e2c683c 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -266,9 +266,9 @@ /** * 设置区域 * */ - suspend fun setVideoRegion(position: FloatArray): String { + suspend fun setVideoRegion(position: ArrayList): String { val param = JsonObject() - val typeToken = object : TypeToken() {}.type + val typeToken = object : TypeToken>() {}.type param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) val requestBody = param.toString().toRequestBody( diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index ee3e446..5a7b2af 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -68,6 +68,20 @@ const val TCP_PORT = 9000 //施工交底 - val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) - val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //作业前检测 + val START_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //劳保检测 + val START_SUPPLIES_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_VIDEO_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt index 5be0440..269677d 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -1,26 +1,34 @@ package com.casic.br.operationsite.view +import android.content.Intent import android.os.Bundle import android.os.Handler import android.os.Message import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.R import com.casic.br.operationsite.callback.OnImageCompressListener import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.extensions.initImmersionBar import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.AlarmViewModel +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.casic.br.operationsite.vm.UploadFileViewModel -import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.TitleBarView import java.io.File class ConstructionCheckActivity : KotlinBaseActivity(), @@ -33,60 +41,175 @@ private val kTag = "ConstructionCheckActivity" private val context = this private lateinit var uploadFileViewModel: UploadFileViewModel + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel + private var isConnected = false + private var isCompletedFirst = false + private var isCompletedSecond = false + private var isCompletedThird = false override fun initEvent() { + binding.connectTcpButton.setOnClickListener { + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + binding.startCheckButton.setOnClickListener { - when (binding.startCheckTextView.text) { - "开始交底" -> { - //连接TCP服务 - LoadingDialogHub.show(this, "处理中,请稍后...") - SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) - } - - "拍照确认" -> { - PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - analyticalSelectResults(first()) - } - } - - override fun onCancel() { - - } - }) - } - - "确认完交底" -> { - //发送指令 - SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) - binding.startCheckTextView.text = "开始交底" - } + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener } + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + } + + binding.captureDisclosureImageButton.setOnClickListener { + captureImage() + } + + binding.endCheckButton.setOnClickListener { + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + isCompletedFirst = true + } + + binding.startEnvCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) + constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") + } + + binding.captureEnvImageButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + captureImage() + } + + binding.endEnvCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) + } + + binding.endGasCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) + isCompletedSecond = true + } + + binding.startSuppliesCheckButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + } + + binding.startVideoCheckButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) + } + + binding.captureBlowerImageButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") + captureImage() + isCompletedThird = true + } + + binding.setVideoRegionButton.setOnClickListener { + if (!isCompletedThird) { + "请先完成劳保用品检测".show(this) + return@setOnClickListener + } + val intent = Intent(this, VideoBoundaryActivity::class.java) + intent.putExtra(Constant.INTENT_PARAM, "192.168.10.137") + videoRegionLauncher.launch(intent) + } + + binding.endAllCheckButton.setOnClickListener { + finish() } } - private fun analyticalSelectResults(result: LocalMedia) { - result.realPath.compressImage(this, object : OnImageCompressListener { - override fun onSuccess(file: File) { - uploadFileViewModel.uploadImage(context, file) - } + private val startVideoLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + Log.d(kTag, "startVideoLauncher: ") + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) + } - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) + private val videoRegionLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + Log.d(kTag, "videoRegionLauncher: ") + constructionCheckViewModel.setCurrentPhase(this, "in_operation") + } + + private fun captureImage() { + PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + first().realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + } + + override fun onCancel() { + + } + }) } override fun handleMessage(msg: Message): Boolean { - if (msg.what == 2024061801) { - //成功 - LoadingDialogHub.dismiss() - //发送指令 - SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) - binding.startCheckTextView.text = "拍照确认" - } + isConnected = msg.what == 2024061801 return true } @@ -100,10 +223,14 @@ val url = it.data.toString() if (url.isNotBlank()) { Log.d(kTag, "url: $url") - binding.startCheckTextView.text = "确认完交底" + "完成确认".show(this) } } } + + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] } override fun initViewBinding(): ActivityConstructionCheckBinding { @@ -120,6 +247,15 @@ } override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(false).init() + binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } + + override fun onRightClick() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt index 89454cf..aeaea64 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.operationsite.view +import android.content.Intent import android.graphics.Bitmap import android.os.Bundle import android.view.ViewGroup @@ -82,6 +83,8 @@ binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { override fun onLeftClick() { + val intent = Intent() + setResult(RESULT_OK, intent) finish() } diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt index 426f3fd..d6c48dc 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -1,96 +1,52 @@ package com.casic.br.operationsite.view -import android.content.Context -import android.net.ConnectivityManager -import android.net.Network -import android.net.NetworkCapabilities -import android.net.NetworkRequest +import android.content.Intent import android.net.Uri -import android.net.wifi.WifiManager -import android.net.wifi.WifiNetworkSpecifier -import android.os.Build import android.os.Bundle import android.util.Log import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.DeviceType -import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.RuntimeCache -import com.casic.br.operationsite.vm.RegionViewModel +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.getScreenWidth -import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.TitleBarView class VideoBoundaryActivity : KotlinBaseActivity() { private val kTag = "VideoBoundaryActivity" private val context = this@VideoBoundaryActivity - private val wifiManager by lazy { getSystemService() } - private val wifiSsids = ArrayList() - private val cameraItems = ArrayList() - private var connectivityManager: ConnectivityManager? = null private var isStarted = false - private lateinit var regionViewModel: RegionViewModel + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel + private lateinit var cameraAddresses: String + + override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + + cameraAddresses = intent.getStringExtra(Constant.INTENT_PARAM) as String + + val params = binding.fragmentContainer.layoutParams + params.width = getScreenWidth() + params.height = ((9 / 16f) * params.width).toInt() + binding.fragmentContainer.layoutParams = params + + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] + constructionCheckViewModel.postResult.observe(this) { + if (it.code == 200) { + "区域配置成功".show(this) + val intent = Intent() + setResult(RESULT_OK, intent) + finish() + } + } + } override fun initEvent() { - binding.titleInclude.leftBackView.setOnClickListener { finish() } - - val bottomActionSheet = BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(cameraItems) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - binding.configSelectView.text = cameraItems[position] - //切换摄像头的时候需要重新读取RTSP流 - binding.videoSurfaceView.stopPlayback() - binding.videoSurfaceView.clearFocus() - isStarted = false - binding.videoSurfaceView.setVideoURI( - Uri.parse("rtsp://${binding.configSelectView.text}:554/live/site") - ) - } - }).build() - binding.configSelectView.setOnClickListener { bottomActionSheet.show() } - - binding.netSelectView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(wifiSsids) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - binding.netSelectView.text = wifiSsids[position] - - //连接wifi - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - val specifier = WifiNetworkSpecifier.Builder() - .setSsid(wifiSsids[position]) - .setWpa2Passphrase(LocaleConstant.WIFI_PASSWORD) - .build() - - val request = NetworkRequest.Builder() - .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) - .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .setNetworkSpecifier(specifier) - .build() - - connectivityManager = context.getSystemService( - Context.CONNECTIVITY_SERVICE - ) as ConnectivityManager - connectivityManager?.requestNetwork(request, networkCallback) - } - } - }).build().show() - } - binding.startRtspButton.setOnClickListener { if (isStarted) { binding.videoSurfaceView.stopPlayback() @@ -100,7 +56,8 @@ } else { //播放RTSP流 binding.videoSurfaceView.setVideoURI( - Uri.parse("rtsp://${binding.configSelectView.text}:554/live/site") + //rtsp://admin:admin@192.168.10.137:554/h264/ch1/main/av_stream + Uri.parse("rtsp://admin:admin${cameraAddresses}:554/h264/ch1/main/av_stream") ) } } @@ -113,42 +70,10 @@ } binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedRegion() + val region = binding.regionView.getConfirmedPoints() Log.d(kTag, region.toJson()) -// regionViewModel.postRegion(region) - } - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - val params = binding.fragmentContainer.layoutParams - params.width = getScreenWidth() - params.height = ((9 / 16f) * params.width).toInt() - binding.fragmentContainer.layoutParams = params - - RuntimeCache.deviceModels.forEach { - if (it.deviceType == DeviceType.CAMERA) { - cameraItems.add(it.host) - } - } - binding.configSelectView.text = cameraItems[0] - - //获取wifi列表 - wifiSsids.clear() - wifiManager?.scanResults?.forEach { res -> - //只要YTJ-010002 - if (res.SSID == "YTJ-010002") { - wifiSsids.add(res.SSID) - } - } - - regionViewModel = ViewModelProvider(this)[RegionViewModel::class.java] - regionViewModel.postResult.observe(this) { - if (it.code == 200) { - "区域配置成功".show(this) - finish() - } + constructionCheckViewModel.setVideoRegion(this, region) } } @@ -162,29 +87,19 @@ override fun setupTopBarLayout() { binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } - binding.titleInclude.titleView.text = "摄像头区域配置" - binding.titleInclude.rightOptionView.text = "重画" - binding.titleInclude.rightOptionView.setOnClickListener { - binding.regionView.clearRoutePath() - } - } + override fun onRightClick() { - private val networkCallback = object : ConnectivityManager.NetworkCallback() { - override fun onAvailable(network: Network) { - super.onAvailable(network) - connectivityManager?.bindProcessToNetwork(network) - } - - override fun onUnavailable() { - - } + } + }) } override fun onDestroy() { super.onDestroy() - connectivityManager?.bindProcessToNetwork(null) - connectivityManager?.unregisterNetworkCallback(networkCallback) binding.videoSurfaceView.suspend() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 9575c82..f92b514 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -6,7 +6,6 @@ import com.casic.br.operationsite.extensions.getResponseMessage import com.casic.br.operationsite.model.AlarmDetailModel import com.casic.br.operationsite.model.AlarmListModel -import com.casic.br.operationsite.model.CommonResultModel import com.casic.br.operationsite.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -14,7 +13,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.LoadState -import org.json.JSONObject class AlarmViewModel : BaseViewModel() { @@ -65,43 +63,33 @@ it.printStackTrace() }) - fun getAlarmState(context: Context) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getAlarmState() - when (response.getResponseCode()) { - 200 -> { - alarmState.value = JSONObject(response).getString("message") - loadState.value = LoadState.Success - } - - else -> { - loadState.value = LoadState.Fail - response.getResponseMessage().show(context) - } - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) - fun changeAlarmState(context: Context, deviceIp: String, state: String) = launch({ - loadState.value = LoadState.Loading val response = RetrofitServiceManager.changeAlarmState(state) when (response.getResponseCode()) { 200 -> { - gson.fromJson( - response, object : TypeToken() {}.type - ) - loadState.value = LoadState.Success + } else -> { - loadState.value = LoadState.Fail response.getResponseMessage().show(context) } } }, { - loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getAlarmState(context: Context) = launch({ + val response = RetrofitServiceManager.getAlarmState() + when (response.getResponseCode()) { + 200 -> { + + } + + else -> { + response.getResponseMessage().show(context) + } + } + }, { it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt new file mode 100644 index 0000000..8317578 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt @@ -0,0 +1,48 @@ +package com.casic.br.operationsite.vm + +import android.content.Context +import androidx.lifecycle.MutableLiveData +import com.casic.br.operationsite.extensions.getResponseCode +import com.casic.br.operationsite.extensions.getResponseMessage +import com.casic.br.operationsite.model.CommonResultModel +import com.casic.br.operationsite.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show + +class ConstructionCheckViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val postResult = MutableLiveData() + + fun setCurrentPhase(context: Context, phase: String) = launch({ + val response = RetrofitServiceManager.setCurrentPhase(phase) + when (response.getResponseCode()) { + 200 -> { + + } + + else -> { + response.getResponseMessage().show(context) + } + } + }, { + it.printStackTrace() + }) + + fun setVideoRegion(context: Context, position: ArrayList) = launch({ + val response = RetrofitServiceManager.setVideoRegion(position) + when (response.getResponseCode()) { + 200 -> { + + } + + else -> { + response.getResponseMessage().show(context) + } + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt deleted file mode 100644 index 69e40d7..0000000 --- a/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.operationsite.vm - -import android.content.Context -import androidx.lifecycle.MutableLiveData -import com.casic.br.operationsite.extensions.getResponseCode -import com.casic.br.operationsite.extensions.getResponseMessage -import com.casic.br.operationsite.model.CommonResultModel -import com.casic.br.operationsite.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.base.BaseViewModel -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadState - -class RegionViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val postResult = MutableLiveData() - - fun postRegion(context: Context, position: FloatArray) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.setVideoRegion(position) - when (response.getResponseCode()) { - 200 -> { - loadState.value = LoadState.Success - postResult.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - - else -> { - loadState.value = LoadState.Fail - response.getResponseMessage().show(context) - } - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 294a48a..f25d5b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,7 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -/.idea/misc.xml +/.idea .DS_Store /build /captures diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index c09fb28..e2c683c 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -266,9 +266,9 @@ /** * 设置区域 * */ - suspend fun setVideoRegion(position: FloatArray): String { + suspend fun setVideoRegion(position: ArrayList): String { val param = JsonObject() - val typeToken = object : TypeToken() {}.type + val typeToken = object : TypeToken>() {}.type param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) val requestBody = param.toString().toRequestBody( diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index ee3e446..5a7b2af 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -68,6 +68,20 @@ const val TCP_PORT = 9000 //施工交底 - val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) - val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //作业前检测 + val START_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //劳保检测 + val START_SUPPLIES_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_VIDEO_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt index 5be0440..269677d 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -1,26 +1,34 @@ package com.casic.br.operationsite.view +import android.content.Intent import android.os.Bundle import android.os.Handler import android.os.Message import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.R import com.casic.br.operationsite.callback.OnImageCompressListener import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.extensions.initImmersionBar import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.AlarmViewModel +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.casic.br.operationsite.vm.UploadFileViewModel -import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.TitleBarView import java.io.File class ConstructionCheckActivity : KotlinBaseActivity(), @@ -33,60 +41,175 @@ private val kTag = "ConstructionCheckActivity" private val context = this private lateinit var uploadFileViewModel: UploadFileViewModel + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel + private var isConnected = false + private var isCompletedFirst = false + private var isCompletedSecond = false + private var isCompletedThird = false override fun initEvent() { + binding.connectTcpButton.setOnClickListener { + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + binding.startCheckButton.setOnClickListener { - when (binding.startCheckTextView.text) { - "开始交底" -> { - //连接TCP服务 - LoadingDialogHub.show(this, "处理中,请稍后...") - SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) - } - - "拍照确认" -> { - PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - analyticalSelectResults(first()) - } - } - - override fun onCancel() { - - } - }) - } - - "确认完交底" -> { - //发送指令 - SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) - binding.startCheckTextView.text = "开始交底" - } + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener } + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + } + + binding.captureDisclosureImageButton.setOnClickListener { + captureImage() + } + + binding.endCheckButton.setOnClickListener { + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + isCompletedFirst = true + } + + binding.startEnvCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) + constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") + } + + binding.captureEnvImageButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + captureImage() + } + + binding.endEnvCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) + } + + binding.endGasCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) + isCompletedSecond = true + } + + binding.startSuppliesCheckButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + } + + binding.startVideoCheckButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) + } + + binding.captureBlowerImageButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") + captureImage() + isCompletedThird = true + } + + binding.setVideoRegionButton.setOnClickListener { + if (!isCompletedThird) { + "请先完成劳保用品检测".show(this) + return@setOnClickListener + } + val intent = Intent(this, VideoBoundaryActivity::class.java) + intent.putExtra(Constant.INTENT_PARAM, "192.168.10.137") + videoRegionLauncher.launch(intent) + } + + binding.endAllCheckButton.setOnClickListener { + finish() } } - private fun analyticalSelectResults(result: LocalMedia) { - result.realPath.compressImage(this, object : OnImageCompressListener { - override fun onSuccess(file: File) { - uploadFileViewModel.uploadImage(context, file) - } + private val startVideoLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + Log.d(kTag, "startVideoLauncher: ") + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) + } - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) + private val videoRegionLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + Log.d(kTag, "videoRegionLauncher: ") + constructionCheckViewModel.setCurrentPhase(this, "in_operation") + } + + private fun captureImage() { + PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + first().realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + } + + override fun onCancel() { + + } + }) } override fun handleMessage(msg: Message): Boolean { - if (msg.what == 2024061801) { - //成功 - LoadingDialogHub.dismiss() - //发送指令 - SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) - binding.startCheckTextView.text = "拍照确认" - } + isConnected = msg.what == 2024061801 return true } @@ -100,10 +223,14 @@ val url = it.data.toString() if (url.isNotBlank()) { Log.d(kTag, "url: $url") - binding.startCheckTextView.text = "确认完交底" + "完成确认".show(this) } } } + + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] } override fun initViewBinding(): ActivityConstructionCheckBinding { @@ -120,6 +247,15 @@ } override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(false).init() + binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } + + override fun onRightClick() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt index 89454cf..aeaea64 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.operationsite.view +import android.content.Intent import android.graphics.Bitmap import android.os.Bundle import android.view.ViewGroup @@ -82,6 +83,8 @@ binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { override fun onLeftClick() { + val intent = Intent() + setResult(RESULT_OK, intent) finish() } diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt index 426f3fd..d6c48dc 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -1,96 +1,52 @@ package com.casic.br.operationsite.view -import android.content.Context -import android.net.ConnectivityManager -import android.net.Network -import android.net.NetworkCapabilities -import android.net.NetworkRequest +import android.content.Intent import android.net.Uri -import android.net.wifi.WifiManager -import android.net.wifi.WifiNetworkSpecifier -import android.os.Build import android.os.Bundle import android.util.Log import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.DeviceType -import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.RuntimeCache -import com.casic.br.operationsite.vm.RegionViewModel +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.getScreenWidth -import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.TitleBarView class VideoBoundaryActivity : KotlinBaseActivity() { private val kTag = "VideoBoundaryActivity" private val context = this@VideoBoundaryActivity - private val wifiManager by lazy { getSystemService() } - private val wifiSsids = ArrayList() - private val cameraItems = ArrayList() - private var connectivityManager: ConnectivityManager? = null private var isStarted = false - private lateinit var regionViewModel: RegionViewModel + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel + private lateinit var cameraAddresses: String + + override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + + cameraAddresses = intent.getStringExtra(Constant.INTENT_PARAM) as String + + val params = binding.fragmentContainer.layoutParams + params.width = getScreenWidth() + params.height = ((9 / 16f) * params.width).toInt() + binding.fragmentContainer.layoutParams = params + + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] + constructionCheckViewModel.postResult.observe(this) { + if (it.code == 200) { + "区域配置成功".show(this) + val intent = Intent() + setResult(RESULT_OK, intent) + finish() + } + } + } override fun initEvent() { - binding.titleInclude.leftBackView.setOnClickListener { finish() } - - val bottomActionSheet = BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(cameraItems) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - binding.configSelectView.text = cameraItems[position] - //切换摄像头的时候需要重新读取RTSP流 - binding.videoSurfaceView.stopPlayback() - binding.videoSurfaceView.clearFocus() - isStarted = false - binding.videoSurfaceView.setVideoURI( - Uri.parse("rtsp://${binding.configSelectView.text}:554/live/site") - ) - } - }).build() - binding.configSelectView.setOnClickListener { bottomActionSheet.show() } - - binding.netSelectView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(wifiSsids) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - binding.netSelectView.text = wifiSsids[position] - - //连接wifi - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - val specifier = WifiNetworkSpecifier.Builder() - .setSsid(wifiSsids[position]) - .setWpa2Passphrase(LocaleConstant.WIFI_PASSWORD) - .build() - - val request = NetworkRequest.Builder() - .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) - .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .setNetworkSpecifier(specifier) - .build() - - connectivityManager = context.getSystemService( - Context.CONNECTIVITY_SERVICE - ) as ConnectivityManager - connectivityManager?.requestNetwork(request, networkCallback) - } - } - }).build().show() - } - binding.startRtspButton.setOnClickListener { if (isStarted) { binding.videoSurfaceView.stopPlayback() @@ -100,7 +56,8 @@ } else { //播放RTSP流 binding.videoSurfaceView.setVideoURI( - Uri.parse("rtsp://${binding.configSelectView.text}:554/live/site") + //rtsp://admin:admin@192.168.10.137:554/h264/ch1/main/av_stream + Uri.parse("rtsp://admin:admin${cameraAddresses}:554/h264/ch1/main/av_stream") ) } } @@ -113,42 +70,10 @@ } binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedRegion() + val region = binding.regionView.getConfirmedPoints() Log.d(kTag, region.toJson()) -// regionViewModel.postRegion(region) - } - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - val params = binding.fragmentContainer.layoutParams - params.width = getScreenWidth() - params.height = ((9 / 16f) * params.width).toInt() - binding.fragmentContainer.layoutParams = params - - RuntimeCache.deviceModels.forEach { - if (it.deviceType == DeviceType.CAMERA) { - cameraItems.add(it.host) - } - } - binding.configSelectView.text = cameraItems[0] - - //获取wifi列表 - wifiSsids.clear() - wifiManager?.scanResults?.forEach { res -> - //只要YTJ-010002 - if (res.SSID == "YTJ-010002") { - wifiSsids.add(res.SSID) - } - } - - regionViewModel = ViewModelProvider(this)[RegionViewModel::class.java] - regionViewModel.postResult.observe(this) { - if (it.code == 200) { - "区域配置成功".show(this) - finish() - } + constructionCheckViewModel.setVideoRegion(this, region) } } @@ -162,29 +87,19 @@ override fun setupTopBarLayout() { binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } - binding.titleInclude.titleView.text = "摄像头区域配置" - binding.titleInclude.rightOptionView.text = "重画" - binding.titleInclude.rightOptionView.setOnClickListener { - binding.regionView.clearRoutePath() - } - } + override fun onRightClick() { - private val networkCallback = object : ConnectivityManager.NetworkCallback() { - override fun onAvailable(network: Network) { - super.onAvailable(network) - connectivityManager?.bindProcessToNetwork(network) - } - - override fun onUnavailable() { - - } + } + }) } override fun onDestroy() { super.onDestroy() - connectivityManager?.bindProcessToNetwork(null) - connectivityManager?.unregisterNetworkCallback(networkCallback) binding.videoSurfaceView.suspend() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 9575c82..f92b514 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -6,7 +6,6 @@ import com.casic.br.operationsite.extensions.getResponseMessage import com.casic.br.operationsite.model.AlarmDetailModel import com.casic.br.operationsite.model.AlarmListModel -import com.casic.br.operationsite.model.CommonResultModel import com.casic.br.operationsite.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -14,7 +13,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.LoadState -import org.json.JSONObject class AlarmViewModel : BaseViewModel() { @@ -65,43 +63,33 @@ it.printStackTrace() }) - fun getAlarmState(context: Context) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getAlarmState() - when (response.getResponseCode()) { - 200 -> { - alarmState.value = JSONObject(response).getString("message") - loadState.value = LoadState.Success - } - - else -> { - loadState.value = LoadState.Fail - response.getResponseMessage().show(context) - } - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) - fun changeAlarmState(context: Context, deviceIp: String, state: String) = launch({ - loadState.value = LoadState.Loading val response = RetrofitServiceManager.changeAlarmState(state) when (response.getResponseCode()) { 200 -> { - gson.fromJson( - response, object : TypeToken() {}.type - ) - loadState.value = LoadState.Success + } else -> { - loadState.value = LoadState.Fail response.getResponseMessage().show(context) } } }, { - loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getAlarmState(context: Context) = launch({ + val response = RetrofitServiceManager.getAlarmState() + when (response.getResponseCode()) { + 200 -> { + + } + + else -> { + response.getResponseMessage().show(context) + } + } + }, { it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt new file mode 100644 index 0000000..8317578 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt @@ -0,0 +1,48 @@ +package com.casic.br.operationsite.vm + +import android.content.Context +import androidx.lifecycle.MutableLiveData +import com.casic.br.operationsite.extensions.getResponseCode +import com.casic.br.operationsite.extensions.getResponseMessage +import com.casic.br.operationsite.model.CommonResultModel +import com.casic.br.operationsite.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show + +class ConstructionCheckViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val postResult = MutableLiveData() + + fun setCurrentPhase(context: Context, phase: String) = launch({ + val response = RetrofitServiceManager.setCurrentPhase(phase) + when (response.getResponseCode()) { + 200 -> { + + } + + else -> { + response.getResponseMessage().show(context) + } + } + }, { + it.printStackTrace() + }) + + fun setVideoRegion(context: Context, position: ArrayList) = launch({ + val response = RetrofitServiceManager.setVideoRegion(position) + when (response.getResponseCode()) { + 200 -> { + + } + + else -> { + response.getResponseMessage().show(context) + } + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt deleted file mode 100644 index 69e40d7..0000000 --- a/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.operationsite.vm - -import android.content.Context -import androidx.lifecycle.MutableLiveData -import com.casic.br.operationsite.extensions.getResponseCode -import com.casic.br.operationsite.extensions.getResponseMessage -import com.casic.br.operationsite.model.CommonResultModel -import com.casic.br.operationsite.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.base.BaseViewModel -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadState - -class RegionViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val postResult = MutableLiveData() - - fun postRegion(context: Context, position: FloatArray) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.setVideoRegion(position) - when (response.getResponseCode()) { - 200 -> { - loadState.value = LoadState.Success - postResult.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - - else -> { - loadState.value = LoadState.Fail - response.getResponseMessage().show(context) - } - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_check_selector.xml b/app/src/main/res/drawable/button_check_selector.xml index 731982b..46c4f6b 100644 --- a/app/src/main/res/drawable/button_check_selector.xml +++ b/app/src/main/res/drawable/button_check_selector.xml @@ -3,14 +3,14 @@ - + - + diff --git a/.gitignore b/.gitignore index 294a48a..f25d5b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,7 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -/.idea/misc.xml +/.idea .DS_Store /build /captures diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index c09fb28..e2c683c 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -266,9 +266,9 @@ /** * 设置区域 * */ - suspend fun setVideoRegion(position: FloatArray): String { + suspend fun setVideoRegion(position: ArrayList): String { val param = JsonObject() - val typeToken = object : TypeToken() {}.type + val typeToken = object : TypeToken>() {}.type param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) val requestBody = param.toString().toRequestBody( diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index ee3e446..5a7b2af 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -68,6 +68,20 @@ const val TCP_PORT = 9000 //施工交底 - val START_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) - val END_CONSTRUCTION_COMMAND = byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_CONSTRUCTION_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //作业前检测 + val START_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val END_ENV_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + + //劳保检测 + val START_SUPPLIES_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) + val START_VIDEO_COMMAND = + byteArrayOf(0xAA.toByte(), 0x01, 0x00, 0x91.toByte(), 0x01, 0x00, 0x93.toByte()) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt index 5be0440..269677d 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt @@ -1,26 +1,34 @@ package com.casic.br.operationsite.view +import android.content.Intent import android.os.Bundle import android.os.Handler import android.os.Message import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider +import com.casic.br.operationsite.R import com.casic.br.operationsite.callback.OnImageCompressListener import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.extensions.initImmersionBar import com.casic.br.operationsite.utils.LocaleConstant import com.casic.br.operationsite.utils.tcp.SocketManager +import com.casic.br.operationsite.vm.AlarmViewModel +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.casic.br.operationsite.vm.UploadFileViewModel -import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.TitleBarView import java.io.File class ConstructionCheckActivity : KotlinBaseActivity(), @@ -33,60 +41,175 @@ private val kTag = "ConstructionCheckActivity" private val context = this private lateinit var uploadFileViewModel: UploadFileViewModel + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel + private var isConnected = false + private var isCompletedFirst = false + private var isCompletedSecond = false + private var isCompletedThird = false override fun initEvent() { + binding.connectTcpButton.setOnClickListener { + SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) + } + binding.startCheckButton.setOnClickListener { - when (binding.startCheckTextView.text) { - "开始交底" -> { - //连接TCP服务 - LoadingDialogHub.show(this, "处理中,请稍后...") - SocketManager.get.connectTcpServer("192.168.154.158", LocaleConstant.TCP_PORT) - } - - "拍照确认" -> { - PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - analyticalSelectResults(first()) - } - } - - override fun onCancel() { - - } - }) - } - - "确认完交底" -> { - //发送指令 - SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) - binding.startCheckTextView.text = "开始交底" - } + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener } + //发送指令 + SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) + } + + binding.captureDisclosureImageButton.setOnClickListener { + captureImage() + } + + binding.endCheckButton.setOnClickListener { + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + //发送指令 + SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) + isCompletedFirst = true + } + + binding.startEnvCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) + constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") + } + + binding.captureEnvImageButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + captureImage() + } + + binding.endEnvCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) + } + + binding.endGasCheckButton.setOnClickListener { + if (!isCompletedFirst) { + "请先完成交底".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) + isCompletedSecond = true + } + + binding.startSuppliesCheckButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + + if (isConnected) { + "指令发送失败,请确认是否处于同一网段".show(this) + return@setOnClickListener + } + SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) + } + + binding.startVideoCheckButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) + } + + binding.captureBlowerImageButton.setOnClickListener { + if (!isCompletedSecond) { + "请先完成环境检测".show(this) + return@setOnClickListener + } + constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") + captureImage() + isCompletedThird = true + } + + binding.setVideoRegionButton.setOnClickListener { + if (!isCompletedThird) { + "请先完成劳保用品检测".show(this) + return@setOnClickListener + } + val intent = Intent(this, VideoBoundaryActivity::class.java) + intent.putExtra(Constant.INTENT_PARAM, "192.168.10.137") + videoRegionLauncher.launch(intent) + } + + binding.endAllCheckButton.setOnClickListener { + finish() } } - private fun analyticalSelectResults(result: LocalMedia) { - result.realPath.compressImage(this, object : OnImageCompressListener { - override fun onSuccess(file: File) { - uploadFileViewModel.uploadImage(context, file) - } + private val startVideoLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + Log.d(kTag, "startVideoLauncher: ") + SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) + } - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) + private val videoRegionLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + Log.d(kTag, "videoRegionLauncher: ") + constructionCheckViewModel.setCurrentPhase(this, "in_operation") + } + + private fun captureImage() { + PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.apply { + first().realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + } + + override fun onCancel() { + + } + }) } override fun handleMessage(msg: Message): Boolean { - if (msg.what == 2024061801) { - //成功 - LoadingDialogHub.dismiss() - //发送指令 - SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) - binding.startCheckTextView.text = "拍照确认" - } + isConnected = msg.what == 2024061801 return true } @@ -100,10 +223,14 @@ val url = it.data.toString() if (url.isNotBlank()) { Log.d(kTag, "url: $url") - binding.startCheckTextView.text = "确认完交底" + "完成确认".show(this) } } } + + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] } override fun initViewBinding(): ActivityConstructionCheckBinding { @@ -120,6 +247,15 @@ } override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(false).init() + binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } + + override fun onRightClick() { + + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt index 89454cf..aeaea64 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/HelmetVideoActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.operationsite.view +import android.content.Intent import android.graphics.Bitmap import android.os.Bundle import android.view.ViewGroup @@ -82,6 +83,8 @@ binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { override fun onLeftClick() { + val intent = Intent() + setResult(RESULT_OK, intent) finish() } diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt index 426f3fd..d6c48dc 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -1,96 +1,52 @@ package com.casic.br.operationsite.view -import android.content.Context -import android.net.ConnectivityManager -import android.net.Network -import android.net.NetworkCapabilities -import android.net.NetworkRequest +import android.content.Intent import android.net.Uri -import android.net.wifi.WifiManager -import android.net.wifi.WifiNetworkSpecifier -import android.os.Build import android.os.Bundle import android.util.Log import androidx.lifecycle.ViewModelProvider import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.DeviceType -import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.RuntimeCache -import com.casic.br.operationsite.vm.RegionViewModel +import com.casic.br.operationsite.vm.ConstructionCheckViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.getScreenWidth -import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.TitleBarView class VideoBoundaryActivity : KotlinBaseActivity() { private val kTag = "VideoBoundaryActivity" private val context = this@VideoBoundaryActivity - private val wifiManager by lazy { getSystemService() } - private val wifiSsids = ArrayList() - private val cameraItems = ArrayList() - private var connectivityManager: ConnectivityManager? = null private var isStarted = false - private lateinit var regionViewModel: RegionViewModel + private lateinit var constructionCheckViewModel: ConstructionCheckViewModel + private lateinit var cameraAddresses: String + + override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + + cameraAddresses = intent.getStringExtra(Constant.INTENT_PARAM) as String + + val params = binding.fragmentContainer.layoutParams + params.width = getScreenWidth() + params.height = ((9 / 16f) * params.width).toInt() + binding.fragmentContainer.layoutParams = params + + constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] + constructionCheckViewModel.postResult.observe(this) { + if (it.code == 200) { + "区域配置成功".show(this) + val intent = Intent() + setResult(RESULT_OK, intent) + finish() + } + } + } override fun initEvent() { - binding.titleInclude.leftBackView.setOnClickListener { finish() } - - val bottomActionSheet = BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(cameraItems) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - binding.configSelectView.text = cameraItems[position] - //切换摄像头的时候需要重新读取RTSP流 - binding.videoSurfaceView.stopPlayback() - binding.videoSurfaceView.clearFocus() - isStarted = false - binding.videoSurfaceView.setVideoURI( - Uri.parse("rtsp://${binding.configSelectView.text}:554/live/site") - ) - } - }).build() - binding.configSelectView.setOnClickListener { bottomActionSheet.show() } - - binding.netSelectView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(wifiSsids) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - binding.netSelectView.text = wifiSsids[position] - - //连接wifi - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - val specifier = WifiNetworkSpecifier.Builder() - .setSsid(wifiSsids[position]) - .setWpa2Passphrase(LocaleConstant.WIFI_PASSWORD) - .build() - - val request = NetworkRequest.Builder() - .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) - .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .setNetworkSpecifier(specifier) - .build() - - connectivityManager = context.getSystemService( - Context.CONNECTIVITY_SERVICE - ) as ConnectivityManager - connectivityManager?.requestNetwork(request, networkCallback) - } - } - }).build().show() - } - binding.startRtspButton.setOnClickListener { if (isStarted) { binding.videoSurfaceView.stopPlayback() @@ -100,7 +56,8 @@ } else { //播放RTSP流 binding.videoSurfaceView.setVideoURI( - Uri.parse("rtsp://${binding.configSelectView.text}:554/live/site") + //rtsp://admin:admin@192.168.10.137:554/h264/ch1/main/av_stream + Uri.parse("rtsp://admin:admin${cameraAddresses}:554/h264/ch1/main/av_stream") ) } } @@ -113,42 +70,10 @@ } binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedRegion() + val region = binding.regionView.getConfirmedPoints() Log.d(kTag, region.toJson()) -// regionViewModel.postRegion(region) - } - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - val params = binding.fragmentContainer.layoutParams - params.width = getScreenWidth() - params.height = ((9 / 16f) * params.width).toInt() - binding.fragmentContainer.layoutParams = params - - RuntimeCache.deviceModels.forEach { - if (it.deviceType == DeviceType.CAMERA) { - cameraItems.add(it.host) - } - } - binding.configSelectView.text = cameraItems[0] - - //获取wifi列表 - wifiSsids.clear() - wifiManager?.scanResults?.forEach { res -> - //只要YTJ-010002 - if (res.SSID == "YTJ-010002") { - wifiSsids.add(res.SSID) - } - } - - regionViewModel = ViewModelProvider(this)[RegionViewModel::class.java] - regionViewModel.postResult.observe(this) { - if (it.code == 200) { - "区域配置成功".show(this) - finish() - } + constructionCheckViewModel.setVideoRegion(this, region) } } @@ -162,29 +87,19 @@ override fun setupTopBarLayout() { binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } - binding.titleInclude.titleView.text = "摄像头区域配置" - binding.titleInclude.rightOptionView.text = "重画" - binding.titleInclude.rightOptionView.setOnClickListener { - binding.regionView.clearRoutePath() - } - } + override fun onRightClick() { - private val networkCallback = object : ConnectivityManager.NetworkCallback() { - override fun onAvailable(network: Network) { - super.onAvailable(network) - connectivityManager?.bindProcessToNetwork(network) - } - - override fun onUnavailable() { - - } + } + }) } override fun onDestroy() { super.onDestroy() - connectivityManager?.bindProcessToNetwork(null) - connectivityManager?.unregisterNetworkCallback(networkCallback) binding.videoSurfaceView.suspend() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 9575c82..f92b514 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -6,7 +6,6 @@ import com.casic.br.operationsite.extensions.getResponseMessage import com.casic.br.operationsite.model.AlarmDetailModel import com.casic.br.operationsite.model.AlarmListModel -import com.casic.br.operationsite.model.CommonResultModel import com.casic.br.operationsite.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -14,7 +13,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.LoadState -import org.json.JSONObject class AlarmViewModel : BaseViewModel() { @@ -65,43 +63,33 @@ it.printStackTrace() }) - fun getAlarmState(context: Context) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getAlarmState() - when (response.getResponseCode()) { - 200 -> { - alarmState.value = JSONObject(response).getString("message") - loadState.value = LoadState.Success - } - - else -> { - loadState.value = LoadState.Fail - response.getResponseMessage().show(context) - } - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) - fun changeAlarmState(context: Context, deviceIp: String, state: String) = launch({ - loadState.value = LoadState.Loading val response = RetrofitServiceManager.changeAlarmState(state) when (response.getResponseCode()) { 200 -> { - gson.fromJson( - response, object : TypeToken() {}.type - ) - loadState.value = LoadState.Success + } else -> { - loadState.value = LoadState.Fail response.getResponseMessage().show(context) } } }, { - loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getAlarmState(context: Context) = launch({ + val response = RetrofitServiceManager.getAlarmState() + when (response.getResponseCode()) { + 200 -> { + + } + + else -> { + response.getResponseMessage().show(context) + } + } + }, { it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt new file mode 100644 index 0000000..8317578 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt @@ -0,0 +1,48 @@ +package com.casic.br.operationsite.vm + +import android.content.Context +import androidx.lifecycle.MutableLiveData +import com.casic.br.operationsite.extensions.getResponseCode +import com.casic.br.operationsite.extensions.getResponseMessage +import com.casic.br.operationsite.model.CommonResultModel +import com.casic.br.operationsite.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show + +class ConstructionCheckViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val postResult = MutableLiveData() + + fun setCurrentPhase(context: Context, phase: String) = launch({ + val response = RetrofitServiceManager.setCurrentPhase(phase) + when (response.getResponseCode()) { + 200 -> { + + } + + else -> { + response.getResponseMessage().show(context) + } + } + }, { + it.printStackTrace() + }) + + fun setVideoRegion(context: Context, position: ArrayList) = launch({ + val response = RetrofitServiceManager.setVideoRegion(position) + when (response.getResponseCode()) { + 200 -> { + + } + + else -> { + response.getResponseMessage().show(context) + } + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt deleted file mode 100644 index 69e40d7..0000000 --- a/app/src/main/java/com/casic/br/operationsite/vm/RegionViewModel.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.operationsite.vm - -import android.content.Context -import androidx.lifecycle.MutableLiveData -import com.casic.br.operationsite.extensions.getResponseCode -import com.casic.br.operationsite.extensions.getResponseMessage -import com.casic.br.operationsite.model.CommonResultModel -import com.casic.br.operationsite.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.base.BaseViewModel -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.LoadState - -class RegionViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val postResult = MutableLiveData() - - fun postRegion(context: Context, position: FloatArray) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.setVideoRegion(position) - when (response.getResponseCode()) { - 200 -> { - loadState.value = LoadState.Success - postResult.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - - else -> { - loadState.value = LoadState.Fail - response.getResponseMessage().show(context) - } - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_check_selector.xml b/app/src/main/res/drawable/button_check_selector.xml index 731982b..46c4f6b 100644 --- a/app/src/main/res/drawable/button_check_selector.xml +++ b/app/src/main/res/drawable/button_check_selector.xml @@ -3,14 +3,14 @@ - + - + diff --git a/app/src/main/res/layout/activity_construction_check.xml b/app/src/main/res/layout/activity_construction_check.xml index 5696bbb..b41a790 100644 --- a/app/src/main/res/layout/activity_construction_check.xml +++ b/app/src/main/res/layout/activity_construction_check.xml @@ -1,99 +1,350 @@ - + android:layout_height="wrap_content" + android:background="@color/mainThemeColor" + app:tbv_left_image="@drawable/ic_title_left" + app:tbv_only_show_title="false" + app:tbv_show_left_image="true" + app:tbv_show_right_image="false" + app:tbv_text="作业前检测" + app:tbv_text_color="@color/white" + app:tbv_text_size="@dimen/sp_18" /> - - - - + android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:orientation="vertical"> - - - + + + + + +