Conflicts:
	app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt
	vtm
This commit is contained in:
qiji4215
2023-08-31 16:46:15 +08:00
19 changed files with 958 additions and 254 deletions

View File

@@ -598,6 +598,7 @@ class MainViewModel @Inject constructor(
DataCodeEnum.OMDB_ELECTRONICEYE.code,//电子眼
DataCodeEnum.OMDB_TRAFFICLIGHT.code,//交通灯
DataCodeEnum.OMDB_LANEINFO.code,//车信
DataCodeEnum.OMDB_WARNINGSIGN.code,//危险信息
-> signList.add(
signBean
)
@@ -1280,5 +1281,9 @@ class MainViewModel @Inject constructor(
}
}
}
fun clearMarker() {
mapController.markerHandle.removeMarker()
}
}

View File

@@ -2,6 +2,8 @@ package com.navinfo.omqs.ui.activity.map
import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter
import android.graphics.drawable.BitmapDrawable
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@@ -14,6 +16,7 @@ import com.navinfo.omqs.databinding.AdapterSignLaneinfoBinding
import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter
import com.navinfo.omqs.ui.other.BaseViewHolder
import com.navinfo.omqs.util.SignUtil
import org.oscim.android.canvas.AndroidSvgBitmap
interface OnSignAdapterClickListener {
fun onItemClick(signBean: SignBean)
@@ -60,7 +63,34 @@ class SignAdapter(private var listener: OnSignAdapterClickListener?) :
if (holder.viewBinding is AdapterSignBinding) {
val bd = holder.viewBinding
if (item.iconId != 0) bd.signMainIconBg.setImageResource(item.iconId)
if (item.iconId != 0) {
if (item.renderEntity.code == DataCodeEnum.OMDB_WARNINGSIGN.code) {
try {
var typeCode = "${item.iconId}"
while (typeCode.length < 5) {
typeCode = "0${typeCode}"
}
val input =
holder.viewBinding.root.context.assets.open("omdb/appendix/1105_${typeCode}_0.svg")
if (input != null) {
val bitmap =
AndroidSvgBitmap.getResourceBitmap(input, 1.0f, 60.0f, 60, 60, 100)
input.close()
val drawable = BitmapDrawable(
holder.viewBinding.root.context.resources,
bitmap
)
bd.signMainIconBg.setImageDrawable(drawable)
}
} catch (e: Exception) {
Log.e("jingo", "警示信息没有${item.iconId} 这个SVG")
}
} else {
bd.signMainIconBg.setImageResource(item.iconId)
}
}
bd.signMainIcon.text = item.iconText
bd.signBottomText.text = item.name
//点击错误按钮

View File

@@ -142,7 +142,7 @@ class EvaluationResultViewModel @Inject constructor(
override fun onCleared() {
super.onCleared()
mapController.mMapView.removeOnNIMapClickListener(TAG)
mapController.markerHandle.removeMarker(TAG)
mapController.markerHandle.removeMarker()
mapController.lineHandler.removeLine()
}

View File

@@ -134,6 +134,7 @@ class SignMoreInfoFragment : BaseFragment() {
override fun onDestroyView() {
super.onDestroyView()
viewModel.clearMarker()
_binding = null
}
}

View File

@@ -1,14 +1,22 @@
package com.navinfo.omqs.ui.fragment.signMoreInfo
import android.graphics.drawable.BitmapDrawable
import android.util.Log
import android.view.LayoutInflater
import android.view.ViewGroup
import com.bumptech.glide.Glide
import com.caverock.androidsvg.SVG
import com.caverock.androidsvg.SVGImageView
import com.navinfo.collect.library.enums.DataCodeEnum
import com.navinfo.omqs.databinding.AdapterTwoItemBinding
import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter
import com.navinfo.omqs.ui.other.BaseViewHolder
import org.oscim.android.canvas.AndroidSvgBitmap
data class TwoItemAdapterItem(
val title: String,
val text: String
val text: String,
val code: String = "",
)
class TwoItemAdapter : BaseRecyclerViewAdapter<TwoItemAdapterItem>() {
@@ -24,6 +32,31 @@ class TwoItemAdapter : BaseRecyclerViewAdapter<TwoItemAdapterItem>() {
holder.viewBinding as AdapterTwoItemBinding
val item = data[position]
binding.title.text = item.title
if (item.code == DataCodeEnum.OMDB_WARNINGSIGN.code) {
try {
val input =
holder.viewBinding.root.context.assets.open("omdb/appendix/1105_${item.text}_0.svg")
if (input != null) {
val bitmap = AndroidSvgBitmap.getResourceBitmap(input, 1.0f, 60.0f, 60, 60, 100)
input.close()
val drawableLeft = BitmapDrawable(
holder.viewBinding.root.context.resources,
bitmap
)
drawableLeft.setBounds(
0,
0,
(drawableLeft.minimumWidth * 1.2).toInt(),
(drawableLeft.minimumHeight * 1.2).toInt()
)//必须
binding.text.setCompoundDrawables(
drawableLeft, null, null, null
)
}
} catch (e: Exception) {
Log.e("jingo", "危险信息没有${item.text}这个svg")
}
}
binding.text.text = item.text
}
}

View File

@@ -95,7 +95,6 @@ class TaskFragment : BaseFragment() {
//增加侧滑按钮
binding.taskRecyclerview.setSwipeMenuCreator(mSwipeMenuCreator)
//单项点击
binding.taskRecyclerview.setOnItemMenuClickListener { menuBridge, position ->
menuBridge.closeMenu()

View File

@@ -37,17 +37,10 @@ import com.navinfo.omqs.ui.widget.LeftDeleteView
class TaskListAdapter(
private val downloadManager: TaskDownloadManager,
private val uploadManager: TaskUploadManager,
private val recyclerView: RecyclerView,
private var itemListener: ((Int, Int, TaskBean) -> Unit?)? = null,
) : BaseRecyclerViewAdapter<TaskBean>() {
private var selectPosition = -1
private var leftDeleteView: LeftDeleteView? = null
private val mRecyclerView = recyclerView
private var isShowDeleteView = false
private val downloadBtnClick = View.OnClickListener() {
if (it.tag != null) {
val taskBean = data[it.tag as Int]
@@ -110,10 +103,6 @@ class TaskListAdapter(
val viewBinding =
AdapterTaskListBinding.inflate(LayoutInflater.from(parent.context), parent, false)
val deleteView = viewBinding.root
deleteView.setRecyclerView(mRecyclerView)
return BaseViewHolder(viewBinding)
}
@@ -132,18 +121,6 @@ class TaskListAdapter(
val binding: AdapterTaskListBinding =
holder.viewBinding as AdapterTaskListBinding
val taskBean = data[position]
binding.root.mStatusChangeLister = {
isShowDeleteView = it
if (it) {
//重置以后滑动布局
restoreItemView()
// 如果编辑菜单在显示
leftDeleteView = binding.root
selectPosition = position
} else {
selectPosition = -1
}
}
//tag 方便onclick里拿到数据
holder.tag = taskBean.id.toString()
changeViews(binding, taskBean)
@@ -196,46 +173,22 @@ class TaskListAdapter(
binding.root.isSelected = selectPosition == position
binding.taskItemLayout.setOnClickListener {
if (isShowDeleteView) {
leftDeleteView?.resetDeleteStatus()
} else {
val pos = holder.adapterPosition
if (selectPosition != pos) {
val lastPos = selectPosition
selectPosition = pos
if (lastPos > -1) {
notifyItemChanged(lastPos)
}
binding.root.isSelected = true
itemListener?.invoke(position, ItemClickStatus.ITEM_LAYOUT_CLICK, taskBean)
val pos = holder.adapterPosition
if (selectPosition != pos) {
val lastPos = selectPosition
selectPosition = pos
if (lastPos > -1) {
notifyItemChanged(lastPos)
}
binding.root.isSelected = true
itemListener?.invoke(position, ItemClickStatus.ITEM_LAYOUT_CLICK, taskBean)
}
}
binding.taskDeleteLayout.setOnClickListener {
//重置状态
leftDeleteView?.resetDeleteStatus()
if (taskBean.syncStatus != FileUploadStatus.DONE) {
Toast.makeText(binding.taskUploadBtn.context, "数据未上传,不允许关闭!", Toast.LENGTH_SHORT)
.show()
} else {
itemListener?.invoke(position, ItemClickStatus.DELETE_LAYOUT_CLICK, taskBean)
}
}
}
/**
* 重置item状态
* @param point
*/
private fun restoreItemView() {
leftDeleteView?.let {
if (isShowDeleteView)
it.resetDeleteStatus()
}
}
inner class DownloadObserver(val id: Int, val holder: BaseViewHolder) :
Observer<TaskBean> {
override fun onChanged(taskBean: TaskBean?) {

View File

@@ -1,6 +1,5 @@
package com.navinfo.omqs.ui.fragment.tasklist
import android.os.Build
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
@@ -9,12 +8,18 @@ import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.FragmentTaskListBinding
import com.navinfo.omqs.http.taskdownload.TaskDownloadManager
import com.navinfo.omqs.http.taskupload.TaskUploadManager
import com.navinfo.omqs.tools.FileManager
import com.navinfo.omqs.ui.fragment.BaseFragment
import com.navinfo.omqs.ui.other.shareViewModels
import com.yanzhenjie.recyclerview.SwipeMenuCreator
import com.yanzhenjie.recyclerview.SwipeMenuItem
import dagger.hilt.android.AndroidEntryPoint
import org.videolan.vlc.Util
import javax.inject.Inject
@AndroidEntryPoint
@@ -35,7 +40,7 @@ class TaskListFragment : BaseFragment() {
private val adapter: TaskListAdapter by lazy {
TaskListAdapter(
downloadManager, uploadManager, binding.taskListRecyclerview
downloadManager, uploadManager,
) { _, status, taskBean ->
if (taskBean.hadLinkDvoList.isEmpty()) {
Toast.makeText(context, "数据错误无Link数据", Toast.LENGTH_SHORT).show()
@@ -46,8 +51,7 @@ class TaskListFragment : BaseFragment() {
viewModel.setSelectTaskBean(taskBean)
}
TaskListAdapter.Companion.ItemClickStatus.DELETE_LAYOUT_CLICK -> {
showLoadingDialog("正在关闭")
context?.let { viewModel.removeTask(it, taskBean) }
}
TaskListAdapter.Companion.ItemClickStatus.UPLOAD_LAYOUT_CLICK -> {
showLoadingDialog("正在校验")
@@ -74,12 +78,53 @@ class TaskListFragment : BaseFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//注意:使用滑动菜单不能开启滑动删除,否则只有滑动删除没有滑动菜单
val mSwipeMenuCreator = SwipeMenuCreator { _, rightMenu, _ ->
//添加菜单自动添加至尾部
val deleteItem = SwipeMenuItem(context)
deleteItem.height = Util.convertDpToPx(requireContext(), 60)
deleteItem.width = Util.convertDpToPx(requireContext(), 80)
deleteItem.text = "关闭"
deleteItem.background = requireContext().getDrawable(R.color.red)
deleteItem.setTextColor(requireContext().resources.getColor(R.color.white))
rightMenu.addMenuItem(deleteItem)
}
val layoutManager = LinearLayoutManager(context)
//// 设置 RecyclerView 的固定大小,避免在滚动时重新计算视图大小和布局,提高性能
binding.taskListRecyclerview.setHasFixedSize(true)
binding.taskListRecyclerview.layoutManager = layoutManager
//增加侧滑按钮
binding.taskListRecyclerview.setSwipeMenuCreator(mSwipeMenuCreator)
//单项点击
binding.taskListRecyclerview.setOnItemMenuClickListener { menuBridge, position ->
menuBridge.closeMenu()
val taskBean = adapter.data[position]
if (taskBean.syncStatus != FileManager.Companion.FileUploadStatus.DONE) {
Toast.makeText(context, "数据未上传,不允许关闭!", Toast.LENGTH_SHORT)
.show()
} else {
viewModel.removeTask(requireContext(), taskBean)
}
}
/**
* 刷新
*/
binding.refreshLayout.setOnRefreshListener {
viewModel.loadNetTaskList(requireContext())
}
loadFinish()
binding.taskListRecyclerview.adapter = adapter
viewModel.liveDataTaskList.observe(viewLifecycleOwner) {
loadFinish()
adapter.initSelectTask(it, viewModel.currentSelectTaskBean?.id)
}
@@ -94,7 +139,12 @@ class TaskListFragment : BaseFragment() {
}
binding.taskListSearch.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
override fun beforeTextChanged(
s: CharSequence?,
start: Int,
count: Int,
after: Int
) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
@@ -106,8 +156,20 @@ class TaskListFragment : BaseFragment() {
})
}
private fun loadFinish() {
binding.refreshLayout.isRefreshing = false
// 第一次加载数据:一定要调用这个方法,否则不会触发加载更多。
// 第一个参数表示此次数据是否为空假如你请求到的list为空(== null || list.size == 0)那么这里就要true。
// 第二个参数表示是否还有更多数据根据服务器返回给你的page等信息判断是否还有更多这样可以提供性能如果不能判断则传true。
// 第一次加载数据:一定要调用这个方法,否则不会触发加载更多。
// 第一个参数表示此次数据是否为空假如你请求到的list为空(== null || list.size == 0)那么这里就要true。
// 第二个参数表示是否还有更多数据根据服务器返回给你的page等信息判断是否还有更多这样可以提供性能如果不能判断则传true。
binding.taskListRecyclerview.loadMoreFinish(true, false)
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null

View File

@@ -5,6 +5,7 @@ import android.content.SharedPreferences
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
import android.os.Build
import android.view.View
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
@@ -20,8 +21,10 @@ import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.collect.library.utils.MapParamUtils
import com.navinfo.omqs.Constant
import com.navinfo.omqs.db.RealmOperateHelper
import com.navinfo.omqs.http.NetResult
import com.navinfo.omqs.http.NetworkService
import com.navinfo.omqs.tools.FileManager
import com.navinfo.omqs.ui.activity.login.LoginStatus
import com.navinfo.omqs.ui.dialog.FirstDialog
import com.navinfo.omqs.util.DateTimeUtil
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -176,6 +179,72 @@ class TaskViewModel @Inject constructor(
}
}
/**
* 获取任务列表
*/
fun loadNetTaskList(context: Context){
viewModelScope.launch(Dispatchers.IO) {
when (val result = networkService.getTaskList(Constant.USER_ID)) {
is NetResult.Success -> {
if (result.data != null) {
val realm = Realm.getDefaultInstance()
realm.executeTransaction {
result.data.obj?.let { list ->
for (index in list.indices) {
val task = list[index]
val item = realm.where(TaskBean::class.java).equalTo(
"id", task.id
).findFirst()
if (item != null) {
task.fileSize = item.fileSize
task.status = item.status
task.currentSize = item.currentSize
task.hadLinkDvoList = item.hadLinkDvoList
//已上传后不在更新操作时间
if (task.syncStatus != FileManager.Companion.FileUploadStatus.DONE) {
//赋值时间,用于查询过滤
task.operationTime = DateTimeUtil.getNowDate().time
}
} else {
for (hadLink in task.hadLinkDvoList) {
hadLink.taskId = task.id
}
//赋值时间,用于查询过滤
task.operationTime = DateTimeUtil.getNowDate().time
}
realm.copyToRealmOrUpdate(task)
}
}
}
}
getLocalTaskList()
}
is NetResult.Error<*> -> {
withContext(Dispatchers.Main) {
Toast.makeText(context, "${result.exception.message}", Toast.LENGTH_SHORT)
.show()
}
getLocalTaskList()
}
is NetResult.Failure<*> -> {
withContext(Dispatchers.Main) {
Toast.makeText(context, "${result.code}:${result.msg}", Toast.LENGTH_SHORT)
.show()
}
getLocalTaskList()
}
is NetResult.Loading -> {}
}
}
}
/**
* 获取任务列表
*/