diff --git a/app/build.gradle b/app/build.gradle index 0430e6b..4512b85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,9 +84,6 @@ implementation 'pub.devrel:easypermissions:3.0.0' //沉浸式状态栏。基础依赖包,必须要依赖 implementation 'com.gyf.immersionbar:immersionbar:3.0.0' - //空白页 TODO - implementation 'com.qmuiteam:qmui:2.0.0-alpha10' - implementation 'com.qmuiteam:arch:0.3.1' def vm_version = "2.5.1" //Kotlin协程 implementation "androidx.lifecycle:lifecycle-runtime-ktx:${vm_version}" @@ -115,8 +112,6 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //高德地图 implementation 'com.amap.api:3dmap:latest.integration' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //CameraX def camerax_version = '1.2.3' implementation "androidx.camera:camera-core:$camerax_version" @@ -128,4 +123,6 @@ implementation "androidx.camera:camera-view:$camerax_version" //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //播放RTSP流 + implementation 'com.github.NodeMedia:NodeMediaClient-Android:2.8.4' } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0430e6b..4512b85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,9 +84,6 @@ implementation 'pub.devrel:easypermissions:3.0.0' //沉浸式状态栏。基础依赖包,必须要依赖 implementation 'com.gyf.immersionbar:immersionbar:3.0.0' - //空白页 TODO - implementation 'com.qmuiteam:qmui:2.0.0-alpha10' - implementation 'com.qmuiteam:arch:0.3.1' def vm_version = "2.5.1" //Kotlin协程 implementation "androidx.lifecycle:lifecycle-runtime-ktx:${vm_version}" @@ -115,8 +112,6 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //高德地图 implementation 'com.amap.api:3dmap:latest.integration' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //CameraX def camerax_version = '1.2.3' implementation "androidx.camera:camera-core:$camerax_version" @@ -128,4 +123,6 @@ implementation "androidx.camera:camera-view:$camerax_version" //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //播放RTSP流 + implementation 'com.github.NodeMedia:NodeMediaClient-Android:2.8.4' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cde8f45..7f84591 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -71,6 +71,7 @@ android:theme="@style/Theme.BigImageActivity" /> + - - - diff --git a/app/build.gradle b/app/build.gradle index 0430e6b..4512b85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,9 +84,6 @@ implementation 'pub.devrel:easypermissions:3.0.0' //沉浸式状态栏。基础依赖包,必须要依赖 implementation 'com.gyf.immersionbar:immersionbar:3.0.0' - //空白页 TODO - implementation 'com.qmuiteam:qmui:2.0.0-alpha10' - implementation 'com.qmuiteam:arch:0.3.1' def vm_version = "2.5.1" //Kotlin协程 implementation "androidx.lifecycle:lifecycle-runtime-ktx:${vm_version}" @@ -115,8 +112,6 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //高德地图 implementation 'com.amap.api:3dmap:latest.integration' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //CameraX def camerax_version = '1.2.3' implementation "androidx.camera:camera-core:$camerax_version" @@ -128,4 +123,6 @@ implementation "androidx.camera:camera-view:$camerax_version" //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //播放RTSP流 + implementation 'com.github.NodeMedia:NodeMediaClient-Android:2.8.4' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cde8f45..7f84591 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -71,6 +71,7 @@ android:theme="@style/Theme.BigImageActivity" /> + - - - diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt b/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt deleted file mode 100644 index 0696166..0000000 --- a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.casic.br.operationsite.extensions - -import android.view.View -import com.qmuiteam.qmui.widget.QMUIEmptyView - -fun QMUIEmptyView.showEmptyPage(onButtonClickListener: View.OnClickListener) { - this.show(false, "抱歉,无法查询到相关记录", null, "重试", onButtonClickListener) -} - -fun QMUIEmptyView.showEmptyPage(title: String, onButtonClickListener: View.OnClickListener) { - this.show(false, title, null, "刷新", onButtonClickListener) -} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0430e6b..4512b85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,9 +84,6 @@ implementation 'pub.devrel:easypermissions:3.0.0' //沉浸式状态栏。基础依赖包,必须要依赖 implementation 'com.gyf.immersionbar:immersionbar:3.0.0' - //空白页 TODO - implementation 'com.qmuiteam:qmui:2.0.0-alpha10' - implementation 'com.qmuiteam:arch:0.3.1' def vm_version = "2.5.1" //Kotlin协程 implementation "androidx.lifecycle:lifecycle-runtime-ktx:${vm_version}" @@ -115,8 +112,6 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //高德地图 implementation 'com.amap.api:3dmap:latest.integration' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //CameraX def camerax_version = '1.2.3' implementation "androidx.camera:camera-core:$camerax_version" @@ -128,4 +123,6 @@ implementation "androidx.camera:camera-view:$camerax_version" //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //播放RTSP流 + implementation 'com.github.NodeMedia:NodeMediaClient-Android:2.8.4' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cde8f45..7f84591 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -71,6 +71,7 @@ android:theme="@style/Theme.BigImageActivity" /> + - - - diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt b/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt deleted file mode 100644 index 0696166..0000000 --- a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.casic.br.operationsite.extensions - -import android.view.View -import com.qmuiteam.qmui.widget.QMUIEmptyView - -fun QMUIEmptyView.showEmptyPage(onButtonClickListener: View.OnClickListener) { - this.show(false, "抱歉,无法查询到相关记录", null, "重试", onButtonClickListener) -} - -fun QMUIEmptyView.showEmptyPage(title: String, onButtonClickListener: View.OnClickListener) { - this.show(false, title, null, "刷新", onButtonClickListener) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index eb97647..2ce5cbe 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentCompletedBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,51 +127,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071502) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.completedRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.completedRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.completedRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/build.gradle b/app/build.gradle index 0430e6b..4512b85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,9 +84,6 @@ implementation 'pub.devrel:easypermissions:3.0.0' //沉浸式状态栏。基础依赖包,必须要依赖 implementation 'com.gyf.immersionbar:immersionbar:3.0.0' - //空白页 TODO - implementation 'com.qmuiteam:qmui:2.0.0-alpha10' - implementation 'com.qmuiteam:arch:0.3.1' def vm_version = "2.5.1" //Kotlin协程 implementation "androidx.lifecycle:lifecycle-runtime-ktx:${vm_version}" @@ -115,8 +112,6 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //高德地图 implementation 'com.amap.api:3dmap:latest.integration' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //CameraX def camerax_version = '1.2.3' implementation "androidx.camera:camera-core:$camerax_version" @@ -128,4 +123,6 @@ implementation "androidx.camera:camera-view:$camerax_version" //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //播放RTSP流 + implementation 'com.github.NodeMedia:NodeMediaClient-Android:2.8.4' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cde8f45..7f84591 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -71,6 +71,7 @@ android:theme="@style/Theme.BigImageActivity" /> + - - - diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt b/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt deleted file mode 100644 index 0696166..0000000 --- a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.casic.br.operationsite.extensions - -import android.view.View -import com.qmuiteam.qmui.widget.QMUIEmptyView - -fun QMUIEmptyView.showEmptyPage(onButtonClickListener: View.OnClickListener) { - this.show(false, "抱歉,无法查询到相关记录", null, "重试", onButtonClickListener) -} - -fun QMUIEmptyView.showEmptyPage(title: String, onButtonClickListener: View.OnClickListener) { - this.show(false, title, null, "刷新", onButtonClickListener) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index eb97647..2ce5cbe 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentCompletedBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,51 +127,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071502) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.completedRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.completedRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.completedRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index 404a4c1..b78c537 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentNotStartBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,52 +127,44 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071501) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, - "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, + "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.notStartRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.notStartRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.notStartRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/build.gradle b/app/build.gradle index 0430e6b..4512b85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,9 +84,6 @@ implementation 'pub.devrel:easypermissions:3.0.0' //沉浸式状态栏。基础依赖包,必须要依赖 implementation 'com.gyf.immersionbar:immersionbar:3.0.0' - //空白页 TODO - implementation 'com.qmuiteam:qmui:2.0.0-alpha10' - implementation 'com.qmuiteam:arch:0.3.1' def vm_version = "2.5.1" //Kotlin协程 implementation "androidx.lifecycle:lifecycle-runtime-ktx:${vm_version}" @@ -115,8 +112,6 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //高德地图 implementation 'com.amap.api:3dmap:latest.integration' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //CameraX def camerax_version = '1.2.3' implementation "androidx.camera:camera-core:$camerax_version" @@ -128,4 +123,6 @@ implementation "androidx.camera:camera-view:$camerax_version" //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //播放RTSP流 + implementation 'com.github.NodeMedia:NodeMediaClient-Android:2.8.4' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cde8f45..7f84591 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -71,6 +71,7 @@ android:theme="@style/Theme.BigImageActivity" /> + - - - diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt b/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt deleted file mode 100644 index 0696166..0000000 --- a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.casic.br.operationsite.extensions - -import android.view.View -import com.qmuiteam.qmui.widget.QMUIEmptyView - -fun QMUIEmptyView.showEmptyPage(onButtonClickListener: View.OnClickListener) { - this.show(false, "抱歉,无法查询到相关记录", null, "重试", onButtonClickListener) -} - -fun QMUIEmptyView.showEmptyPage(title: String, onButtonClickListener: View.OnClickListener) { - this.show(false, title, null, "刷新", onButtonClickListener) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index eb97647..2ce5cbe 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentCompletedBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,51 +127,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071502) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.completedRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.completedRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.completedRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index 404a4c1..b78c537 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentNotStartBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,52 +127,44 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071501) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, - "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, + "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.notStartRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.notStartRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.notStartRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index c6426a5..ef4dfe0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentWorkingBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -129,51 +128,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071101) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.workingRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.workingRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.workingRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/build.gradle b/app/build.gradle index 0430e6b..4512b85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,9 +84,6 @@ implementation 'pub.devrel:easypermissions:3.0.0' //沉浸式状态栏。基础依赖包,必须要依赖 implementation 'com.gyf.immersionbar:immersionbar:3.0.0' - //空白页 TODO - implementation 'com.qmuiteam:qmui:2.0.0-alpha10' - implementation 'com.qmuiteam:arch:0.3.1' def vm_version = "2.5.1" //Kotlin协程 implementation "androidx.lifecycle:lifecycle-runtime-ktx:${vm_version}" @@ -115,8 +112,6 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //高德地图 implementation 'com.amap.api:3dmap:latest.integration' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //CameraX def camerax_version = '1.2.3' implementation "androidx.camera:camera-core:$camerax_version" @@ -128,4 +123,6 @@ implementation "androidx.camera:camera-view:$camerax_version" //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //播放RTSP流 + implementation 'com.github.NodeMedia:NodeMediaClient-Android:2.8.4' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cde8f45..7f84591 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -71,6 +71,7 @@ android:theme="@style/Theme.BigImageActivity" /> + - - - diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt b/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt deleted file mode 100644 index 0696166..0000000 --- a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.casic.br.operationsite.extensions - -import android.view.View -import com.qmuiteam.qmui.widget.QMUIEmptyView - -fun QMUIEmptyView.showEmptyPage(onButtonClickListener: View.OnClickListener) { - this.show(false, "抱歉,无法查询到相关记录", null, "重试", onButtonClickListener) -} - -fun QMUIEmptyView.showEmptyPage(title: String, onButtonClickListener: View.OnClickListener) { - this.show(false, title, null, "刷新", onButtonClickListener) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index eb97647..2ce5cbe 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentCompletedBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,51 +127,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071502) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.completedRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.completedRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.completedRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index 404a4c1..b78c537 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentNotStartBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,52 +127,44 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071501) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, - "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, + "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.notStartRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.notStartRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.notStartRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index c6426a5..ef4dfe0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentWorkingBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -129,51 +128,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071101) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.workingRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.workingRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.workingRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } 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 aae1838..a49fad9 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 @@ -1,22 +1,46 @@ package com.casic.br.operationsite.utils import android.Manifest +import android.os.Build object LocaleConstant { - val USER_PERMISSIONS = arrayOf( - Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, - Manifest.permission.ACCESS_COARSE_LOCATION, - Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.READ_PHONE_STATE, - Manifest.permission.CHANGE_NETWORK_STATE, - Manifest.permission.WRITE_SETTINGS, - Manifest.permission.CAMERA, - Manifest.permission.READ_MEDIA_IMAGES, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) + val USER_PERMISSIONS = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.READ_MEDIA_IMAGES, + Manifest.permission.MANAGE_EXTERNAL_STORAGE + ) + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.MANAGE_EXTERNAL_STORAGE + ) + } else { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + } const val SERVER_BASE_URL = "http://111.198.10.15:21409" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/build.gradle b/app/build.gradle index 0430e6b..4512b85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,9 +84,6 @@ implementation 'pub.devrel:easypermissions:3.0.0' //沉浸式状态栏。基础依赖包,必须要依赖 implementation 'com.gyf.immersionbar:immersionbar:3.0.0' - //空白页 TODO - implementation 'com.qmuiteam:qmui:2.0.0-alpha10' - implementation 'com.qmuiteam:arch:0.3.1' def vm_version = "2.5.1" //Kotlin协程 implementation "androidx.lifecycle:lifecycle-runtime-ktx:${vm_version}" @@ -115,8 +112,6 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //高德地图 implementation 'com.amap.api:3dmap:latest.integration' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //CameraX def camerax_version = '1.2.3' implementation "androidx.camera:camera-core:$camerax_version" @@ -128,4 +123,6 @@ implementation "androidx.camera:camera-view:$camerax_version" //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //播放RTSP流 + implementation 'com.github.NodeMedia:NodeMediaClient-Android:2.8.4' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cde8f45..7f84591 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -71,6 +71,7 @@ android:theme="@style/Theme.BigImageActivity" /> + - - - diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt b/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt deleted file mode 100644 index 0696166..0000000 --- a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.casic.br.operationsite.extensions - -import android.view.View -import com.qmuiteam.qmui.widget.QMUIEmptyView - -fun QMUIEmptyView.showEmptyPage(onButtonClickListener: View.OnClickListener) { - this.show(false, "抱歉,无法查询到相关记录", null, "重试", onButtonClickListener) -} - -fun QMUIEmptyView.showEmptyPage(title: String, onButtonClickListener: View.OnClickListener) { - this.show(false, title, null, "刷新", onButtonClickListener) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index eb97647..2ce5cbe 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentCompletedBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,51 +127,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071502) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.completedRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.completedRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.completedRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index 404a4c1..b78c537 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentNotStartBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,52 +127,44 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071501) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, - "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, + "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.notStartRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.notStartRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.notStartRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index c6426a5..ef4dfe0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentWorkingBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -129,51 +128,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071101) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.workingRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.workingRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.workingRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } 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 aae1838..a49fad9 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 @@ -1,22 +1,46 @@ package com.casic.br.operationsite.utils import android.Manifest +import android.os.Build object LocaleConstant { - val USER_PERMISSIONS = arrayOf( - Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, - Manifest.permission.ACCESS_COARSE_LOCATION, - Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.READ_PHONE_STATE, - Manifest.permission.CHANGE_NETWORK_STATE, - Manifest.permission.WRITE_SETTINGS, - Manifest.permission.CAMERA, - Manifest.permission.READ_MEDIA_IMAGES, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) + val USER_PERMISSIONS = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.READ_MEDIA_IMAGES, + Manifest.permission.MANAGE_EXTERNAL_STORAGE + ) + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.MANAGE_EXTERNAL_STORAGE + ) + } else { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + } const val SERVER_BASE_URL = "http://111.198.10.15:21409" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 8dc5aba..5775599 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -1,21 +1,22 @@ package com.casic.br.operationsite.view +import android.graphics.Color import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider -import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityAlarmListBinding import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.formatToDate import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.vm.AlarmViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.divider.RecyclerViewItemDivider import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.diffCurrentTime import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,8 +25,9 @@ import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler -class AlarmListActivity : KotlinBaseActivity() { +class AlarmListActivity : KotlinBaseActivity(), Handler.Callback { + private val context = this@AlarmListActivity private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel @@ -51,39 +53,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) + weakReferenceHandler = WeakReferenceHandler(this) alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - } - - override fun observeRequestState() { - alarmViewModel.loadState.observe(this) { - if (!isLoadMore && !isRefresh) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") - else -> LoadingDialogHub.dismiss() - } - } - } - } - - override fun onResume() { - super.onResume() getAlarmListByPage() - } - - override fun initEvent() { - binding.alarmRefreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - getAlarmListByPage() - } - binding.alarmRefreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - getAlarmListByPage() - } - alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows!! @@ -112,77 +84,92 @@ } } + override fun observeRequestState() { + alarmViewModel.loadState.observe(this) { + if (!isLoadMore && !isRefresh) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } + } + } + + override fun initEvent() { + binding.alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListByPage() + } + binding.alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListByPage() + } + } + private fun getAlarmListByPage() { alarmViewModel.getAlarmListByPage(this, keywords, pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022071201) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - getAlarmListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - alarmListAdapter = - object : NormalRecyclerAdapter( - R.layout.item_alarm_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: AlarmListModel.DataModel.RowsModel - ) { - val deltaT = item.alarmTime.diffCurrentTime() - val diffTime = if (deltaT < 24) { - "${deltaT}小时前" - } else { - item.alarmTime.formatToDate() - } + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022071201) { + alarmListAdapter = object : NormalRecyclerAdapter( + R.layout.item_alarm_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, item: AlarmListModel.DataModel.RowsModel + ) { + val deltaT = item.alarmTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.alarmTime.formatToDate() + } - val color = when (item.alarmStatusName) { - "正在报警" -> R.color.redTextColor.convertColor(this@AlarmListActivity) - "手动消警" -> R.color.greenColor.convertColor(this@AlarmListActivity) - else -> R.color.hintTextColor.convertColor(this@AlarmListActivity) - } + val color = when (item.alarmStatusName) { + "正在报警" -> R.color.redTextColor.convertColor(context) + "手动消警" -> R.color.greenColor.convertColor(context) + else -> R.color.hintTextColor.convertColor(context) + } - viewHolder.setText(R.id.alarmStatusView, item.alarmStatusName) - .setBackgroundColor(R.id.alarmStatusView, color) - .setText(R.id.alarmContentView, item.alarmContent) - .setText(R.id.workRoadView, item.workRoad) - .setText(R.id.alarmTimeView, diffTime) - .setImageResource( - R.id.alarmImageView, item.alarmImage.combineImagePath() - ) - .setOnClickListener(R.id.alarmImageView) { - navigatePageTo( - 0, arrayListOf(item.alarmImage.combineImagePath()) - ) - } - if (item.alarmType == "2") { - viewHolder.setVisibility(R.id.alarmValueView, View.INVISIBLE) - } else { - viewHolder.setVisibility(R.id.alarmValueView, View.VISIBLE) - .setText(R.id.alarmValueView, "报警值:${item.alarmValue}") - } + viewHolder.setText(R.id.alarmStatusView, item.alarmStatusName) + .setBackgroundColor(R.id.alarmStatusView, color) + .setText(R.id.alarmContentView, item.alarmContent) + .setText(R.id.workRoadView, item.workRoad) + .setText(R.id.alarmTimeView, diffTime) + .setImageResource(R.id.alarmImageView, item.alarmImage.combineImagePath()) + .setOnClickListener(R.id.alarmImageView) { + navigatePageTo( + 0, arrayListOf(item.alarmImage.combineImagePath()) + ) } + if (item.alarmType == "2") { + viewHolder.setVisibility(R.id.alarmValueView, View.INVISIBLE) + .setVisibility(R.id.alarmImageView, View.VISIBLE) + } else { + viewHolder.setVisibility(R.id.alarmValueView, View.VISIBLE) + .setVisibility(R.id.alarmImageView, View.GONE) + .setText(R.id.alarmValueView, "报警值:${item.alarmValue}") } - binding.alarmRecyclerView.addItemDecoration( - DividerItemDecoration(this, DividerItemDecoration.VERTICAL) - ) - binding.alarmRecyclerView.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: AlarmListModel.DataModel.RowsModel - ) { -// navigatePageTo(t.id) - "未实现".show(this@AlarmListActivity) - } - }) + } } + binding.alarmRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataModel.RowsModel + ) { + //TODO +// navigatePageTo(t.id) + } + }) } - true + return true } /** diff --git a/app/build.gradle b/app/build.gradle index 0430e6b..4512b85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,9 +84,6 @@ implementation 'pub.devrel:easypermissions:3.0.0' //沉浸式状态栏。基础依赖包,必须要依赖 implementation 'com.gyf.immersionbar:immersionbar:3.0.0' - //空白页 TODO - implementation 'com.qmuiteam:qmui:2.0.0-alpha10' - implementation 'com.qmuiteam:arch:0.3.1' def vm_version = "2.5.1" //Kotlin协程 implementation "androidx.lifecycle:lifecycle-runtime-ktx:${vm_version}" @@ -115,8 +112,6 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //高德地图 implementation 'com.amap.api:3dmap:latest.integration' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //CameraX def camerax_version = '1.2.3' implementation "androidx.camera:camera-core:$camerax_version" @@ -128,4 +123,6 @@ implementation "androidx.camera:camera-view:$camerax_version" //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //播放RTSP流 + implementation 'com.github.NodeMedia:NodeMediaClient-Android:2.8.4' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cde8f45..7f84591 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -71,6 +71,7 @@ android:theme="@style/Theme.BigImageActivity" /> + - - - diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt b/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt deleted file mode 100644 index 0696166..0000000 --- a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.casic.br.operationsite.extensions - -import android.view.View -import com.qmuiteam.qmui.widget.QMUIEmptyView - -fun QMUIEmptyView.showEmptyPage(onButtonClickListener: View.OnClickListener) { - this.show(false, "抱歉,无法查询到相关记录", null, "重试", onButtonClickListener) -} - -fun QMUIEmptyView.showEmptyPage(title: String, onButtonClickListener: View.OnClickListener) { - this.show(false, title, null, "刷新", onButtonClickListener) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index eb97647..2ce5cbe 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentCompletedBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,51 +127,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071502) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.completedRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.completedRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.completedRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index 404a4c1..b78c537 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentNotStartBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,52 +127,44 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071501) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, - "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, + "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.notStartRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.notStartRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.notStartRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index c6426a5..ef4dfe0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentWorkingBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -129,51 +128,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071101) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.workingRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.workingRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.workingRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } 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 aae1838..a49fad9 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 @@ -1,22 +1,46 @@ package com.casic.br.operationsite.utils import android.Manifest +import android.os.Build object LocaleConstant { - val USER_PERMISSIONS = arrayOf( - Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, - Manifest.permission.ACCESS_COARSE_LOCATION, - Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.READ_PHONE_STATE, - Manifest.permission.CHANGE_NETWORK_STATE, - Manifest.permission.WRITE_SETTINGS, - Manifest.permission.CAMERA, - Manifest.permission.READ_MEDIA_IMAGES, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) + val USER_PERMISSIONS = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.READ_MEDIA_IMAGES, + Manifest.permission.MANAGE_EXTERNAL_STORAGE + ) + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.MANAGE_EXTERNAL_STORAGE + ) + } else { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + } const val SERVER_BASE_URL = "http://111.198.10.15:21409" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 8dc5aba..5775599 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -1,21 +1,22 @@ package com.casic.br.operationsite.view +import android.graphics.Color import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider -import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityAlarmListBinding import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.formatToDate import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.vm.AlarmViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.divider.RecyclerViewItemDivider import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.diffCurrentTime import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,8 +25,9 @@ import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler -class AlarmListActivity : KotlinBaseActivity() { +class AlarmListActivity : KotlinBaseActivity(), Handler.Callback { + private val context = this@AlarmListActivity private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel @@ -51,39 +53,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) + weakReferenceHandler = WeakReferenceHandler(this) alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - } - - override fun observeRequestState() { - alarmViewModel.loadState.observe(this) { - if (!isLoadMore && !isRefresh) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") - else -> LoadingDialogHub.dismiss() - } - } - } - } - - override fun onResume() { - super.onResume() getAlarmListByPage() - } - - override fun initEvent() { - binding.alarmRefreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - getAlarmListByPage() - } - binding.alarmRefreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - getAlarmListByPage() - } - alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows!! @@ -112,77 +84,92 @@ } } + override fun observeRequestState() { + alarmViewModel.loadState.observe(this) { + if (!isLoadMore && !isRefresh) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } + } + } + + override fun initEvent() { + binding.alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListByPage() + } + binding.alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListByPage() + } + } + private fun getAlarmListByPage() { alarmViewModel.getAlarmListByPage(this, keywords, pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022071201) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - getAlarmListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - alarmListAdapter = - object : NormalRecyclerAdapter( - R.layout.item_alarm_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: AlarmListModel.DataModel.RowsModel - ) { - val deltaT = item.alarmTime.diffCurrentTime() - val diffTime = if (deltaT < 24) { - "${deltaT}小时前" - } else { - item.alarmTime.formatToDate() - } + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022071201) { + alarmListAdapter = object : NormalRecyclerAdapter( + R.layout.item_alarm_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, item: AlarmListModel.DataModel.RowsModel + ) { + val deltaT = item.alarmTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.alarmTime.formatToDate() + } - val color = when (item.alarmStatusName) { - "正在报警" -> R.color.redTextColor.convertColor(this@AlarmListActivity) - "手动消警" -> R.color.greenColor.convertColor(this@AlarmListActivity) - else -> R.color.hintTextColor.convertColor(this@AlarmListActivity) - } + val color = when (item.alarmStatusName) { + "正在报警" -> R.color.redTextColor.convertColor(context) + "手动消警" -> R.color.greenColor.convertColor(context) + else -> R.color.hintTextColor.convertColor(context) + } - viewHolder.setText(R.id.alarmStatusView, item.alarmStatusName) - .setBackgroundColor(R.id.alarmStatusView, color) - .setText(R.id.alarmContentView, item.alarmContent) - .setText(R.id.workRoadView, item.workRoad) - .setText(R.id.alarmTimeView, diffTime) - .setImageResource( - R.id.alarmImageView, item.alarmImage.combineImagePath() - ) - .setOnClickListener(R.id.alarmImageView) { - navigatePageTo( - 0, arrayListOf(item.alarmImage.combineImagePath()) - ) - } - if (item.alarmType == "2") { - viewHolder.setVisibility(R.id.alarmValueView, View.INVISIBLE) - } else { - viewHolder.setVisibility(R.id.alarmValueView, View.VISIBLE) - .setText(R.id.alarmValueView, "报警值:${item.alarmValue}") - } + viewHolder.setText(R.id.alarmStatusView, item.alarmStatusName) + .setBackgroundColor(R.id.alarmStatusView, color) + .setText(R.id.alarmContentView, item.alarmContent) + .setText(R.id.workRoadView, item.workRoad) + .setText(R.id.alarmTimeView, diffTime) + .setImageResource(R.id.alarmImageView, item.alarmImage.combineImagePath()) + .setOnClickListener(R.id.alarmImageView) { + navigatePageTo( + 0, arrayListOf(item.alarmImage.combineImagePath()) + ) } + if (item.alarmType == "2") { + viewHolder.setVisibility(R.id.alarmValueView, View.INVISIBLE) + .setVisibility(R.id.alarmImageView, View.VISIBLE) + } else { + viewHolder.setVisibility(R.id.alarmValueView, View.VISIBLE) + .setVisibility(R.id.alarmImageView, View.GONE) + .setText(R.id.alarmValueView, "报警值:${item.alarmValue}") } - binding.alarmRecyclerView.addItemDecoration( - DividerItemDecoration(this, DividerItemDecoration.VERTICAL) - ) - binding.alarmRecyclerView.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: AlarmListModel.DataModel.RowsModel - ) { -// navigatePageTo(t.id) - "未实现".show(this@AlarmListActivity) - } - }) + } } + binding.alarmRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataModel.RowsModel + ) { + //TODO +// navigatePageTo(t.id) + } + }) } - true + return true } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt index 6fc4cf6..74da7c2 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt @@ -63,7 +63,7 @@ override fun setupTopBarLayout() { binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleInclude.titleView.text = "摄像头参数" + binding.titleInclude.titleView.text = "摄像头区域配置" binding.titleInclude.rightOptionView.text = "重画" binding.titleInclude.rightOptionView.setOnClickListener { binding.regionView.clearRoutePath() diff --git a/app/build.gradle b/app/build.gradle index 0430e6b..4512b85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,9 +84,6 @@ implementation 'pub.devrel:easypermissions:3.0.0' //沉浸式状态栏。基础依赖包,必须要依赖 implementation 'com.gyf.immersionbar:immersionbar:3.0.0' - //空白页 TODO - implementation 'com.qmuiteam:qmui:2.0.0-alpha10' - implementation 'com.qmuiteam:arch:0.3.1' def vm_version = "2.5.1" //Kotlin协程 implementation "androidx.lifecycle:lifecycle-runtime-ktx:${vm_version}" @@ -115,8 +112,6 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //高德地图 implementation 'com.amap.api:3dmap:latest.integration' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //CameraX def camerax_version = '1.2.3' implementation "androidx.camera:camera-core:$camerax_version" @@ -128,4 +123,6 @@ implementation "androidx.camera:camera-view:$camerax_version" //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //播放RTSP流 + implementation 'com.github.NodeMedia:NodeMediaClient-Android:2.8.4' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cde8f45..7f84591 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -71,6 +71,7 @@ android:theme="@style/Theme.BigImageActivity" /> + - - - diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt b/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt deleted file mode 100644 index 0696166..0000000 --- a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.casic.br.operationsite.extensions - -import android.view.View -import com.qmuiteam.qmui.widget.QMUIEmptyView - -fun QMUIEmptyView.showEmptyPage(onButtonClickListener: View.OnClickListener) { - this.show(false, "抱歉,无法查询到相关记录", null, "重试", onButtonClickListener) -} - -fun QMUIEmptyView.showEmptyPage(title: String, onButtonClickListener: View.OnClickListener) { - this.show(false, title, null, "刷新", onButtonClickListener) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index eb97647..2ce5cbe 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentCompletedBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,51 +127,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071502) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.completedRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.completedRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.completedRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index 404a4c1..b78c537 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentNotStartBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,52 +127,44 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071501) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, - "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, + "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.notStartRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.notStartRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.notStartRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index c6426a5..ef4dfe0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentWorkingBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -129,51 +128,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071101) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.workingRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.workingRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.workingRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } 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 aae1838..a49fad9 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 @@ -1,22 +1,46 @@ package com.casic.br.operationsite.utils import android.Manifest +import android.os.Build object LocaleConstant { - val USER_PERMISSIONS = arrayOf( - Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, - Manifest.permission.ACCESS_COARSE_LOCATION, - Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.READ_PHONE_STATE, - Manifest.permission.CHANGE_NETWORK_STATE, - Manifest.permission.WRITE_SETTINGS, - Manifest.permission.CAMERA, - Manifest.permission.READ_MEDIA_IMAGES, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) + val USER_PERMISSIONS = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.READ_MEDIA_IMAGES, + Manifest.permission.MANAGE_EXTERNAL_STORAGE + ) + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.MANAGE_EXTERNAL_STORAGE + ) + } else { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + } const val SERVER_BASE_URL = "http://111.198.10.15:21409" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 8dc5aba..5775599 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -1,21 +1,22 @@ package com.casic.br.operationsite.view +import android.graphics.Color import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider -import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityAlarmListBinding import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.formatToDate import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.vm.AlarmViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.divider.RecyclerViewItemDivider import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.diffCurrentTime import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,8 +25,9 @@ import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler -class AlarmListActivity : KotlinBaseActivity() { +class AlarmListActivity : KotlinBaseActivity(), Handler.Callback { + private val context = this@AlarmListActivity private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel @@ -51,39 +53,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) + weakReferenceHandler = WeakReferenceHandler(this) alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - } - - override fun observeRequestState() { - alarmViewModel.loadState.observe(this) { - if (!isLoadMore && !isRefresh) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") - else -> LoadingDialogHub.dismiss() - } - } - } - } - - override fun onResume() { - super.onResume() getAlarmListByPage() - } - - override fun initEvent() { - binding.alarmRefreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - getAlarmListByPage() - } - binding.alarmRefreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - getAlarmListByPage() - } - alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows!! @@ -112,77 +84,92 @@ } } + override fun observeRequestState() { + alarmViewModel.loadState.observe(this) { + if (!isLoadMore && !isRefresh) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } + } + } + + override fun initEvent() { + binding.alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListByPage() + } + binding.alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListByPage() + } + } + private fun getAlarmListByPage() { alarmViewModel.getAlarmListByPage(this, keywords, pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022071201) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - getAlarmListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - alarmListAdapter = - object : NormalRecyclerAdapter( - R.layout.item_alarm_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: AlarmListModel.DataModel.RowsModel - ) { - val deltaT = item.alarmTime.diffCurrentTime() - val diffTime = if (deltaT < 24) { - "${deltaT}小时前" - } else { - item.alarmTime.formatToDate() - } + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022071201) { + alarmListAdapter = object : NormalRecyclerAdapter( + R.layout.item_alarm_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, item: AlarmListModel.DataModel.RowsModel + ) { + val deltaT = item.alarmTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.alarmTime.formatToDate() + } - val color = when (item.alarmStatusName) { - "正在报警" -> R.color.redTextColor.convertColor(this@AlarmListActivity) - "手动消警" -> R.color.greenColor.convertColor(this@AlarmListActivity) - else -> R.color.hintTextColor.convertColor(this@AlarmListActivity) - } + val color = when (item.alarmStatusName) { + "正在报警" -> R.color.redTextColor.convertColor(context) + "手动消警" -> R.color.greenColor.convertColor(context) + else -> R.color.hintTextColor.convertColor(context) + } - viewHolder.setText(R.id.alarmStatusView, item.alarmStatusName) - .setBackgroundColor(R.id.alarmStatusView, color) - .setText(R.id.alarmContentView, item.alarmContent) - .setText(R.id.workRoadView, item.workRoad) - .setText(R.id.alarmTimeView, diffTime) - .setImageResource( - R.id.alarmImageView, item.alarmImage.combineImagePath() - ) - .setOnClickListener(R.id.alarmImageView) { - navigatePageTo( - 0, arrayListOf(item.alarmImage.combineImagePath()) - ) - } - if (item.alarmType == "2") { - viewHolder.setVisibility(R.id.alarmValueView, View.INVISIBLE) - } else { - viewHolder.setVisibility(R.id.alarmValueView, View.VISIBLE) - .setText(R.id.alarmValueView, "报警值:${item.alarmValue}") - } + viewHolder.setText(R.id.alarmStatusView, item.alarmStatusName) + .setBackgroundColor(R.id.alarmStatusView, color) + .setText(R.id.alarmContentView, item.alarmContent) + .setText(R.id.workRoadView, item.workRoad) + .setText(R.id.alarmTimeView, diffTime) + .setImageResource(R.id.alarmImageView, item.alarmImage.combineImagePath()) + .setOnClickListener(R.id.alarmImageView) { + navigatePageTo( + 0, arrayListOf(item.alarmImage.combineImagePath()) + ) } + if (item.alarmType == "2") { + viewHolder.setVisibility(R.id.alarmValueView, View.INVISIBLE) + .setVisibility(R.id.alarmImageView, View.VISIBLE) + } else { + viewHolder.setVisibility(R.id.alarmValueView, View.VISIBLE) + .setVisibility(R.id.alarmImageView, View.GONE) + .setText(R.id.alarmValueView, "报警值:${item.alarmValue}") } - binding.alarmRecyclerView.addItemDecoration( - DividerItemDecoration(this, DividerItemDecoration.VERTICAL) - ) - binding.alarmRecyclerView.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: AlarmListModel.DataModel.RowsModel - ) { -// navigatePageTo(t.id) - "未实现".show(this@AlarmListActivity) - } - }) + } } + binding.alarmRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataModel.RowsModel + ) { + //TODO +// navigatePageTo(t.id) + } + }) } - true + return true } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt index 6fc4cf6..74da7c2 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt @@ -63,7 +63,7 @@ override fun setupTopBarLayout() { binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleInclude.titleView.text = "摄像头参数" + binding.titleInclude.titleView.text = "摄像头区域配置" binding.titleInclude.rightOptionView.text = "重画" binding.titleInclude.rightOptionView.setOnClickListener { binding.regionView.clearRoutePath() 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 new file mode 100644 index 0000000..82c63f9 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -0,0 +1,182 @@ +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.net.Uri +import android.net.wifi.WifiManager +import android.net.wifi.WifiNetworkSpecifier +import android.os.Build +import android.os.Bundle +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.extensions.reformatFloatArray +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.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.widget.dialog.BottomActionSheet + +class VideoBoundaryActivity : KotlinBaseActivity() { + + 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 + + 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://192.168.118.213: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() + binding.videoSurfaceView.clearFocus() + isStarted = false + binding.startRtspButton.text = "打开摄像头" + } else { + //播放RTSP流 + binding.videoSurfaceView.setVideoURI(Uri.parse("rtsp://192.168.118.213:554/live/site")) + } + } + + binding.videoSurfaceView.setOnPreparedListener { + binding.videoSurfaceView.requestFocus() + binding.videoSurfaceView.start() + isStarted = true + binding.startRtspButton.text = "关闭摄像头" + } + + binding.saveCameraRegionButton.setOnClickListener { + val region = binding.regionView.getConfirmedPoints() + val data = region.reformatFloatArray() + + regionViewModel.postRegion(this, "11,12", "#FF0000", data) + } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + 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}:${it.port}") + } + } + 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() + } + } + } + + override fun initViewBinding(): ActivityVideoBoundaryBinding { + return ActivityVideoBoundaryBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + + binding.titleInclude.titleView.text = "摄像头区域配置" + binding.titleInclude.rightOptionView.text = "重画" + binding.titleInclude.rightOptionView.setOnClickListener { + binding.regionView.clearRoutePath() + } + } + + 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/build.gradle b/app/build.gradle index 0430e6b..4512b85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,9 +84,6 @@ implementation 'pub.devrel:easypermissions:3.0.0' //沉浸式状态栏。基础依赖包,必须要依赖 implementation 'com.gyf.immersionbar:immersionbar:3.0.0' - //空白页 TODO - implementation 'com.qmuiteam:qmui:2.0.0-alpha10' - implementation 'com.qmuiteam:arch:0.3.1' def vm_version = "2.5.1" //Kotlin协程 implementation "androidx.lifecycle:lifecycle-runtime-ktx:${vm_version}" @@ -115,8 +112,6 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //高德地图 implementation 'com.amap.api:3dmap:latest.integration' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //CameraX def camerax_version = '1.2.3' implementation "androidx.camera:camera-core:$camerax_version" @@ -128,4 +123,6 @@ implementation "androidx.camera:camera-view:$camerax_version" //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //播放RTSP流 + implementation 'com.github.NodeMedia:NodeMediaClient-Android:2.8.4' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cde8f45..7f84591 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -71,6 +71,7 @@ android:theme="@style/Theme.BigImageActivity" /> + - - - diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt b/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt deleted file mode 100644 index 0696166..0000000 --- a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.casic.br.operationsite.extensions - -import android.view.View -import com.qmuiteam.qmui.widget.QMUIEmptyView - -fun QMUIEmptyView.showEmptyPage(onButtonClickListener: View.OnClickListener) { - this.show(false, "抱歉,无法查询到相关记录", null, "重试", onButtonClickListener) -} - -fun QMUIEmptyView.showEmptyPage(title: String, onButtonClickListener: View.OnClickListener) { - this.show(false, title, null, "刷新", onButtonClickListener) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index eb97647..2ce5cbe 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentCompletedBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,51 +127,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071502) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.completedRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.completedRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.completedRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index 404a4c1..b78c537 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentNotStartBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,52 +127,44 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071501) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, - "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, + "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.notStartRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.notStartRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.notStartRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index c6426a5..ef4dfe0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentWorkingBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -129,51 +128,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071101) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.workingRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.workingRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.workingRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } 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 aae1838..a49fad9 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 @@ -1,22 +1,46 @@ package com.casic.br.operationsite.utils import android.Manifest +import android.os.Build object LocaleConstant { - val USER_PERMISSIONS = arrayOf( - Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, - Manifest.permission.ACCESS_COARSE_LOCATION, - Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.READ_PHONE_STATE, - Manifest.permission.CHANGE_NETWORK_STATE, - Manifest.permission.WRITE_SETTINGS, - Manifest.permission.CAMERA, - Manifest.permission.READ_MEDIA_IMAGES, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) + val USER_PERMISSIONS = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.READ_MEDIA_IMAGES, + Manifest.permission.MANAGE_EXTERNAL_STORAGE + ) + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.MANAGE_EXTERNAL_STORAGE + ) + } else { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + } const val SERVER_BASE_URL = "http://111.198.10.15:21409" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 8dc5aba..5775599 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -1,21 +1,22 @@ package com.casic.br.operationsite.view +import android.graphics.Color import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider -import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityAlarmListBinding import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.formatToDate import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.vm.AlarmViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.divider.RecyclerViewItemDivider import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.diffCurrentTime import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,8 +25,9 @@ import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler -class AlarmListActivity : KotlinBaseActivity() { +class AlarmListActivity : KotlinBaseActivity(), Handler.Callback { + private val context = this@AlarmListActivity private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel @@ -51,39 +53,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) + weakReferenceHandler = WeakReferenceHandler(this) alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - } - - override fun observeRequestState() { - alarmViewModel.loadState.observe(this) { - if (!isLoadMore && !isRefresh) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") - else -> LoadingDialogHub.dismiss() - } - } - } - } - - override fun onResume() { - super.onResume() getAlarmListByPage() - } - - override fun initEvent() { - binding.alarmRefreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - getAlarmListByPage() - } - binding.alarmRefreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - getAlarmListByPage() - } - alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows!! @@ -112,77 +84,92 @@ } } + override fun observeRequestState() { + alarmViewModel.loadState.observe(this) { + if (!isLoadMore && !isRefresh) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } + } + } + + override fun initEvent() { + binding.alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListByPage() + } + binding.alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListByPage() + } + } + private fun getAlarmListByPage() { alarmViewModel.getAlarmListByPage(this, keywords, pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022071201) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - getAlarmListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - alarmListAdapter = - object : NormalRecyclerAdapter( - R.layout.item_alarm_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: AlarmListModel.DataModel.RowsModel - ) { - val deltaT = item.alarmTime.diffCurrentTime() - val diffTime = if (deltaT < 24) { - "${deltaT}小时前" - } else { - item.alarmTime.formatToDate() - } + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022071201) { + alarmListAdapter = object : NormalRecyclerAdapter( + R.layout.item_alarm_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, item: AlarmListModel.DataModel.RowsModel + ) { + val deltaT = item.alarmTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.alarmTime.formatToDate() + } - val color = when (item.alarmStatusName) { - "正在报警" -> R.color.redTextColor.convertColor(this@AlarmListActivity) - "手动消警" -> R.color.greenColor.convertColor(this@AlarmListActivity) - else -> R.color.hintTextColor.convertColor(this@AlarmListActivity) - } + val color = when (item.alarmStatusName) { + "正在报警" -> R.color.redTextColor.convertColor(context) + "手动消警" -> R.color.greenColor.convertColor(context) + else -> R.color.hintTextColor.convertColor(context) + } - viewHolder.setText(R.id.alarmStatusView, item.alarmStatusName) - .setBackgroundColor(R.id.alarmStatusView, color) - .setText(R.id.alarmContentView, item.alarmContent) - .setText(R.id.workRoadView, item.workRoad) - .setText(R.id.alarmTimeView, diffTime) - .setImageResource( - R.id.alarmImageView, item.alarmImage.combineImagePath() - ) - .setOnClickListener(R.id.alarmImageView) { - navigatePageTo( - 0, arrayListOf(item.alarmImage.combineImagePath()) - ) - } - if (item.alarmType == "2") { - viewHolder.setVisibility(R.id.alarmValueView, View.INVISIBLE) - } else { - viewHolder.setVisibility(R.id.alarmValueView, View.VISIBLE) - .setText(R.id.alarmValueView, "报警值:${item.alarmValue}") - } + viewHolder.setText(R.id.alarmStatusView, item.alarmStatusName) + .setBackgroundColor(R.id.alarmStatusView, color) + .setText(R.id.alarmContentView, item.alarmContent) + .setText(R.id.workRoadView, item.workRoad) + .setText(R.id.alarmTimeView, diffTime) + .setImageResource(R.id.alarmImageView, item.alarmImage.combineImagePath()) + .setOnClickListener(R.id.alarmImageView) { + navigatePageTo( + 0, arrayListOf(item.alarmImage.combineImagePath()) + ) } + if (item.alarmType == "2") { + viewHolder.setVisibility(R.id.alarmValueView, View.INVISIBLE) + .setVisibility(R.id.alarmImageView, View.VISIBLE) + } else { + viewHolder.setVisibility(R.id.alarmValueView, View.VISIBLE) + .setVisibility(R.id.alarmImageView, View.GONE) + .setText(R.id.alarmValueView, "报警值:${item.alarmValue}") } - binding.alarmRecyclerView.addItemDecoration( - DividerItemDecoration(this, DividerItemDecoration.VERTICAL) - ) - binding.alarmRecyclerView.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: AlarmListModel.DataModel.RowsModel - ) { -// navigatePageTo(t.id) - "未实现".show(this@AlarmListActivity) - } - }) + } } + binding.alarmRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataModel.RowsModel + ) { + //TODO +// navigatePageTo(t.id) + } + }) } - true + return true } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt index 6fc4cf6..74da7c2 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt @@ -63,7 +63,7 @@ override fun setupTopBarLayout() { binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleInclude.titleView.text = "摄像头参数" + binding.titleInclude.titleView.text = "摄像头区域配置" binding.titleInclude.rightOptionView.text = "重画" binding.titleInclude.rightOptionView.setOnClickListener { binding.regionView.clearRoutePath() 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 new file mode 100644 index 0000000..82c63f9 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -0,0 +1,182 @@ +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.net.Uri +import android.net.wifi.WifiManager +import android.net.wifi.WifiNetworkSpecifier +import android.os.Build +import android.os.Bundle +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.extensions.reformatFloatArray +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.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.widget.dialog.BottomActionSheet + +class VideoBoundaryActivity : KotlinBaseActivity() { + + 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 + + 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://192.168.118.213: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() + binding.videoSurfaceView.clearFocus() + isStarted = false + binding.startRtspButton.text = "打开摄像头" + } else { + //播放RTSP流 + binding.videoSurfaceView.setVideoURI(Uri.parse("rtsp://192.168.118.213:554/live/site")) + } + } + + binding.videoSurfaceView.setOnPreparedListener { + binding.videoSurfaceView.requestFocus() + binding.videoSurfaceView.start() + isStarted = true + binding.startRtspButton.text = "关闭摄像头" + } + + binding.saveCameraRegionButton.setOnClickListener { + val region = binding.regionView.getConfirmedPoints() + val data = region.reformatFloatArray() + + regionViewModel.postRegion(this, "11,12", "#FF0000", data) + } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + 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}:${it.port}") + } + } + 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() + } + } + } + + override fun initViewBinding(): ActivityVideoBoundaryBinding { + return ActivityVideoBoundaryBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + + binding.titleInclude.titleView.text = "摄像头区域配置" + binding.titleInclude.rightOptionView.text = "重画" + binding.titleInclude.rightOptionView.setOnClickListener { + binding.regionView.clearRoutePath() + } + } + + 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/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index 29796a9..c8b16ea 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -26,12 +26,10 @@ import com.casic.br.operationsite.vm.DeviceViewModel import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo 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.widget.dialog.BottomActionSheet class WorkSiteTabActivity : KotlinBaseActivity(), AMap.OnMarkerClickListener, AMap.InfoWindowAdapter { @@ -153,7 +151,7 @@ //计算所有点的中心点位置 val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraPosition = CameraPosition(centerLatLng, 18f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) aMap.animateCamera(cameraUpdate) @@ -255,17 +253,19 @@ } binding.fenceTextView.setOnClickListener { - BottomActionSheet.Builder().setContext(this) - .setActionItemTitle(arrayListOf("监控区域", "云台参数")) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> navigatePageTo() - 1 -> navigatePageTo() - } - } - }).build().show() + //TODO 二期布控球不支持手机控制 +// BottomActionSheet.Builder().setContext(this) +// .setActionItemTitle(arrayListOf("监控区域", "云台参数")) +// .setItemTextColor(R.color.mainThemeColor.convertColor(this)) +// .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { +// override fun onActionItemClick(position: Int) { +// when (position) { +// 0 -> navigatePageTo() +// 1 -> navigatePageTo() +// } +// } +// }).build().show() + navigatePageTo() } binding.uploadTextView.setOnClickListener { diff --git a/app/build.gradle b/app/build.gradle index 0430e6b..4512b85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,9 +84,6 @@ implementation 'pub.devrel:easypermissions:3.0.0' //沉浸式状态栏。基础依赖包,必须要依赖 implementation 'com.gyf.immersionbar:immersionbar:3.0.0' - //空白页 TODO - implementation 'com.qmuiteam:qmui:2.0.0-alpha10' - implementation 'com.qmuiteam:arch:0.3.1' def vm_version = "2.5.1" //Kotlin协程 implementation "androidx.lifecycle:lifecycle-runtime-ktx:${vm_version}" @@ -115,8 +112,6 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //高德地图 implementation 'com.amap.api:3dmap:latest.integration' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //CameraX def camerax_version = '1.2.3' implementation "androidx.camera:camera-core:$camerax_version" @@ -128,4 +123,6 @@ implementation "androidx.camera:camera-view:$camerax_version" //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //播放RTSP流 + implementation 'com.github.NodeMedia:NodeMediaClient-Android:2.8.4' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cde8f45..7f84591 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -71,6 +71,7 @@ android:theme="@style/Theme.BigImageActivity" /> + - - - diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt b/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt deleted file mode 100644 index 0696166..0000000 --- a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.casic.br.operationsite.extensions - -import android.view.View -import com.qmuiteam.qmui.widget.QMUIEmptyView - -fun QMUIEmptyView.showEmptyPage(onButtonClickListener: View.OnClickListener) { - this.show(false, "抱歉,无法查询到相关记录", null, "重试", onButtonClickListener) -} - -fun QMUIEmptyView.showEmptyPage(title: String, onButtonClickListener: View.OnClickListener) { - this.show(false, title, null, "刷新", onButtonClickListener) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index eb97647..2ce5cbe 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentCompletedBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,51 +127,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071502) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.completedRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.completedRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.completedRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index 404a4c1..b78c537 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentNotStartBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,52 +127,44 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071501) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, - "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, + "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.notStartRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.notStartRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.notStartRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index c6426a5..ef4dfe0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentWorkingBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -129,51 +128,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071101) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.workingRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.workingRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.workingRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } 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 aae1838..a49fad9 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 @@ -1,22 +1,46 @@ package com.casic.br.operationsite.utils import android.Manifest +import android.os.Build object LocaleConstant { - val USER_PERMISSIONS = arrayOf( - Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, - Manifest.permission.ACCESS_COARSE_LOCATION, - Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.READ_PHONE_STATE, - Manifest.permission.CHANGE_NETWORK_STATE, - Manifest.permission.WRITE_SETTINGS, - Manifest.permission.CAMERA, - Manifest.permission.READ_MEDIA_IMAGES, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) + val USER_PERMISSIONS = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.READ_MEDIA_IMAGES, + Manifest.permission.MANAGE_EXTERNAL_STORAGE + ) + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.MANAGE_EXTERNAL_STORAGE + ) + } else { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + } const val SERVER_BASE_URL = "http://111.198.10.15:21409" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 8dc5aba..5775599 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -1,21 +1,22 @@ package com.casic.br.operationsite.view +import android.graphics.Color import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider -import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityAlarmListBinding import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.formatToDate import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.vm.AlarmViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.divider.RecyclerViewItemDivider import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.diffCurrentTime import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,8 +25,9 @@ import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler -class AlarmListActivity : KotlinBaseActivity() { +class AlarmListActivity : KotlinBaseActivity(), Handler.Callback { + private val context = this@AlarmListActivity private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel @@ -51,39 +53,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) + weakReferenceHandler = WeakReferenceHandler(this) alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - } - - override fun observeRequestState() { - alarmViewModel.loadState.observe(this) { - if (!isLoadMore && !isRefresh) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") - else -> LoadingDialogHub.dismiss() - } - } - } - } - - override fun onResume() { - super.onResume() getAlarmListByPage() - } - - override fun initEvent() { - binding.alarmRefreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - getAlarmListByPage() - } - binding.alarmRefreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - getAlarmListByPage() - } - alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows!! @@ -112,77 +84,92 @@ } } + override fun observeRequestState() { + alarmViewModel.loadState.observe(this) { + if (!isLoadMore && !isRefresh) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } + } + } + + override fun initEvent() { + binding.alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListByPage() + } + binding.alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListByPage() + } + } + private fun getAlarmListByPage() { alarmViewModel.getAlarmListByPage(this, keywords, pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022071201) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - getAlarmListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - alarmListAdapter = - object : NormalRecyclerAdapter( - R.layout.item_alarm_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: AlarmListModel.DataModel.RowsModel - ) { - val deltaT = item.alarmTime.diffCurrentTime() - val diffTime = if (deltaT < 24) { - "${deltaT}小时前" - } else { - item.alarmTime.formatToDate() - } + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022071201) { + alarmListAdapter = object : NormalRecyclerAdapter( + R.layout.item_alarm_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, item: AlarmListModel.DataModel.RowsModel + ) { + val deltaT = item.alarmTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.alarmTime.formatToDate() + } - val color = when (item.alarmStatusName) { - "正在报警" -> R.color.redTextColor.convertColor(this@AlarmListActivity) - "手动消警" -> R.color.greenColor.convertColor(this@AlarmListActivity) - else -> R.color.hintTextColor.convertColor(this@AlarmListActivity) - } + val color = when (item.alarmStatusName) { + "正在报警" -> R.color.redTextColor.convertColor(context) + "手动消警" -> R.color.greenColor.convertColor(context) + else -> R.color.hintTextColor.convertColor(context) + } - viewHolder.setText(R.id.alarmStatusView, item.alarmStatusName) - .setBackgroundColor(R.id.alarmStatusView, color) - .setText(R.id.alarmContentView, item.alarmContent) - .setText(R.id.workRoadView, item.workRoad) - .setText(R.id.alarmTimeView, diffTime) - .setImageResource( - R.id.alarmImageView, item.alarmImage.combineImagePath() - ) - .setOnClickListener(R.id.alarmImageView) { - navigatePageTo( - 0, arrayListOf(item.alarmImage.combineImagePath()) - ) - } - if (item.alarmType == "2") { - viewHolder.setVisibility(R.id.alarmValueView, View.INVISIBLE) - } else { - viewHolder.setVisibility(R.id.alarmValueView, View.VISIBLE) - .setText(R.id.alarmValueView, "报警值:${item.alarmValue}") - } + viewHolder.setText(R.id.alarmStatusView, item.alarmStatusName) + .setBackgroundColor(R.id.alarmStatusView, color) + .setText(R.id.alarmContentView, item.alarmContent) + .setText(R.id.workRoadView, item.workRoad) + .setText(R.id.alarmTimeView, diffTime) + .setImageResource(R.id.alarmImageView, item.alarmImage.combineImagePath()) + .setOnClickListener(R.id.alarmImageView) { + navigatePageTo( + 0, arrayListOf(item.alarmImage.combineImagePath()) + ) } + if (item.alarmType == "2") { + viewHolder.setVisibility(R.id.alarmValueView, View.INVISIBLE) + .setVisibility(R.id.alarmImageView, View.VISIBLE) + } else { + viewHolder.setVisibility(R.id.alarmValueView, View.VISIBLE) + .setVisibility(R.id.alarmImageView, View.GONE) + .setText(R.id.alarmValueView, "报警值:${item.alarmValue}") } - binding.alarmRecyclerView.addItemDecoration( - DividerItemDecoration(this, DividerItemDecoration.VERTICAL) - ) - binding.alarmRecyclerView.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: AlarmListModel.DataModel.RowsModel - ) { -// navigatePageTo(t.id) - "未实现".show(this@AlarmListActivity) - } - }) + } } + binding.alarmRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataModel.RowsModel + ) { + //TODO +// navigatePageTo(t.id) + } + }) } - true + return true } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt index 6fc4cf6..74da7c2 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt @@ -63,7 +63,7 @@ override fun setupTopBarLayout() { binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleInclude.titleView.text = "摄像头参数" + binding.titleInclude.titleView.text = "摄像头区域配置" binding.titleInclude.rightOptionView.text = "重画" binding.titleInclude.rightOptionView.setOnClickListener { binding.regionView.clearRoutePath() 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 new file mode 100644 index 0000000..82c63f9 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -0,0 +1,182 @@ +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.net.Uri +import android.net.wifi.WifiManager +import android.net.wifi.WifiNetworkSpecifier +import android.os.Build +import android.os.Bundle +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.extensions.reformatFloatArray +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.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.widget.dialog.BottomActionSheet + +class VideoBoundaryActivity : KotlinBaseActivity() { + + 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 + + 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://192.168.118.213: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() + binding.videoSurfaceView.clearFocus() + isStarted = false + binding.startRtspButton.text = "打开摄像头" + } else { + //播放RTSP流 + binding.videoSurfaceView.setVideoURI(Uri.parse("rtsp://192.168.118.213:554/live/site")) + } + } + + binding.videoSurfaceView.setOnPreparedListener { + binding.videoSurfaceView.requestFocus() + binding.videoSurfaceView.start() + isStarted = true + binding.startRtspButton.text = "关闭摄像头" + } + + binding.saveCameraRegionButton.setOnClickListener { + val region = binding.regionView.getConfirmedPoints() + val data = region.reformatFloatArray() + + regionViewModel.postRegion(this, "11,12", "#FF0000", data) + } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + 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}:${it.port}") + } + } + 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() + } + } + } + + override fun initViewBinding(): ActivityVideoBoundaryBinding { + return ActivityVideoBoundaryBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + + binding.titleInclude.titleView.text = "摄像头区域配置" + binding.titleInclude.rightOptionView.text = "重画" + binding.titleInclude.rightOptionView.setOnClickListener { + binding.regionView.clearRoutePath() + } + } + + 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/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index 29796a9..c8b16ea 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -26,12 +26,10 @@ import com.casic.br.operationsite.vm.DeviceViewModel import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo 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.widget.dialog.BottomActionSheet class WorkSiteTabActivity : KotlinBaseActivity(), AMap.OnMarkerClickListener, AMap.InfoWindowAdapter { @@ -153,7 +151,7 @@ //计算所有点的中心点位置 val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraPosition = CameraPosition(centerLatLng, 18f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) aMap.animateCamera(cameraUpdate) @@ -255,17 +253,19 @@ } binding.fenceTextView.setOnClickListener { - BottomActionSheet.Builder().setContext(this) - .setActionItemTitle(arrayListOf("监控区域", "云台参数")) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> navigatePageTo() - 1 -> navigatePageTo() - } - } - }).build().show() + //TODO 二期布控球不支持手机控制 +// BottomActionSheet.Builder().setContext(this) +// .setActionItemTitle(arrayListOf("监控区域", "云台参数")) +// .setItemTextColor(R.color.mainThemeColor.convertColor(this)) +// .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { +// override fun onActionItemClick(position: Int) { +// when (position) { +// 0 -> navigatePageTo() +// 1 -> navigatePageTo() +// } +// } +// }).build().show() + navigatePageTo() } binding.uploadTextView.setOnClickListener { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt index c056bba..9b6f9df 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt @@ -27,7 +27,6 @@ response, object : TypeToken() {}.type ) loadState.value = LoadState.Success - "登录成功".show(context) } else -> { diff --git a/app/build.gradle b/app/build.gradle index 0430e6b..4512b85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,9 +84,6 @@ implementation 'pub.devrel:easypermissions:3.0.0' //沉浸式状态栏。基础依赖包,必须要依赖 implementation 'com.gyf.immersionbar:immersionbar:3.0.0' - //空白页 TODO - implementation 'com.qmuiteam:qmui:2.0.0-alpha10' - implementation 'com.qmuiteam:arch:0.3.1' def vm_version = "2.5.1" //Kotlin协程 implementation "androidx.lifecycle:lifecycle-runtime-ktx:${vm_version}" @@ -115,8 +112,6 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //高德地图 implementation 'com.amap.api:3dmap:latest.integration' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //CameraX def camerax_version = '1.2.3' implementation "androidx.camera:camera-core:$camerax_version" @@ -128,4 +123,6 @@ implementation "androidx.camera:camera-view:$camerax_version" //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //播放RTSP流 + implementation 'com.github.NodeMedia:NodeMediaClient-Android:2.8.4' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cde8f45..7f84591 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -71,6 +71,7 @@ android:theme="@style/Theme.BigImageActivity" /> + - - - diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt b/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt deleted file mode 100644 index 0696166..0000000 --- a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.casic.br.operationsite.extensions - -import android.view.View -import com.qmuiteam.qmui.widget.QMUIEmptyView - -fun QMUIEmptyView.showEmptyPage(onButtonClickListener: View.OnClickListener) { - this.show(false, "抱歉,无法查询到相关记录", null, "重试", onButtonClickListener) -} - -fun QMUIEmptyView.showEmptyPage(title: String, onButtonClickListener: View.OnClickListener) { - this.show(false, title, null, "刷新", onButtonClickListener) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index eb97647..2ce5cbe 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentCompletedBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,51 +127,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071502) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.completedRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.completedRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.completedRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index 404a4c1..b78c537 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentNotStartBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,52 +127,44 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071501) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, - "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, + "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.notStartRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.notStartRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.notStartRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index c6426a5..ef4dfe0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentWorkingBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -129,51 +128,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071101) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.workingRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.workingRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.workingRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } 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 aae1838..a49fad9 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 @@ -1,22 +1,46 @@ package com.casic.br.operationsite.utils import android.Manifest +import android.os.Build object LocaleConstant { - val USER_PERMISSIONS = arrayOf( - Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, - Manifest.permission.ACCESS_COARSE_LOCATION, - Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.READ_PHONE_STATE, - Manifest.permission.CHANGE_NETWORK_STATE, - Manifest.permission.WRITE_SETTINGS, - Manifest.permission.CAMERA, - Manifest.permission.READ_MEDIA_IMAGES, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) + val USER_PERMISSIONS = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.READ_MEDIA_IMAGES, + Manifest.permission.MANAGE_EXTERNAL_STORAGE + ) + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.MANAGE_EXTERNAL_STORAGE + ) + } else { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + } const val SERVER_BASE_URL = "http://111.198.10.15:21409" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 8dc5aba..5775599 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -1,21 +1,22 @@ package com.casic.br.operationsite.view +import android.graphics.Color import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider -import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityAlarmListBinding import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.formatToDate import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.vm.AlarmViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.divider.RecyclerViewItemDivider import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.diffCurrentTime import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,8 +25,9 @@ import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler -class AlarmListActivity : KotlinBaseActivity() { +class AlarmListActivity : KotlinBaseActivity(), Handler.Callback { + private val context = this@AlarmListActivity private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel @@ -51,39 +53,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) + weakReferenceHandler = WeakReferenceHandler(this) alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - } - - override fun observeRequestState() { - alarmViewModel.loadState.observe(this) { - if (!isLoadMore && !isRefresh) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") - else -> LoadingDialogHub.dismiss() - } - } - } - } - - override fun onResume() { - super.onResume() getAlarmListByPage() - } - - override fun initEvent() { - binding.alarmRefreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - getAlarmListByPage() - } - binding.alarmRefreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - getAlarmListByPage() - } - alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows!! @@ -112,77 +84,92 @@ } } + override fun observeRequestState() { + alarmViewModel.loadState.observe(this) { + if (!isLoadMore && !isRefresh) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } + } + } + + override fun initEvent() { + binding.alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListByPage() + } + binding.alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListByPage() + } + } + private fun getAlarmListByPage() { alarmViewModel.getAlarmListByPage(this, keywords, pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022071201) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - getAlarmListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - alarmListAdapter = - object : NormalRecyclerAdapter( - R.layout.item_alarm_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: AlarmListModel.DataModel.RowsModel - ) { - val deltaT = item.alarmTime.diffCurrentTime() - val diffTime = if (deltaT < 24) { - "${deltaT}小时前" - } else { - item.alarmTime.formatToDate() - } + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022071201) { + alarmListAdapter = object : NormalRecyclerAdapter( + R.layout.item_alarm_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, item: AlarmListModel.DataModel.RowsModel + ) { + val deltaT = item.alarmTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.alarmTime.formatToDate() + } - val color = when (item.alarmStatusName) { - "正在报警" -> R.color.redTextColor.convertColor(this@AlarmListActivity) - "手动消警" -> R.color.greenColor.convertColor(this@AlarmListActivity) - else -> R.color.hintTextColor.convertColor(this@AlarmListActivity) - } + val color = when (item.alarmStatusName) { + "正在报警" -> R.color.redTextColor.convertColor(context) + "手动消警" -> R.color.greenColor.convertColor(context) + else -> R.color.hintTextColor.convertColor(context) + } - viewHolder.setText(R.id.alarmStatusView, item.alarmStatusName) - .setBackgroundColor(R.id.alarmStatusView, color) - .setText(R.id.alarmContentView, item.alarmContent) - .setText(R.id.workRoadView, item.workRoad) - .setText(R.id.alarmTimeView, diffTime) - .setImageResource( - R.id.alarmImageView, item.alarmImage.combineImagePath() - ) - .setOnClickListener(R.id.alarmImageView) { - navigatePageTo( - 0, arrayListOf(item.alarmImage.combineImagePath()) - ) - } - if (item.alarmType == "2") { - viewHolder.setVisibility(R.id.alarmValueView, View.INVISIBLE) - } else { - viewHolder.setVisibility(R.id.alarmValueView, View.VISIBLE) - .setText(R.id.alarmValueView, "报警值:${item.alarmValue}") - } + viewHolder.setText(R.id.alarmStatusView, item.alarmStatusName) + .setBackgroundColor(R.id.alarmStatusView, color) + .setText(R.id.alarmContentView, item.alarmContent) + .setText(R.id.workRoadView, item.workRoad) + .setText(R.id.alarmTimeView, diffTime) + .setImageResource(R.id.alarmImageView, item.alarmImage.combineImagePath()) + .setOnClickListener(R.id.alarmImageView) { + navigatePageTo( + 0, arrayListOf(item.alarmImage.combineImagePath()) + ) } + if (item.alarmType == "2") { + viewHolder.setVisibility(R.id.alarmValueView, View.INVISIBLE) + .setVisibility(R.id.alarmImageView, View.VISIBLE) + } else { + viewHolder.setVisibility(R.id.alarmValueView, View.VISIBLE) + .setVisibility(R.id.alarmImageView, View.GONE) + .setText(R.id.alarmValueView, "报警值:${item.alarmValue}") } - binding.alarmRecyclerView.addItemDecoration( - DividerItemDecoration(this, DividerItemDecoration.VERTICAL) - ) - binding.alarmRecyclerView.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: AlarmListModel.DataModel.RowsModel - ) { -// navigatePageTo(t.id) - "未实现".show(this@AlarmListActivity) - } - }) + } } + binding.alarmRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataModel.RowsModel + ) { + //TODO +// navigatePageTo(t.id) + } + }) } - true + return true } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt index 6fc4cf6..74da7c2 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt @@ -63,7 +63,7 @@ override fun setupTopBarLayout() { binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleInclude.titleView.text = "摄像头参数" + binding.titleInclude.titleView.text = "摄像头区域配置" binding.titleInclude.rightOptionView.text = "重画" binding.titleInclude.rightOptionView.setOnClickListener { binding.regionView.clearRoutePath() 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 new file mode 100644 index 0000000..82c63f9 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -0,0 +1,182 @@ +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.net.Uri +import android.net.wifi.WifiManager +import android.net.wifi.WifiNetworkSpecifier +import android.os.Build +import android.os.Bundle +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.extensions.reformatFloatArray +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.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.widget.dialog.BottomActionSheet + +class VideoBoundaryActivity : KotlinBaseActivity() { + + 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 + + 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://192.168.118.213: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() + binding.videoSurfaceView.clearFocus() + isStarted = false + binding.startRtspButton.text = "打开摄像头" + } else { + //播放RTSP流 + binding.videoSurfaceView.setVideoURI(Uri.parse("rtsp://192.168.118.213:554/live/site")) + } + } + + binding.videoSurfaceView.setOnPreparedListener { + binding.videoSurfaceView.requestFocus() + binding.videoSurfaceView.start() + isStarted = true + binding.startRtspButton.text = "关闭摄像头" + } + + binding.saveCameraRegionButton.setOnClickListener { + val region = binding.regionView.getConfirmedPoints() + val data = region.reformatFloatArray() + + regionViewModel.postRegion(this, "11,12", "#FF0000", data) + } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + 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}:${it.port}") + } + } + 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() + } + } + } + + override fun initViewBinding(): ActivityVideoBoundaryBinding { + return ActivityVideoBoundaryBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + + binding.titleInclude.titleView.text = "摄像头区域配置" + binding.titleInclude.rightOptionView.text = "重画" + binding.titleInclude.rightOptionView.setOnClickListener { + binding.regionView.clearRoutePath() + } + } + + 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/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index 29796a9..c8b16ea 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -26,12 +26,10 @@ import com.casic.br.operationsite.vm.DeviceViewModel import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo 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.widget.dialog.BottomActionSheet class WorkSiteTabActivity : KotlinBaseActivity(), AMap.OnMarkerClickListener, AMap.InfoWindowAdapter { @@ -153,7 +151,7 @@ //计算所有点的中心点位置 val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraPosition = CameraPosition(centerLatLng, 18f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) aMap.animateCamera(cameraUpdate) @@ -255,17 +253,19 @@ } binding.fenceTextView.setOnClickListener { - BottomActionSheet.Builder().setContext(this) - .setActionItemTitle(arrayListOf("监控区域", "云台参数")) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> navigatePageTo() - 1 -> navigatePageTo() - } - } - }).build().show() + //TODO 二期布控球不支持手机控制 +// BottomActionSheet.Builder().setContext(this) +// .setActionItemTitle(arrayListOf("监控区域", "云台参数")) +// .setItemTextColor(R.color.mainThemeColor.convertColor(this)) +// .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { +// override fun onActionItemClick(position: Int) { +// when (position) { +// 0 -> navigatePageTo() +// 1 -> navigatePageTo() +// } +// } +// }).build().show() + navigatePageTo() } binding.uploadTextView.setOnClickListener { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt index c056bba..9b6f9df 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt @@ -27,7 +27,6 @@ response, object : TypeToken() {}.type ) loadState.value = LoadState.Success - "登录成功".show(context) } else -> { diff --git a/app/src/main/java/com/casic/br/operationsite/widgets/VideoRegionView.kt b/app/src/main/java/com/casic/br/operationsite/widgets/VideoRegionView.kt index 72b7d5e..2b55c03 100644 --- a/app/src/main/java/com/casic/br/operationsite/widgets/VideoRegionView.kt +++ b/app/src/main/java/com/casic/br/operationsite/widgets/VideoRegionView.kt @@ -9,7 +9,6 @@ import android.view.MotionEvent import android.view.View import com.casic.br.operationsite.model.Point -import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getScreenWidth class VideoRegionView(private val ctx: Context, attrs: AttributeSet) : View(ctx, attrs) { @@ -24,13 +23,13 @@ routePaint.isAntiAlias = true routePaint.color = Color.RED routePaint.style = Paint.Style.STROKE - routePaint.strokeWidth = 7f //设置线宽 + routePaint.strokeWidth = 5f //设置线宽 routePaint.isAntiAlias = true borderPaint.isAntiAlias = true borderPaint.color = Color.BLUE borderPaint.style = Paint.Style.STROKE - borderPaint.strokeWidth = 7f //设置线宽 + borderPaint.strokeWidth = 5f //设置线宽 borderPaint.isAntiAlias = true } @@ -85,8 +84,8 @@ /** * 计算出点的相对位置返回给一体机计算 * */ - val width = ctx.getScreenWidth() - 14f.dp2px(ctx) - val height = 855 + val width = ctx.getScreenWidth() + val height = ((9 / 16f) * width).toInt() /** * 区域 @@ -107,8 +106,8 @@ } points.add(floatArrayOf(leftTop.x / width, leftTop.y / height)) points.add(floatArrayOf(rightTop.x / width, rightTop.y / height)) - points.add(floatArrayOf(leftBottom.x / width, leftBottom.y / height)) points.add(floatArrayOf(rightBottom.x / width, rightBottom.y / height)) + points.add(floatArrayOf(leftBottom.x / width, leftBottom.y / height)) } } invalidate() diff --git a/app/build.gradle b/app/build.gradle index 0430e6b..4512b85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,9 +84,6 @@ implementation 'pub.devrel:easypermissions:3.0.0' //沉浸式状态栏。基础依赖包,必须要依赖 implementation 'com.gyf.immersionbar:immersionbar:3.0.0' - //空白页 TODO - implementation 'com.qmuiteam:qmui:2.0.0-alpha10' - implementation 'com.qmuiteam:arch:0.3.1' def vm_version = "2.5.1" //Kotlin协程 implementation "androidx.lifecycle:lifecycle-runtime-ktx:${vm_version}" @@ -115,8 +112,6 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //高德地图 implementation 'com.amap.api:3dmap:latest.integration' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //CameraX def camerax_version = '1.2.3' implementation "androidx.camera:camera-core:$camerax_version" @@ -128,4 +123,6 @@ implementation "androidx.camera:camera-view:$camerax_version" //TCP implementation 'io.netty:netty-all:4.1.23.Final' + //播放RTSP流 + implementation 'com.github.NodeMedia:NodeMediaClient-Android:2.8.4' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cde8f45..7f84591 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -71,6 +71,7 @@ android:theme="@style/Theme.BigImageActivity" /> + - - - diff --git a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt b/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt deleted file mode 100644 index 0696166..0000000 --- a/app/src/main/java/com/casic/br/operationsite/extensions/QMUIEmptyView.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.casic.br.operationsite.extensions - -import android.view.View -import com.qmuiteam.qmui.widget.QMUIEmptyView - -fun QMUIEmptyView.showEmptyPage(onButtonClickListener: View.OnClickListener) { - this.show(false, "抱歉,无法查询到相关记录", null, "重试", onButtonClickListener) -} - -fun QMUIEmptyView.showEmptyPage(title: String, onButtonClickListener: View.OnClickListener) { - this.show(false, title, null, "刷新", onButtonClickListener) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt index eb97647..2ce5cbe 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/CompletedFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentCompletedBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,51 +127,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071502) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.completedRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.completedRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.completedRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.completedRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt index 404a4c1..b78c537 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/NotStartFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentNotStartBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -128,52 +127,44 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071501) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, - "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, + "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.notStartRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.notStartRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.notStartRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.notStartRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index c6426a5..ef4dfe0 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -13,7 +13,6 @@ import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.FragmentWorkingBinding import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.BroadcastDataModel import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.utils.LocaleConstant @@ -129,51 +128,43 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2022071101) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - obtainProjectListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - workingListAdapter = object : - NormalRecyclerAdapter( - R.layout.item_working_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: WorkSiteListModel.DataModel.RowsModel - ) { - if (item.imageUrl.isNullOrBlank()) { - viewHolder.setImageResource( - R.id.workSiteImageView, R.mipmap.ic_launcher - ) - } else { - viewHolder.setImageResource( - R.id.workSiteImageView, item.imageUrl.combineImagePath() - ) - } - viewHolder.setText(R.id.workTitleView, item.workTitle) - .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") - .setText( - R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" - ) - .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") + workingListAdapter = object : + NormalRecyclerAdapter( + R.layout.item_working_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: WorkSiteListModel.DataModel.RowsModel + ) { + if (item.imageUrl.isNullOrBlank()) { + viewHolder.setImageResource( + R.id.workSiteImageView, R.mipmap.ic_launcher + ) + } else { + viewHolder.setImageResource( + R.id.workSiteImageView, item.imageUrl.combineImagePath() + ) } + viewHolder.setText(R.id.workTitleView, item.workTitle) + .setText(R.id.workPersonView, "现场负责人:${item.workPersonName}") + .setText( + R.id.connectionPhoneView, "联系电话:${item.workPersonPhoneNumber}" + ) + .setText(R.id.workSiteView, "现场描述:${item.workSiteDesc}") } - binding.workingRecyclerView.addItemDecoration( - RecyclerViewItemDivider(1, Color.LTGRAY) - ) - binding.workingRecyclerView.adapter = workingListAdapter - workingListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: WorkSiteListModel.DataModel.RowsModel - ) { - requireContext().navigatePageTo(t.id) - } - }) } + binding.workingRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.workingRecyclerView.adapter = workingListAdapter + workingListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: WorkSiteListModel.DataModel.RowsModel + ) { + requireContext().navigatePageTo(t.id) + } + }) } return true } 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 aae1838..a49fad9 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 @@ -1,22 +1,46 @@ package com.casic.br.operationsite.utils import android.Manifest +import android.os.Build object LocaleConstant { - val USER_PERMISSIONS = arrayOf( - Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, - Manifest.permission.ACCESS_COARSE_LOCATION, - Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.READ_PHONE_STATE, - Manifest.permission.CHANGE_NETWORK_STATE, - Manifest.permission.WRITE_SETTINGS, - Manifest.permission.CAMERA, - Manifest.permission.READ_MEDIA_IMAGES, - Manifest.permission.MANAGE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) + val USER_PERMISSIONS = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.READ_MEDIA_IMAGES, + Manifest.permission.MANAGE_EXTERNAL_STORAGE + ) + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.MANAGE_EXTERNAL_STORAGE + ) + } else { + arrayOf( + Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.CHANGE_NETWORK_STATE, + Manifest.permission.WRITE_SETTINGS, + Manifest.permission.CAMERA, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + } const val SERVER_BASE_URL = "http://111.198.10.15:21409" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt index 8dc5aba..5775599 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -1,21 +1,22 @@ package com.casic.br.operationsite.view +import android.graphics.Color import android.os.Bundle import android.os.Handler +import android.os.Message import android.view.View import androidx.lifecycle.ViewModelProvider -import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.operationsite.R import com.casic.br.operationsite.databinding.ActivityAlarmListBinding import com.casic.br.operationsite.extensions.combineImagePath import com.casic.br.operationsite.extensions.formatToDate import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.AlarmListModel import com.casic.br.operationsite.vm.AlarmViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.divider.RecyclerViewItemDivider import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.diffCurrentTime import com.pengxh.kt.lite.extensions.navigatePageTo @@ -24,8 +25,9 @@ import com.pengxh.kt.lite.utils.LoadingDialogHub import com.pengxh.kt.lite.utils.WeakReferenceHandler -class AlarmListActivity : KotlinBaseActivity() { +class AlarmListActivity : KotlinBaseActivity(), Handler.Callback { + private val context = this@AlarmListActivity private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var alarmListAdapter: NormalRecyclerAdapter private lateinit var alarmViewModel: AlarmViewModel @@ -51,39 +53,9 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - weakReferenceHandler = WeakReferenceHandler(callback) + weakReferenceHandler = WeakReferenceHandler(this) alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - } - - override fun observeRequestState() { - alarmViewModel.loadState.observe(this) { - if (!isLoadMore && !isRefresh) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") - else -> LoadingDialogHub.dismiss() - } - } - } - } - - override fun onResume() { - super.onResume() getAlarmListByPage() - } - - override fun initEvent() { - binding.alarmRefreshLayout.setOnRefreshListener { - isRefresh = true - //刷新之后页码重置 - pageIndex = 1 - getAlarmListByPage() - } - binding.alarmRefreshLayout.setOnLoadMoreListener { - isLoadMore = true - pageIndex++ - getAlarmListByPage() - } - alarmViewModel.alarmModel.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows!! @@ -112,77 +84,92 @@ } } + override fun observeRequestState() { + alarmViewModel.loadState.observe(this) { + if (!isLoadMore && !isRefresh) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } + } + } + + override fun initEvent() { + binding.alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListByPage() + } + binding.alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListByPage() + } + } + private fun getAlarmListByPage() { alarmViewModel.getAlarmListByPage(this, keywords, pageIndex) } - private val callback = Handler.Callback { - if (it.what == 2022071201) { - if (dataBeans.size == 0) { - binding.emptyInclude.emptyView.showEmptyPage { - pageIndex = 1 - getAlarmListByPage() - } - } else { - binding.emptyInclude.emptyView.hide() - alarmListAdapter = - object : NormalRecyclerAdapter( - R.layout.item_alarm_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: AlarmListModel.DataModel.RowsModel - ) { - val deltaT = item.alarmTime.diffCurrentTime() - val diffTime = if (deltaT < 24) { - "${deltaT}小时前" - } else { - item.alarmTime.formatToDate() - } + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022071201) { + alarmListAdapter = object : NormalRecyclerAdapter( + R.layout.item_alarm_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, item: AlarmListModel.DataModel.RowsModel + ) { + val deltaT = item.alarmTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.alarmTime.formatToDate() + } - val color = when (item.alarmStatusName) { - "正在报警" -> R.color.redTextColor.convertColor(this@AlarmListActivity) - "手动消警" -> R.color.greenColor.convertColor(this@AlarmListActivity) - else -> R.color.hintTextColor.convertColor(this@AlarmListActivity) - } + val color = when (item.alarmStatusName) { + "正在报警" -> R.color.redTextColor.convertColor(context) + "手动消警" -> R.color.greenColor.convertColor(context) + else -> R.color.hintTextColor.convertColor(context) + } - viewHolder.setText(R.id.alarmStatusView, item.alarmStatusName) - .setBackgroundColor(R.id.alarmStatusView, color) - .setText(R.id.alarmContentView, item.alarmContent) - .setText(R.id.workRoadView, item.workRoad) - .setText(R.id.alarmTimeView, diffTime) - .setImageResource( - R.id.alarmImageView, item.alarmImage.combineImagePath() - ) - .setOnClickListener(R.id.alarmImageView) { - navigatePageTo( - 0, arrayListOf(item.alarmImage.combineImagePath()) - ) - } - if (item.alarmType == "2") { - viewHolder.setVisibility(R.id.alarmValueView, View.INVISIBLE) - } else { - viewHolder.setVisibility(R.id.alarmValueView, View.VISIBLE) - .setText(R.id.alarmValueView, "报警值:${item.alarmValue}") - } + viewHolder.setText(R.id.alarmStatusView, item.alarmStatusName) + .setBackgroundColor(R.id.alarmStatusView, color) + .setText(R.id.alarmContentView, item.alarmContent) + .setText(R.id.workRoadView, item.workRoad) + .setText(R.id.alarmTimeView, diffTime) + .setImageResource(R.id.alarmImageView, item.alarmImage.combineImagePath()) + .setOnClickListener(R.id.alarmImageView) { + navigatePageTo( + 0, arrayListOf(item.alarmImage.combineImagePath()) + ) } + if (item.alarmType == "2") { + viewHolder.setVisibility(R.id.alarmValueView, View.INVISIBLE) + .setVisibility(R.id.alarmImageView, View.VISIBLE) + } else { + viewHolder.setVisibility(R.id.alarmValueView, View.VISIBLE) + .setVisibility(R.id.alarmImageView, View.GONE) + .setText(R.id.alarmValueView, "报警值:${item.alarmValue}") } - binding.alarmRecyclerView.addItemDecoration( - DividerItemDecoration(this, DividerItemDecoration.VERTICAL) - ) - binding.alarmRecyclerView.adapter = alarmListAdapter - alarmListAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: AlarmListModel.DataModel.RowsModel - ) { -// navigatePageTo(t.id) - "未实现".show(this@AlarmListActivity) - } - }) + } } + binding.alarmRecyclerView.addItemDecoration( + RecyclerViewItemDivider(1, Color.LTGRAY) + ) + binding.alarmRecyclerView.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataModel.RowsModel + ) { + //TODO +// navigatePageTo(t.id) + } + }) } - true + return true } /** diff --git a/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt index 6fc4cf6..74da7c2 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/HikVisionActivity.kt @@ -63,7 +63,7 @@ override fun setupTopBarLayout() { binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleInclude.titleView.text = "摄像头参数" + binding.titleInclude.titleView.text = "摄像头区域配置" binding.titleInclude.rightOptionView.text = "重画" binding.titleInclude.rightOptionView.setOnClickListener { binding.regionView.clearRoutePath() 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 new file mode 100644 index 0000000..82c63f9 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt @@ -0,0 +1,182 @@ +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.net.Uri +import android.net.wifi.WifiManager +import android.net.wifi.WifiNetworkSpecifier +import android.os.Build +import android.os.Bundle +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.extensions.reformatFloatArray +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.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.widget.dialog.BottomActionSheet + +class VideoBoundaryActivity : KotlinBaseActivity() { + + 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 + + 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://192.168.118.213: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() + binding.videoSurfaceView.clearFocus() + isStarted = false + binding.startRtspButton.text = "打开摄像头" + } else { + //播放RTSP流 + binding.videoSurfaceView.setVideoURI(Uri.parse("rtsp://192.168.118.213:554/live/site")) + } + } + + binding.videoSurfaceView.setOnPreparedListener { + binding.videoSurfaceView.requestFocus() + binding.videoSurfaceView.start() + isStarted = true + binding.startRtspButton.text = "关闭摄像头" + } + + binding.saveCameraRegionButton.setOnClickListener { + val region = binding.regionView.getConfirmedPoints() + val data = region.reformatFloatArray() + + regionViewModel.postRegion(this, "11,12", "#FF0000", data) + } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + 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}:${it.port}") + } + } + 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() + } + } + } + + override fun initViewBinding(): ActivityVideoBoundaryBinding { + return ActivityVideoBoundaryBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + + binding.titleInclude.titleView.text = "摄像头区域配置" + binding.titleInclude.rightOptionView.text = "重画" + binding.titleInclude.rightOptionView.setOnClickListener { + binding.regionView.clearRoutePath() + } + } + + 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/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index 29796a9..c8b16ea 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -26,12 +26,10 @@ import com.casic.br.operationsite.vm.DeviceViewModel import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo 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.widget.dialog.BottomActionSheet class WorkSiteTabActivity : KotlinBaseActivity(), AMap.OnMarkerClickListener, AMap.InfoWindowAdapter { @@ -153,7 +151,7 @@ //计算所有点的中心点位置 val centerLatLng = LatLng(latitudeList.average(), longitudeList.average()) //移动到指定经纬度 - val cameraPosition = CameraPosition(centerLatLng, 16f, 0f, 0f) + val cameraPosition = CameraPosition(centerLatLng, 18f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) aMap.animateCamera(cameraUpdate) @@ -255,17 +253,19 @@ } binding.fenceTextView.setOnClickListener { - BottomActionSheet.Builder().setContext(this) - .setActionItemTitle(arrayListOf("监控区域", "云台参数")) - .setItemTextColor(R.color.mainThemeColor.convertColor(this)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> navigatePageTo() - 1 -> navigatePageTo() - } - } - }).build().show() + //TODO 二期布控球不支持手机控制 +// BottomActionSheet.Builder().setContext(this) +// .setActionItemTitle(arrayListOf("监控区域", "云台参数")) +// .setItemTextColor(R.color.mainThemeColor.convertColor(this)) +// .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { +// override fun onActionItemClick(position: Int) { +// when (position) { +// 0 -> navigatePageTo() +// 1 -> navigatePageTo() +// } +// } +// }).build().show() + navigatePageTo() } binding.uploadTextView.setOnClickListener { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt index c056bba..9b6f9df 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/LoginViewModel.kt @@ -27,7 +27,6 @@ response, object : TypeToken() {}.type ) loadState.value = LoadState.Success - "登录成功".show(context) } else -> { diff --git a/app/src/main/java/com/casic/br/operationsite/widgets/VideoRegionView.kt b/app/src/main/java/com/casic/br/operationsite/widgets/VideoRegionView.kt index 72b7d5e..2b55c03 100644 --- a/app/src/main/java/com/casic/br/operationsite/widgets/VideoRegionView.kt +++ b/app/src/main/java/com/casic/br/operationsite/widgets/VideoRegionView.kt @@ -9,7 +9,6 @@ import android.view.MotionEvent import android.view.View import com.casic.br.operationsite.model.Point -import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getScreenWidth class VideoRegionView(private val ctx: Context, attrs: AttributeSet) : View(ctx, attrs) { @@ -24,13 +23,13 @@ routePaint.isAntiAlias = true routePaint.color = Color.RED routePaint.style = Paint.Style.STROKE - routePaint.strokeWidth = 7f //设置线宽 + routePaint.strokeWidth = 5f //设置线宽 routePaint.isAntiAlias = true borderPaint.isAntiAlias = true borderPaint.color = Color.BLUE borderPaint.style = Paint.Style.STROKE - borderPaint.strokeWidth = 7f //设置线宽 + borderPaint.strokeWidth = 5f //设置线宽 borderPaint.isAntiAlias = true } @@ -85,8 +84,8 @@ /** * 计算出点的相对位置返回给一体机计算 * */ - val width = ctx.getScreenWidth() - 14f.dp2px(ctx) - val height = 855 + val width = ctx.getScreenWidth() + val height = ((9 / 16f) * width).toInt() /** * 区域 @@ -107,8 +106,8 @@ } points.add(floatArrayOf(leftTop.x / width, leftTop.y / height)) points.add(floatArrayOf(rightTop.x / width, rightTop.y / height)) - points.add(floatArrayOf(leftBottom.x / width, leftBottom.y / height)) points.add(floatArrayOf(rightBottom.x / width, rightBottom.y / height)) + points.add(floatArrayOf(leftBottom.x / width, leftBottom.y / height)) } } invalidate() diff --git a/app/src/main/res/layout/activity_alarm_list.xml b/app/src/main/res/layout/activity_alarm_list.xml index 334b2f1..5fce270 100644 --- a/app/src/main/res/layout/activity_alarm_list.xml +++ b/app/src/main/res/layout/activity_alarm_list.xml @@ -11,35 +11,26 @@ android:id="@+id/titleInclude" layout="@layout/include_search_title" /> - - - - + android:layout_height="wrap_content" /> - + - - - - - + +