fix: 合并代码

This commit is contained in:
2023-07-26 15:29:13 +08:00
133 changed files with 9118 additions and 2296 deletions

View File

@@ -193,14 +193,29 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
R.id.console_personal_center_bg, R.id.console_personal_center_icon_bg -> {
if (sceneFlag) {
mFragment = PersonalCenterFragment {
TransitionManager.go(aScene, aTransition)
if(it){
activity?.let { a ->
a.supportFragmentManager.beginTransaction().remove(this).commit()
(a as MainActivity).showIndoorDataLayout()
}
}else{
TransitionManager.go(aScene, aTransition)
}
}
sceneFlag = false
TransitionManager.go(bScene, bTransition)
} else {
if (mFragment !is PersonalCenterFragment) {
mFragment = PersonalCenterFragment {
TransitionManager.go(aScene, aTransition)
if(it){
activity?.let { a ->
a.supportFragmentManager.beginTransaction().remove(this).commit()
(a as MainActivity).showIndoorDataLayout()
}
}else{
TransitionManager.go(aScene, aTransition)
}
}
childFragmentManager.beginTransaction().replace(fragmentId, mFragment!!)
.commit()

View File

@@ -32,18 +32,27 @@ class EmptyFragment : Fragment() {
override fun onStart() {
super.onStart()
val currentDestination = findNavController().currentDestination
//有右侧面板的时候
if (currentDestination?.label == "右侧空页面") {
currentDestinationLabel = "右侧空页面"
(activity as MainActivity).setRightSwitchButton(View.GONE)
currentDestination?.let {
//有右侧面板的时候
currentDestinationLabel = it.label.toString()
if (it.label == "右侧空页面") {
(activity as MainActivity).setRightSwitchButtonVisibility(View.GONE)
(activity as MainActivity).setTopMenuButtonVisibility(View.VISIBLE)
} else if (it.label == "中间空页面") {
(activity as MainActivity).setRightButtonsVisible(View.VISIBLE)
}
}
}
override fun onStop() {
super.onStop()
//没有有右侧面板的时候
if (currentDestinationLabel == "右侧空页面") {
(activity as MainActivity).setRightSwitchButton(View.VISIBLE)
(activity as MainActivity).setRightSwitchButtonVisibility(View.VISIBLE)
(activity as MainActivity).setTopMenuButtonVisibility(View.GONE)
} else if (currentDestinationLabel == "中间空页面") {
(activity as MainActivity).setRightButtonsVisible(View.GONE)
}
}

View File

@@ -1,12 +1,17 @@
package com.navinfo.omqs.ui.fragment.evaluationresult
import android.app.Activity
import android.content.Intent
import android.graphics.Bitmap
import android.os.Build
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.view.*
import android.widget.Toast
import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.databinding.DataBindingUtil
import androidx.navigation.NavOptions
import androidx.navigation.findNavController
@@ -21,12 +26,12 @@ import com.navinfo.omqs.ui.dialog.FirstDialog
import com.navinfo.omqs.ui.fragment.BaseFragment
import com.navinfo.omqs.ui.other.shareViewModels
import dagger.hilt.android.AndroidEntryPoint
import org.videolan.vlc.Util
@AndroidEntryPoint
class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
private lateinit var binding: FragmentEvaluationResultBinding
private var mCameraLauncher: ActivityResultLauncher<Intent>? = null
/**
* 和[PhenomenonFragment],[ProblemLinkFragment],[EvaluationResultFragment]共用同一个viewModel
@@ -37,6 +42,23 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
PictureAdapter()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mCameraLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result: ActivityResult ->
if (result.resultCode == Activity.RESULT_OK) {
// 处理相机返回的结果
val extras = result.data!!.extras
val imageBitmap: Bitmap? = extras!!["data"] as Bitmap?
// 在这里处理图片数据
if (imageBitmap != null)
viewModel.savePhoto(imageBitmap)
}
}
}
// private val args:EmptyFragmentArgs by navArgs()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
@@ -44,37 +66,28 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
binding =
DataBindingUtil.inflate(inflater, R.layout.fragment_evaluation_result, container, false)
binding.fragment = this
val layoutManager = LinearLayoutManager(context)
binding.viewModel = viewModel
binding.lifecycleOwner = this
//// 设置 RecyclerView 的固定大小,避免在滚动时重新计算视图大小和布局,提高性能
binding.evaluationVoiceRecyclerview.setHasFixedSize(true)
binding.evaluationVoiceRecyclerview.layoutManager = layoutManager
/**
* 监听左侧栏的点击事件
*/
val adapter = SoundtListAdapter { _, view ->
}
binding.evaluationVoiceRecyclerview.adapter = adapter
viewModel.listDataChatMsgEntityList.observe(viewLifecycleOwner) {
adapter.refreshData(it)
}
binding.evaluationPictureViewpager
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//监听是否退出当前页面
viewModel.liveDataFinish.observe(viewLifecycleOwner) {
onBackPressed()
//// 设置 RecyclerView 的固定大小,避免在滚动时重新计算视图大小和布局,提高性能
binding.evaluationVoiceRecyclerview.setHasFixedSize(true)
val layoutManager = LinearLayoutManager(context)
binding.evaluationVoiceRecyclerview.layoutManager = layoutManager
/**
* 监听左侧栏的点击事件
*/
val adapter = SoundtListAdapter { _, _ ->
}
binding.evaluationVoiceRecyclerview.adapter = adapter
//返回按钮点击
binding.evaluationBar.setOnClickListener() {
binding.evaluationBar.setOnClickListener {
val mDialog = FirstDialog(context)
mDialog.setTitle("提示?")
mDialog.setMessage("是否退出,请确认!")
@@ -89,15 +102,13 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
}
//保存事件
binding.evaluationBarSave.setOnClickListener() {
binding.evaluationBarSave.setOnClickListener {
viewModel.saveData()
}
//删除事件
binding.evaluationBarDelete.setOnClickListener() {
binding.evaluationBarDelete.setOnClickListener {
viewModel.deleteData(requireContext())
}
/**
* 照片view
@@ -106,15 +117,26 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
val list = mutableListOf("1", "2", "3")
pictureAdapter.refreshData(list)
//照片左右选择键点击监听
binding.evaluationPictureLeft.setOnClickListener(this)
binding.evaluationPictureRight.setOnClickListener(this)
binding.evaluationCamera.setOnClickListener(this)
//设置照片偏移量
val viewPager = binding.evaluationPictureViewpager
val vto = viewPager.viewTreeObserver
vto.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
val width = viewPager.width
// 处理View宽度
// 在回调完成后需要将监听器从View树中移除以避免重复调用
viewPager.viewTreeObserver.removeOnGlobalLayoutListener(this)
val recyclerView = viewPager.getChildAt(0) as RecyclerView
val recyclerView = binding.evaluationPictureViewpager.getChildAt(0) as RecyclerView
recyclerView.setPadding(0, 0, Util.convertDpToPx(requireContext(), 50), 0)
recyclerView.clipToPadding = false
recyclerView.setPadding(0, 0, width / 2 - 30, 0)
recyclerView.clipToPadding = false
}
})
binding.evaluationVoice.setOnTouchListener { _, event ->
Log.e("qj", event?.action.toString())
@@ -123,11 +145,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
voiceOnTouchStart()//Do Something
}
MotionEvent.ACTION_UP -> {
voiceOnTouchStop()//Do Something
}
MotionEvent.ACTION_CANCEL -> {
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_OUTSIDE -> {
voiceOnTouchStop()//Do Something
}
}
@@ -138,22 +156,21 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
/**
* 读取元数据
*/
// val id = args.qsId
var id = ""
var signBean: SignBean? = null
var autoSave: Boolean = false
var filePath: String = ""
var autoSave = false
var filePath = ""
arguments?.let {
id = it.getString("QsId", "")
filePath = it.getString("filePath", "")
try {
signBean = it.getParcelable("SignBean")
autoSave = it.getBoolean("AutoSave")
} catch (e: java.lang.Exception) {
} catch (_: java.lang.Exception) {
}
}
if (id == null || id.isEmpty()) {
if (id.isEmpty()) {
viewModel.initNewData(signBean, filePath)
//增加监听,联动列表自动保存
viewModel.liveDataRightTypeList.observe(viewLifecycleOwner) {
@@ -164,102 +181,22 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
} else {
viewModel.initData(id)
}
// //监听大分类数据变化
// viewModel.liveDataClassTypeList.observe(viewLifecycleOwner) {
// if (it == null || it.isEmpty()) {
// Toast.makeText(requireContext(), "还没有导入元数据!", Toast.LENGTH_SHORT).show()
// } else {
// binding.evaluationClassType.adapter =
// ArrayAdapter(requireContext(), R.layout.text_item_select, it)
// }
// }
//
// viewModel.liveDataProblemTypeList.observe(viewLifecycleOwner){
// if (it == null || it.isEmpty()) {
// Toast.makeText(requireContext(), "还没有导入元数据!", Toast.LENGTH_SHORT).show()
// }else{
// binding.evaluationProblemType.adapter =
// ArrayAdapter(requireContext(), R.layout.text_item_select, it)
// }
// }
// //选择问题分类的回调
// binding.evaluationClassType.onItemSelectedListener =
// object : AdapterView.OnItemSelectedListener {
// override fun onItemSelected(
// parent: AdapterView<*>?, view: View?, position: Int, id: Long
// ) {
// viewModel.getProblemTypeList(position)
// }
//
// override fun onNothingSelected(parent: AdapterView<*>?) {}
// }
// /**
// * 监听联动选择的内容
// */
// viewModel.problemTypeListLiveData.observe(viewLifecycleOwner) {
// binding.evaluationClassTabLayout.let { tabLayout ->
// tabLayout.removeAllTabs()
// val fragmentList = mutableListOf<Fragment>()
// for (item in it) {
// val tab = tabLayout.newTab()
// tab.text = item
// tabLayout.addTab(tab)
// fragmentList.add(PhenomenonFragment(viewModel.currentClassType, item))
// }
// phenomenonFragmentAdapter =
// activity?.let { a -> EvaluationResultAdapter(a, fragmentList) }
// binding.evaluationViewpager.adapter = phenomenonFragmentAdapter
//
// TabLayoutMediator(
// binding.evaluationClassTabLayout,
// binding.evaluationViewpager
// ) { tab, position ->
// tab.text = it[position]
// }.attach()
// updateHeight(0)
// }
//
// }
viewModel.listDataChatMsgEntityList.observe(viewLifecycleOwner) {
adapter.refreshData(it)
}
//监听是否退出当前页面
viewModel.liveDataFinish.observe(viewLifecycleOwner) {
onBackPressed()
}
//监听要提示的信息
viewModel.liveDataToastMessage.observe(viewLifecycleOwner) {
Toast.makeText(requireContext(), it, Toast.LENGTH_SHORT).show()
}
// binding.evaluationViewpager.registerOnPageChangeCallback(object :
// ViewPager2.OnPageChangeCallback() {
// override fun onPageSelected(position: Int) {
// super.onPageSelected(position)
// updateHeight(position)
// }
// })
}
// private fun updateHeight(position: Int) {
// phenomenonFragmentAdapter?.let {
// if (it.fragmentList.size > position) {
// val fragment: Fragment = it.fragmentList[position]
// if (fragment.view != null) {
// val viewWidth = View.MeasureSpec.makeMeasureSpec(
// fragment.requireView().width, View.MeasureSpec.EXACTLY
// )
// val viewHeight =
// View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
// fragment.requireView().measure(viewWidth, viewHeight)
// binding.evaluationViewpager.let { viewpager ->
// if (viewpager.layoutParams.height != fragment.requireView().measuredHeight) {
// //必须要用对象去接收,然后修改该对象再采用该对象,否则无法生效...
// val layoutParams: ViewGroup.LayoutParams =
// viewpager.layoutParams
// layoutParams.height = fragment.requireView().measuredHeight
// viewpager.layoutParams = layoutParams
// }
// }
//
// }
// }
// }
//
// }
override fun onDestroyView() {
activity?.run {
findNavController(R.id.main_activity_middle_fragment).navigateUp()
@@ -279,6 +216,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
if (currentItem > 0) {
binding.evaluationPictureViewpager.currentItem = currentItem - 1
} else {
return
}
}
@@ -288,7 +226,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
if (currentItem < pictureAdapter.data.size - 1) {
binding.evaluationPictureViewpager.currentItem = currentItem + 1
} else {
return
}
}
//上三项,打开面板
@@ -338,8 +276,12 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
}
}
else -> {}
R.id.evaluation_camera -> {
takePhoto()
}
else -> {
return
}
}
}
}
@@ -362,4 +304,14 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
return true
}
private fun takePhoto() {
try {
val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
if (takePictureIntent.resolveActivity(requireActivity().packageManager) != null) {
mCameraLauncher!!.launch(takePictureIntent)
}
} catch (e: Exception) {
Log.d("TTTT", e.toString())
}
}
}

View File

@@ -3,6 +3,8 @@ package com.navinfo.omqs.ui.fragment.evaluationresult
import android.app.Activity
import android.app.Dialog
import android.content.Context
import android.content.SharedPreferences
import android.graphics.Bitmap
import android.graphics.drawable.AnimationDrawable
import android.graphics.drawable.BitmapDrawable
import android.os.Build
@@ -19,9 +21,12 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.blankj.utilcode.util.ToastUtils
import com.navinfo.collect.library.data.entity.AttachmentBean
import com.navinfo.collect.library.data.entity.HadLinkDvoBean
import com.navinfo.collect.library.data.entity.QsRecordBean
import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable
import com.navinfo.collect.library.data.entity.TaskBean
import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.map.OnGeoPointClickListener
import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.omqs.Constant
import com.navinfo.omqs.R
@@ -35,17 +40,14 @@ import com.navinfo.omqs.util.DateTimeUtil
import com.navinfo.omqs.util.SoundMeter
import com.navinfo.omqs.util.SpeakMode
import dagger.hilt.android.lifecycle.HiltViewModel
import io.realm.OrderedCollectionChangeSet
import io.realm.Realm
import io.realm.RealmList
import io.realm.RealmModel
import io.realm.RealmResults
import io.realm.kotlin.addChangeListener
import io.realm.kotlin.where
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.oscim.core.GeoPoint
import java.io.File
import java.io.FileOutputStream
import java.util.*
import javax.inject.Inject
@@ -54,9 +56,11 @@ class EvaluationResultViewModel @Inject constructor(
private val roomAppDatabase: RoomAppDatabase,
private val mapController: NIMapController,
private val realmOperateHelper: RealmOperateHelper,
) : ViewModel() {
private val sharedPreferences: SharedPreferences
) : ViewModel(), SharedPreferences.OnSharedPreferenceChangeListener {
private val markerTitle = "点选marker"
private val TAG = "点选marker"
/**
* 操作结束,销毁页面
@@ -68,20 +72,40 @@ class EvaluationResultViewModel @Inject constructor(
*/
val liveDataLeftTypeList = MutableLiveData<List<ScProblemTypeBean>>()
/**
* 问题类型 liveData 给[MiddleAdapter]展示的数据
*/
// val liveDataMiddleTypeList = MutableLiveData<List<String>>()
/**
* 问题现象 liveData 给[RightGroupHeaderAdapter]展示的数据
*/
val liveDataRightTypeList = MutableLiveData<List<RightBean>>()
var liveDataQsRecordBean = MutableLiveData<QsRecordBean>()
/**
* 要保存的评测数据
*/
val liveDataQsRecordBean = MutableLiveData(QsRecordBean(id = UUID.randomUUID().toString()))
var listDataChatMsgEntityList = MutableLiveData<MutableList<ChatMsgEntity>>()
/**
* 语音列表
*/
val listDataChatMsgEntityList = MutableLiveData<MutableList<ChatMsgEntity>>()
/**
* 照片列表
*/
val liveDataPictureList = MutableLiveData<MutableList<String>>()
/**
* toast信息
*/
val liveDataToastMessage = MutableLiveData<String>()
/**
* 当前选择的任务
*/
val liveDataTaskBean = MutableLiveData<TaskBean>()
/**
* 编辑数据时用来差分数据
*/
var oldBean: QsRecordBean? = null
//语音窗体
@@ -99,24 +123,27 @@ class EvaluationResultViewModel @Inject constructor(
var classCodeTemp: String = ""
init {
liveDataQsRecordBean.value = QsRecordBean(id = UUID.randomUUID().toString())
viewModelScope.launch {
mapController.onMapClickFlow.collect {
liveDataQsRecordBean.value!!.geometry = GeometryTools.createGeometry(it).toText()
mapController.markerHandle.addMarker(it, markerTitle)
viewModelScope.launch {
captureLink(it.longitude, it.latitude)
mapController.mMapView.addOnNIMapClickListener(TAG, object : OnGeoPointClickListener {
override fun onMapClick(tag: String, point: GeoPoint) {
if (tag == TAG) {
liveDataQsRecordBean.value!!.geometry =
GeometryTools.createGeometry(point).toText()
mapController.markerHandle.addMarker(point, TAG)
viewModelScope.launch {
captureLink(point)
}
}
}
}
})
sharedPreferences.registerOnSharedPreferenceChangeListener(this)
}
override fun onCleared() {
super.onCleared()
mapController.markerHandle.removeMarker(markerTitle)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mapController.lineHandler.removeLine()
}
mapController.mMapView.removeOnNIMapClickListener(TAG)
mapController.markerHandle.removeMarker(TAG)
mapController.lineHandler.removeLine()
}
@@ -124,42 +151,57 @@ class EvaluationResultViewModel @Inject constructor(
* 查询数据库,获取问题分类
*/
fun initNewData(bean: SignBean?, filePath: String) {
//获取当前定位点
val geoPoint = mapController.locationLayerHandler.getCurrentGeoPoint()
//如果不是从面板进来的
if (bean == null) {
geoPoint?.let {
liveDataQsRecordBean.value!!.geometry = GeometryTools.createGeometry(it).toText()
mapController.markerHandle.addMarker(geoPoint, markerTitle)
mapController.animationHandler.animationByLatLon(
geoPoint.latitude, geoPoint.longitude
)
viewModelScope.launch {
captureLink(geoPoint.longitude, geoPoint.latitude)
}
//查询元数据
viewModelScope.launch(Dispatchers.IO) {
/**
* 获取当前所选的任务
*/
val taskId = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1)
val realm = Realm.getDefaultInstance()
val objects = realm.where(TaskBean::class.java).equalTo("id", taskId).findFirst()
if (objects != null) {
liveDataTaskBean.postValue(realm.copyFromRealm(objects))
}
} else {
liveDataQsRecordBean.value?.run {
elementId = bean.renderEntity.code.toString()
linkId = bean.linkId
if (linkId.isNotEmpty()) {
viewModelScope.launch {
val link = realmOperateHelper.queryLink(linkId)
link?.let { l ->
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//获取当前定位点
val geoPoint = mapController.locationLayerHandler.getCurrentGeoPoint()
//如果不是从面板进来的
if (bean == null) {
geoPoint?.let {
liveDataQsRecordBean.value!!.geometry =
GeometryTools.createGeometry(it).toText()
withContext(Dispatchers.Main) {
mapController.markerHandle.addMarker(geoPoint, TAG)
mapController.animationHandler.animationByLatLon(
geoPoint.latitude, geoPoint.longitude
)
}
captureLink(geoPoint)
}
} else {
liveDataQsRecordBean.value?.run {
elementId = bean.renderEntity.code.toString()
linkId = bean.linkId
if (linkId.isNotEmpty()) {
viewModelScope.launch {
val link = realmOperateHelper.queryLink(linkId)
link?.let { l ->
mapController.lineHandler.showLine(l.geometry)
}
}
}
val point = GeometryTools.createGeoPoint(bean.renderEntity.geometry)
this.geometry = GeometryTools.createGeometry(point).toText()
withContext(Dispatchers.Main) {
mapController.animationHandler.animationByLatLon(
point.latitude, point.longitude
)
mapController.markerHandle.addMarker(point, TAG)
}
}
val point = GeometryTools.createGeoPoint(bean.renderEntity.geometry)
this.geometry = GeometryTools.createGeometry(point).toText()
mapController.animationHandler.animationByLatLon(point.latitude, point.longitude)
mapController.markerHandle.addMarker(point, markerTitle)
}
}
//查询元数据
viewModelScope.launch(Dispatchers.IO) {
getClassTypeList(bean)
getProblemLinkList()
}
@@ -167,23 +209,32 @@ class EvaluationResultViewModel @Inject constructor(
}
/**
* 捕捉道路
* 捕捉道路或新增评测link
*/
private suspend fun captureLink(longitude: Double, latitude: Double) {
private suspend fun captureLink(point: GeoPoint) {
if (liveDataTaskBean.value == null) {
liveDataToastMessage.postValue("请先选择所属任务!")
return
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val linkList = realmOperateHelper.queryLink(
point = GeoPoint(latitude, longitude),
)
liveDataQsRecordBean.value?.let {
if (linkList.isNotEmpty()) {
it.linkId = linkList[0].properties[LinkTable.linkPid] ?: ""
mapController.lineHandler.showLine(linkList[0].geometry)
Log.e("jingo", "捕捉到的linkId = ${it.linkId}")
val taskLink =
realmOperateHelper.captureTaskLink(liveDataTaskBean.value!!.id, point)
if (taskLink != null) {
it.linkId = taskLink.linkPid
mapController.lineHandler.showLine(taskLink.geometry)
return
} else {
it.linkId = ""
mapController.lineHandler.removeLine()
val linkList = realmOperateHelper.queryLink(point = point)
if (linkList.isNotEmpty()) {
it.linkId = linkList[0].properties[LinkTable.linkPid] ?: ""
mapController.lineHandler.showLine(linkList[0].geometry)
return
}
}
it.linkId = ""
mapController.lineHandler.removeLine()
}
}
}
@@ -201,10 +252,12 @@ class EvaluationResultViewModel @Inject constructor(
var classCode = list[0].elementCode
liveDataLeftTypeList.postValue(it)
if (bean != null) {
val classType2 = roomAppDatabase.getScProblemTypeDao().findClassTypeByCode(bean.renderEntity.code)
val classType2 = roomAppDatabase.getScProblemTypeDao()
.findClassTypeByCode(bean.renderEntity.code)
if (classType2 != null) {
classType = classType2
}
classCode = bean.renderEntity.code.toString()
}
//如果右侧栏没数据,给个默认值
if (liveDataQsRecordBean.value!!.classType.isEmpty()) {
@@ -291,11 +344,12 @@ class EvaluationResultViewModel @Inject constructor(
/**
* 查询问题类型列表
*/
fun getProblemTypeList(classType: String) {
fun getProblemTypeList(scProblemTypeBean: ScProblemTypeBean) {
viewModelScope.launch(Dispatchers.IO) {
getProblemList(classType)
getProblemList(scProblemTypeBean.classType)
}
classTypeTemp = classType
classTypeTemp = scProblemTypeBean.classType
classCodeTemp = scProblemTypeBean.elementCode
}
/**
@@ -315,19 +369,52 @@ class EvaluationResultViewModel @Inject constructor(
liveDataQsRecordBean.postValue(liveDataQsRecordBean.value)
}
/**
* 保存数据
*/
fun saveData() {
viewModelScope.launch(Dispatchers.IO) {
val taskBean = liveDataQsRecordBean.value!!
if (liveDataTaskBean.value == null) {
liveDataToastMessage.postValue("请选择所属任务!")
return@launch
} else if (taskBean.classType.isEmpty()) {
liveDataToastMessage.postValue("请选择要素分类!")
return@launch
} else if (taskBean.problemType.isEmpty()) {
liveDataToastMessage.postValue("请选择问题类型!")
return@launch
} else if (taskBean.phenomenon.isEmpty()) {
liveDataToastMessage.postValue("请选择问题现象!")
return@launch
} else if (taskBean.problemLink.isEmpty()) {
liveDataToastMessage.postValue("请选择问题环节!")
return@launch
} else if (taskBean.classType.isEmpty()) {
liveDataToastMessage.postValue("请选择问题分类!")
return@launch
} else if (taskBean.cause.isEmpty()) {
liveDataToastMessage.postValue("请选择初步分析原因!")
return@launch
}
val realm = Realm.getDefaultInstance()
liveDataQsRecordBean.value!!.taskId = liveDataTaskBean.value!!.id
liveDataQsRecordBean.value!!.checkTime = DateTimeUtil.getDataTime()
liveDataQsRecordBean.value!!.checkUserId = Constant.USER_REAL_NAME
realm.executeTransaction {
it.copyToRealmOrUpdate(liveDataQsRecordBean.value)
}
// realm.close()
mapController.markerHandle.addOrUpdateQsRecordMark(liveDataQsRecordBean.value!!)
liveDataFinish.postValue(true)
}
}
/**
* 删除数据
*/
fun deleteData(context: Context) {
val mDialog = FirstDialog(context)
mDialog.setTitle("提示?")
@@ -357,160 +444,222 @@ class EvaluationResultViewModel @Inject constructor(
*/
fun initData(id: String) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
viewModelScope.launch(Dispatchers.IO) {
viewModelScope.launch(Dispatchers.IO) {
Realm.getDefaultInstance().use { realm ->
realm.executeTransactionAsync { bgRealm ->
// find the item
val objects = bgRealm.where(QsRecordBean::class.java).equalTo("id", id).findFirst()
if (objects != null) {
oldBean = bgRealm.copyFromRealm(objects)
oldBean?.let {
liveDataQsRecordBean.postValue(it.copy())
val p = GeometryTools.createGeoPoint(it.geometry)
mapController.markerHandle.addMarker(GeoPoint(p.latitude, p.longitude), markerTitle)
val realm = Realm.getDefaultInstance()
val objects = realm.where(QsRecordBean::class.java).equalTo("id", id).findFirst()
Log.e("jingo", "查询数据 id= $id")
if (objects != null) {
oldBean = realm.copyFromRealm(objects)
oldBean?.let {
/**
* 获取当前所选的任务
*/
val objects =
realm.where(TaskBean::class.java).equalTo("id", it.taskId).findFirst()
if (objects != null) {
liveDataTaskBean.postValue(realm.copyFromRealm(objects))
}
//获取linkid
if (it.linkId.isNotEmpty()) {
viewModelScope.launch(Dispatchers.IO) {
val link = realmOperateHelper.queryLink(it.linkId)
link?.let { l ->
mapController.lineHandler.showLine(l.geometry)
}
}
}
liveDataQsRecordBean.value?.attachmentBeanList = it.attachmentBeanList
// 显示语音数据到界面
getChatMsgEntityList()
liveDataQsRecordBean.postValue(it.copy())
val p = GeometryTools.createGeoPoint(it.geometry)
mapController.markerHandle.addMarker(
GeoPoint(
p.latitude, p.longitude
), TAG, "", null
)
//获取linkid
if (it.linkId.isNotEmpty()) {
val link = realmOperateHelper.queryLink(it.linkId)
if (link != null) {
mapController.lineHandler.showLine(link.geometry)
} else {
val realmR = realm.where(HadLinkDvoBean::class.java)
.equalTo("linkPid", it.linkId).and().equalTo("taskId", it.taskId)
.findFirst()
if (realmR != null) {
mapController.lineHandler.showLine(realmR.geometry)
}
}
}
liveDataQsRecordBean.value?.attachmentBeanList = it.attachmentBeanList
// 显示语音数据到界面
getChatMsgEntityList()
}
} else {
liveDataToastMessage.postValue("数据读取失败")
}
}
}
/**
* 查询问题类型列表
*/
private suspend fun getChatMsgEntityList() {
val chatMsgEntityList: MutableList<ChatMsgEntity> = ArrayList()
liveDataQsRecordBean.value?.attachmentBeanList?.forEach {
//1 录音
if (it.type == 1) {
val chatMsgEntity = ChatMsgEntity()
chatMsgEntity.name = it.name
chatMsgEntity.voiceUri = Constant.USER_DATA_ATTACHEMNT_PATH
chatMsgEntityList.add(chatMsgEntity)
}
}
listDataChatMsgEntityList.postValue(chatMsgEntityList)
}
fun addChatMsgEntity(filePath: String) {
if (filePath.isNotEmpty()) {
var chatMsgEntityList: MutableList<ChatMsgEntity> = ArrayList()
if (listDataChatMsgEntityList.value?.isEmpty() == false) {
chatMsgEntityList = listDataChatMsgEntityList.value!!
}
val chatMsgEntity = ChatMsgEntity()
chatMsgEntity.name = filePath.replace(Constant.USER_DATA_ATTACHEMNT_PATH, "").toString()
chatMsgEntity.voiceUri = Constant.USER_DATA_ATTACHEMNT_PATH
chatMsgEntityList.add(chatMsgEntity)
var attachmentList: RealmList<AttachmentBean> = RealmList()
//赋值处理
if (liveDataQsRecordBean.value?.attachmentBeanList?.isEmpty() == false) {
attachmentList = liveDataQsRecordBean.value?.attachmentBeanList!!
}
val attachmentBean = AttachmentBean()
attachmentBean.name = chatMsgEntity.name!!
attachmentBean.type = 1
attachmentList.add(attachmentBean)
liveDataQsRecordBean.value?.attachmentBeanList = attachmentList
listDataChatMsgEntityList.postValue(chatMsgEntityList)
}
}
fun startSoundMetter(activity: Activity, v: View) {
if (mSpeakMode == null) {
mSpeakMode = SpeakMode(activity)
}
//语音识别动画
if (pop == null) {
pop = PopupWindow()
pop!!.width = ViewGroup.LayoutParams.MATCH_PARENT
pop!!.height = ViewGroup.LayoutParams.WRAP_CONTENT
pop!!.setBackgroundDrawable(BitmapDrawable())
val view =
View.inflate(activity as Context, R.layout.cv_card_voice_rcd_hint_window, null)
pop!!.contentView = view
volume = view.findViewById(R.id.volume)
}
pop!!.update()
Constant.IS_VIDEO_SPEED = true
//录音动画
if (pop != null) {
pop!!.showAtLocation(v, Gravity.CENTER, 0, 0)
}
volume!!.setBackgroundResource(R.drawable.pop_voice_img)
val animation = volume!!.background as AnimationDrawable
animation.start()
val name: String = DateTimeUtil.getTimeSSS().toString() + ".m4a"
if (mSoundMeter == null) {
mSoundMeter = SoundMeter()
}
mSoundMeter!!.setmListener(object : SoundMeter.OnSoundMeterListener {
@RequiresApi(Build.VERSION_CODES.Q)
override fun onSuccess(filePath: String?) {
if (!TextUtils.isEmpty(filePath) && File(filePath).exists()) {
if (File(filePath) == null || File(filePath).length() < 1600) {
ToastUtils.showLong("语音时间太短,无效!")
mSpeakMode!!.speakText("语音时间太短,无效")
stopSoundMeter()
return
}
}
mSpeakMode!!.speakText("结束录音")
addChatMsgEntity(filePath!!)
}
@RequiresApi(api = Build.VERSION_CODES.Q)
override fun onfaild(message: String?) {
ToastUtils.showLong("录制失败!")
mSpeakMode!!.speakText("录制失败")
stopSoundMeter()
}
})
mSoundMeter!!.start(Constant.USER_DATA_ATTACHEMNT_PATH + name)
ToastUtils.showLong("开始录音")
mSpeakMode!!.speakText("开始录音")
}
//停止语音录制
@RequiresApi(api = Build.VERSION_CODES.Q)
fun stopSoundMeter() {
//先重置标识,防止按钮抬起时触发语音结束
Constant.IS_VIDEO_SPEED = false
if (mSoundMeter != null && mSoundMeter!!.isStartSound) {
mSoundMeter!!.stop()
}
pop?.let {
if (it.isShowing) {
it.dismiss()
}
}
}
fun savePhoto(bitmap: Bitmap) {
viewModelScope.launch(Dispatchers.IO) {
// 创建一个名为 "MyApp" 的文件夹
val myAppDir = File(Constant.USER_DATA_ATTACHEMNT_PATH)
if (!myAppDir.exists()) myAppDir.mkdirs() // 确保文件夹已创建
// 创建一个名为 fileName 的文件
val file = File(myAppDir, "${UUID.randomUUID()}.png")
file.createNewFile() // 创建文件
// 将 Bitmap 压缩为 JPEG 格式,并将其写入文件中
val out = FileOutputStream(file)
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out)
out.flush()
out.close()
var picList = mutableListOf<String>()
if (liveDataPictureList.value == null) {
picList.add(file.absolutePath)
} else {
picList.addAll(liveDataPictureList.value!!)
picList.add(file.absolutePath)
}
liveDataPictureList.postValue(picList)
}
}
/**
* 查询问题类型列表
* 监听任务选择变化
*/
@RequiresApi(Build.VERSION_CODES.N)
fun getChatMsgEntityList() {
val chatMsgEntityList: MutableList<ChatMsgEntity> = ArrayList()
liveDataQsRecordBean.value?.attachmentBeanList?.forEach {
//1 录音
if (it.type == 1) {
val chatMsgEntity = ChatMsgEntity()
chatMsgEntity.name = it.name
chatMsgEntity.voiceUri = Constant.USER_DATA_ATTACHEMNT_PATH
chatMsgEntityList.add(chatMsgEntity)
}
}
listDataChatMsgEntityList.postValue(chatMsgEntityList)
}
fun addChatMsgEntity(filePath: String) {
if (filePath.isNotEmpty()) {
var chatMsgEntityList: MutableList<ChatMsgEntity> = ArrayList()
if (listDataChatMsgEntityList.value?.isEmpty() == false) {
chatMsgEntityList = listDataChatMsgEntityList.value!!
}
val chatMsgEntity = ChatMsgEntity()
chatMsgEntity.name = filePath.replace(Constant.USER_DATA_ATTACHEMNT_PATH, "").toString()
chatMsgEntity.voiceUri = Constant.USER_DATA_ATTACHEMNT_PATH
chatMsgEntityList.add(chatMsgEntity)
var attachmentList: RealmList<AttachmentBean> = RealmList()
//赋值处理
if (liveDataQsRecordBean.value?.attachmentBeanList?.isEmpty() == false) {
attachmentList = liveDataQsRecordBean.value?.attachmentBeanList!!
}
val attachmentBean = AttachmentBean()
attachmentBean.name = chatMsgEntity.name!!
attachmentBean.type = 1
attachmentList.add(attachmentBean)
liveDataQsRecordBean.value?.attachmentBeanList = attachmentList
listDataChatMsgEntityList.postValue(chatMsgEntityList)
}
}
fun startSoundMetter(activity: Activity, v: View) {
if (mSpeakMode == null) {
mSpeakMode = SpeakMode(activity)
}
//语音识别动画
if (pop == null) {
pop = PopupWindow()
pop!!.width = ViewGroup.LayoutParams.MATCH_PARENT
pop!!.height = ViewGroup.LayoutParams.WRAP_CONTENT
pop!!.setBackgroundDrawable(BitmapDrawable())
val view =
View.inflate(activity as Context, R.layout.cv_card_voice_rcd_hint_window, null)
pop!!.contentView = view
volume = view.findViewById(R.id.volume)
}
pop!!.update()
Constant.IS_VIDEO_SPEED = true
//录音动画
if (pop != null) {
pop!!.showAtLocation(v, Gravity.CENTER, 0, 0)
}
volume!!.setBackgroundResource(R.drawable.pop_voice_img)
val animation = volume!!.background as AnimationDrawable
animation.start()
val name: String = DateTimeUtil.getTimeSSS().toString() + ".m4a"
if (mSoundMeter == null) {
mSoundMeter = SoundMeter()
}
mSoundMeter!!.setmListener(object : SoundMeter.OnSoundMeterListener {
@RequiresApi(Build.VERSION_CODES.Q)
override fun onSuccess(filePath: String?) {
if (!TextUtils.isEmpty(filePath) && File(filePath).exists()) {
if (File(filePath) == null || File(filePath).length() < 1600) {
ToastUtils.showLong("语音时间太短,无效!")
mSpeakMode!!.speakText("语音时间太短,无效")
stopSoundMeter()
return
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
if (key == Constant.SELECT_TASK_ID && oldBean == null) {
viewModelScope.launch(Dispatchers.IO) {
val taskId = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1)
val realm = Realm.getDefaultInstance()
val objects = realm.where(TaskBean::class.java).equalTo("id", taskId).findFirst()
if (objects != null) {
liveDataTaskBean.postValue(realm.copyFromRealm(objects))
}
mSpeakMode!!.speakText("结束录音")
addChatMsgEntity(filePath!!)
}
@RequiresApi(api = Build.VERSION_CODES.Q)
override fun onfaild(message: String?) {
ToastUtils.showLong("录制失败!")
mSpeakMode!!.speakText("录制失败")
stopSoundMeter()
}
})
mSoundMeter!!.start(Constant.USER_DATA_ATTACHEMNT_PATH + name)
ToastUtils.showLong("开始录音")
mSpeakMode!!.speakText("开始录音")
}
//停止语音录制
@RequiresApi(api = Build.VERSION_CODES.Q)
fun stopSoundMeter() {
//先重置标识,防止按钮抬起时触发语音结束
Constant.IS_VIDEO_SPEED = false
if (mSoundMeter != null && mSoundMeter!!.isStartSound()) {
mSoundMeter!!.stop()
}
if (pop != null && pop!!.isShowing) pop!!.dismiss()
}
}
}

View File

@@ -1,16 +1,13 @@
package com.navinfo.omqs.ui.fragment.evaluationresult
import android.os.Build
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.annotation.RequiresApi
import com.navinfo.omqs.R
import com.navinfo.omqs.bean.ScProblemTypeBean
import com.navinfo.omqs.databinding.TextItemSelectBinding
import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter
import com.navinfo.omqs.ui.other.BaseViewHolder
class LeftAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) :
class LeftAdapter(private var itemListener: ((Int, ScProblemTypeBean) -> Unit?)? = null) :
BaseRecyclerViewAdapter<ScProblemTypeBean>() {
private var selectTitle = ""
@@ -21,7 +18,6 @@ class LeftAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) :
return BaseViewHolder(viewBinding)
}
@RequiresApi(Build.VERSION_CODES.M)
override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
val bd = holder.viewBinding as TextItemSelectBinding
val title = data[position]
@@ -32,7 +28,7 @@ class LeftAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) :
selectTitle = title.classType
notifyDataSetChanged()
}
itemListener?.invoke(position, title.classType)
itemListener?.invoke(position, title)
}
}

View File

@@ -20,7 +20,6 @@ class MiddleAdapter(private var itemListener: ((Int, String) -> Unit?)? = null)
return BaseViewHolder(viewBinding)
}
@RequiresApi(Build.VERSION_CODES.M)
override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
val bd = holder.viewBinding as TextItemSelectBinding
val title = data[position]
@@ -30,10 +29,10 @@ class MiddleAdapter(private var itemListener: ((Int, String) -> Unit?)? = null)
bd.itemLayout.layoutParams = layoutParams
if (selectTitle == title) {
bd.itemId.setBackgroundResource(R.drawable.shape_bg_blue_bg_4_radius)
bd.itemId.setTextColor(holder.viewBinding.root.context.getColor(R.color.white))
bd.itemId.setTextColor(holder.viewBinding.root.context.resources.getColor(R.color.white))
} else {
bd.itemId.setBackgroundResource(R.drawable.shape_rect_white_2dp_bg)
bd.itemId.setTextColor(holder.viewBinding.root.context.getColor(R.color.black))
bd.itemId.setTextColor(holder.viewBinding.root.context.resources.getColor(R.color.black))
}
bd.root.setOnClickListener {
if (selectTitle != title) {

View File

@@ -73,13 +73,11 @@ class PhenomenonFragment :
}
binding.phenomenonRightRecyclerview.adapter = rightAdapter
//右侧菜单增加组标题
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
binding.phenomenonRightRecyclerview.addItemDecoration(
RightGroupHeaderDecoration(
requireContext()
)
binding.phenomenonRightRecyclerview.addItemDecoration(
RightGroupHeaderDecoration(
requireContext()
)
}
)
//右侧菜单查询数据监听
viewModel.liveDataRightTypeList.observe(viewLifecycleOwner) {
rightAdapter.setSelectTitle(viewModel.liveDataQsRecordBean.value!!.phenomenon)

View File

@@ -1,8 +1,6 @@
package com.navinfo.omqs.ui.fragment.evaluationresult
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@@ -50,13 +48,11 @@ class ProblemLinkFragment : BaseFragment() {
}
binding.linkRightRecyclerview.adapter = rightAdapter
//右侧菜单增加组标题
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
binding.linkRightRecyclerview.addItemDecoration(
RightGroupHeaderDecoration(
requireContext()
)
binding.linkRightRecyclerview.addItemDecoration(
RightGroupHeaderDecoration(
requireContext()
)
}
)
//右侧菜单查询数据监听
viewModel.liveDataRightTypeList.observe(viewLifecycleOwner) {
rightAdapter.setSelectTitle(viewModel.liveDataQsRecordBean.value!!.cause)

View File

@@ -5,9 +5,7 @@ import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Rect
import android.os.Build
import android.view.View
import androidx.annotation.RequiresApi
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ItemDecoration
@@ -17,7 +15,6 @@ import com.navinfo.omqs.R
/**
* 自定义装饰器(实现分组+吸顶效果)
*/
@RequiresApi(Build.VERSION_CODES.M)
class RightGroupHeaderDecoration(context: Context) : ItemDecoration() {
//头部的高
private val mItemHeaderHeight: Int
@@ -35,7 +32,7 @@ class RightGroupHeaderDecoration(context: Context) : ItemDecoration() {
mTextPaddingLeft = dp2px(context, 6f)
mTextRect = Rect()
mItemHeaderPaint = Paint(Paint.ANTI_ALIAS_FLAG)
mItemHeaderPaint.color = context.getColor(R.color.btn_bg_blue)
mItemHeaderPaint.color = context.resources.getColor(R.color.btn_bg_blue)
mTextPaint = Paint(Paint.ANTI_ALIAS_FLAG)
mTextPaint.textSize = 46f
mTextPaint.color = Color.WHITE

View File

@@ -0,0 +1,152 @@
package com.navinfo.omqs.ui.fragment.note
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.FragmentCanvasBinding
import com.navinfo.omqs.databinding.FragmentNoteBinding
import com.navinfo.omqs.databinding.FragmentProblemLinkBinding
import com.navinfo.omqs.ui.fragment.BaseFragment
import com.navinfo.omqs.ui.fragment.note.CanvasView.CanvasStyle
import com.navinfo.omqs.ui.fragment.note.CanvasView.OnCanvasChangeListener
import com.navinfo.omqs.ui.other.shareViewModels
/**
* @author zhjch
* @version V1.0
* @ClassName: CanvasFragment
* @Date 2016/5/10
* @Description: ${TODO}(绘制画布)
*/
class CanvasFragment : BaseFragment() {
/**
* 获取画布
*
* @return
*/
/**
* 画布
*/
private val canvasView by lazy { binding.canvasView }
/**
* 画笔线型
*/
private var mStyle = CanvasStyle.FREE_LINE
/**
* 画笔颜色
*/
private var mColor = -1
/**
* 画笔粗细
*/
private var width = 5
/**
* 画布回调接口
*/
private var listener: OnCanvasChangeListener? = null
private var _binding: FragmentCanvasBinding? = null
private val binding get() = _binding!!
private val viewModel by shareViewModels<NoteViewModel>("note")
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View {
_binding = FragmentCanvasBinding.inflate(inflater, container, false)
viewModel.initCanvasView(canvasView)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
canvasView.setStyle(mStyle)
if (mColor == -1) {
mColor = resources.getColor(R.color.black)
}
canvasView.setPaintColor(mColor)
canvasView.setPaintWidth(width)
if (listener != null) {
canvasView.setOnCanvasChangeListener(listener)
}
// * 开关橡皮擦
// */
// viewModel.liveEraserData.observe(viewLifecycleOwner) {
// canvasView.setEraser(it)
// }
// /**
// * 清除
// */
// viewModel.liveClearData.observe(viewLifecycleOwner) {
// canvasView.removeAllPaint()
// }
// /**
// * 回退上一笔
// */
// viewModel.liveBackData.observe(viewLifecycleOwner) {
// canvasView.back()
// }
// /**
// * 撤销回退
// */
// viewModel.liveForward.observe(viewLifecycleOwner) {
// canvasView.forward()
// }
//
}
/**
* 将数据转化并绘制在画板上
*
* @param value
*/
fun setDrawPathList(value: MutableList<CanvasView.DrawPath>) {
if (value != null && value.isNotEmpty()) {
canvasView.setDrawPathList(value)
}
}
/**
* 设置草图画笔线型
*/
fun setStyle(style: CanvasStyle) {
mStyle = style
canvasView.setStyle(style)
}
/**
* 设置画笔颜色
*/
fun setPaintColor(color: Int) {
mColor = color
canvasView.setPaintColor(mColor)
}
/**
* 设置画笔粗细
*/
fun setPaintWidth(width: Int) {
this.width = width
canvasView.setPaintWidth(width)
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,424 @@
package com.navinfo.omqs.ui.fragment.note
import android.graphics.Path
import android.graphics.Point
import android.graphics.Rect
import android.graphics.RectF
import android.text.TextUtils
import com.navinfo.collect.library.data.entity.NoteBean
import com.navinfo.collect.library.data.entity.SketchAttachContent
import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.omqs.ui.fragment.note.CanvasView.CanvasStyle
import io.realm.RealmList
import org.locationtech.jts.geom.Coordinate
import org.oscim.backend.canvas.Color
import org.oscim.core.GeoPoint
import java.util.UUID
import kotlin.math.abs
import kotlin.math.cos
import kotlin.math.sin
/**
* @author zhjch
* @version V1.0
* @ClassName: CanvasViewHelper
* @Date 2016/5/16
* @Description: ${TODO}(用一句话描述该文件做什么)
*/
object CanvasViewHelper {
private const val mD2I = 3600000
fun createNoteBean(
controller: NIMapController,
mCurrentPaths: List<CanvasView.DrawPath>,
): NoteBean {
val noteBean = NoteBean(UUID.randomUUID().toString())
if (mCurrentPaths.isNotEmpty()) {
val list: RealmList<SketchAttachContent> = RealmList<SketchAttachContent>()
noteBean.list = list
for (index in mCurrentPaths.indices) {
val dp: CanvasView.DrawPath = mCurrentPaths[index]
val geo = SketchAttachContent(UUID.randomUUID().toString())
val pointList = dp.pointList ?: continue
if (dp.style === CanvasStyle.GREENLAND_LINE || dp.style === CanvasStyle.WATER_LINE || dp.style === CanvasStyle.PARKING_LINE) {
val geoPointList = mutableListOf<GeoPoint>()
for (i in pointList.indices) {
val point = pointList[i]
val geoPoint: GeoPoint = controller.viewportHandler.fromScreenPoint(
point
)
geoPointList.add(geoPoint)
if (index == 0 && i == 0) {
noteBean.guideGeometry =
GeometryTools.createGeometry(geoPoint).toText()
}
}
geo.style = createLineStyle(dp.style, dp.width, dp.color)
geo.geometry = GeometryTools.createPolygon(geoPointList).toText()
} else if (dp.style === CanvasStyle.CIRCULAR_POINT) {
val point = pointList[0]
val geoPoint: GeoPoint = controller.viewportHandler.fromScreenPoint(point)
geo.style = createLineStyle(dp.style, dp.width, dp.color)
geo.geometry = GeometryTools.createGeometry(geoPoint).toText()
noteBean.guideGeometry = geo.geometry
} else if (dp.style === CanvasStyle.ELLIPSE_LINE) {
dp.rect?.let {
val pointLT = Point(it.left, it.top)
val pointRB = Point(it.right, it.bottom)
val geoPointLT: GeoPoint =
controller.viewportHandler.fromScreenPoint(pointLT)
val geoPointRB: GeoPoint =
controller.viewportHandler.fromScreenPoint(pointRB)
val minX: Double
val maxX: Double
val minY: Double
val maxY: Double
if (geoPointLT.longitude < geoPointRB.longitude) {
minX = (geoPointLT.longitude * mD2I)
maxX = (geoPointRB.longitude * mD2I)
} else {
minX = (geoPointRB.longitude * mD2I)
maxX = (geoPointLT.longitude * mD2I)
}
if (geoPointLT.latitude < geoPointRB.latitude) {
minY = (geoPointLT.latitude * mD2I)
maxY = (geoPointRB.latitude * mD2I)
} else {
minY = (geoPointRB.latitude * mD2I)
maxY = (geoPointLT.latitude * mD2I)
}
val xR = (maxX - minX) / 2
val yR = (maxY - minY) / 2
var a = 0.0
var tempX = xR * cos(a) + xR + minX
val tempY = yR * sin(a) + yR + minY
val firstX = tempX
val geoPointList = mutableListOf<GeoPoint>()
geoPointList.add(GeoPoint(tempX / mD2I, tempY / mD2I))
var bLeft = false
var bRight = false
var zeng = 0.1
if (controller.mMapView.mapLevel >= 20) {
zeng = 0.2
}
while (!bLeft || !bRight) {
a += zeng
val x1 = (xR * cos(a) + xR + minX).toInt().toDouble()
val y1 = (yR * sin(a) + yR + minY).toInt().toDouble()
if (!bLeft && x1 > tempX) {
bLeft = true
}
if (!bRight && bLeft && x1 <= tempX) {
bRight = true
geoPointList.add(
GeoPoint(
firstX / mD2I,
tempY / mD2I
)
)
} else {
tempX = x1
geoPointList.add(GeoPoint(x1 / mD2I, y1 / mD2I))
}
}
if (index == 0) {
noteBean.guideGeometry =
GeometryTools.createGeometry(geoPointList[0]).toText()
}
geo.style = createLineStyle(dp.style, dp.width, dp.color)
geo.geometry = GeometryTools.createLineString(geoPointList).toText()
}
} else {
val geoPointList = mutableListOf<GeoPoint>()
for (i in pointList.indices) {
val point = pointList[i]
val geoPoint: GeoPoint =
controller.viewportHandler.fromScreenPoint(point)
geoPointList.add(geoPoint)
if (index == 0 && i == 0) {
noteBean.guideGeometry =
GeometryTools.createGeometry(geoPoint).toText()
}
}
geo.style = createLineStyle(dp.style, dp.width, dp.color)
geo.geometry = GeometryTools.createLineString(geoPointList).toText()
}
list.add(geo)
}
}
return noteBean
}
fun createDrawPaths(
controller: NIMapController,
att: NoteBean
): MutableList<CanvasView.DrawPath> {
val contents: List<SketchAttachContent> = att.list
val drawPaths: MutableList<CanvasView.DrawPath> = mutableListOf()
var width = 5
var canvasStyle = CanvasStyle.FREE_LINE
var color = Color.BLACK
for (geo in contents) {
var max_x = 0
var max_y = 0
var min_x = 0
var min_y = 0
val style = geo.style
if (!TextUtils.isEmpty(style) && style.length > 3) {
try {
if (style.startsWith("4")) {
canvasStyle = CanvasStyle.RAILWAY_LINE
} else if (style.startsWith("5")) {
if (style.contains("cde3ac")) {
canvasStyle = CanvasStyle.GREENLAND_LINE
} else if (style.contains("abcaff")) {
canvasStyle = CanvasStyle.WATER_LINE
} else if (style.contains("fffe98")) {
canvasStyle = CanvasStyle.PARKING_LINE
}
} else {
val s = style.substring(0, 1)
if (TextUtils.equals(s, "2")) {
canvasStyle = CanvasStyle.STRAIGHT_LINE
} else if (TextUtils.equals(s, "3")) {
canvasStyle = CanvasStyle.RECT_LINE
} else if (TextUtils.equals(s, "6")) {
canvasStyle = CanvasStyle.POLY_LINE
} else if (TextUtils.equals(s, "7")) {
canvasStyle = CanvasStyle.ELLIPSE_LINE
} else if (TextUtils.equals(s, "9")) {
canvasStyle = CanvasStyle.CIRCULAR_POINT
} else if (TextUtils.equals(s, "1")) {
canvasStyle = CanvasStyle.FREE_LINE
}
width = style.substring(1, 3).toInt()
var colorStr = style.substring(3, style.length)
if (colorStr.length == 6) {
colorStr = "ff$colorStr"
} else if (colorStr.length == 8) {
} else {
colorStr = "ff000000"
}
color = colorStr.toLong(16).toInt()
}
} catch (e: Exception) {
e.printStackTrace()
}
val path = Path()
val pointList: MutableList<Point> = ArrayList()
if (canvasStyle === CanvasStyle.GREENLAND_LINE || canvasStyle === CanvasStyle.WATER_LINE || canvasStyle === CanvasStyle.PARKING_LINE) {
// val polygonGeometry: PolygonGeometry = geo.geo as PolygonGeometry
// if (polygonGeometry != null) {
// val xyz: Array<Array<DoubleArray>> = polygonGeometry.getCoordinates()
// if (xyz != null && xyz.isNotEmpty() && xyz[0].size > 1) {
// var geoPoint: GeoPoint? = GeoPoint(xyz[0][0][0], xyz[0][0][1])
// val movePoint: Point = .geoToScreen(geoPoint)
// max_x = movePoint.x
// max_y = movePoint.y
// min_x = movePoint.x
// min_y = movePoint.y
// path.reset()
// path.moveTo(movePoint.x.toFloat(), movePoint.y.toFloat())
// pointList.add(Point(movePoint.x, movePoint.y))
// for (i in 1 until xyz[0].size) {
// val x_y = xyz[0][i]
// if (x_y != null) {
// geoPoint = GeoPoint(x_y[0], x_y[1])
// val point: Point = projection.geoToScreen(geoPoint)
// if (point.x > max_x) {
// max_x = point.x
// }
// if (point.x < min_x) {
// min_x = point.x
// }
// if (point.y > max_y) {
// max_y = point.y
// }
// if (point.y < min_y) {
// min_y = point.y
// }
// path.lineTo(point.x.toFloat(), point.y.toFloat())
// pointList.add(point)
// }
// }
// path.close()
// }
// }
// val drawPath =
// CanvasView.DrawPath(pointList[0], path, width, color, canvasStyle)
// val rect = Rect(min_x, min_y, max_x, max_y)
// drawPath.rect = rect
// drawPath.pointList = pointList
// drawPaths.add(drawPath)
} else if (canvasStyle === CanvasStyle.CIRCULAR_POINT) {
// val pointGeometry: PointGeometry = geo.geo as PointGeometry
// if (pointGeometry != null && pointGeometry.getCoordinates() != null) {
// val geoPoint: GeoPoint = GeoPoint(
// pointGeometry.getCoordinates().get(0),
// pointGeometry.getCoordinates().get(1)
// )
// val movePoint: Point = projection.geoToScreen(geoPoint)
// pointList.add(movePoint)
// val drawPath = DrawPath(movePoint, path, width, color, canvasStyle)
// val rect = Rect(
// movePoint.x - width - 20,
// movePoint.y - width - 20,
// movePoint.x + width + 20,
// movePoint.y + width + 20
// )
// drawPath.rect = rect
// drawPath.pointList = pointList
// drawPaths.add(drawPath)
// }
} else if (canvasStyle === CanvasStyle.ELLIPSE_LINE) {
// val lineGeometry = GeometryTools.createGeometry(geo.geometry)
// if (lineGeometry != null) {
// val xys: Array<out Coordinate> = lineGeometry.coordinates
// if (xys != null && xys.size > 1) {
// var geoPoint: GeoPoint? = GeoPoint(xys[0].y, xys[0].x)
// val movePoint: Point = projection.geoToScreen(geoPoint)
// max_x = movePoint.x
// max_y = movePoint.y
// min_x = movePoint.x
// min_y = movePoint.y
// path.reset()
// path.moveTo(movePoint.x.toFloat(), movePoint.y.toFloat())
// pointList.add(Point(movePoint.x, movePoint.y))
// for (i in 1 until xys.size) {
// val x_y = xys[i]
// geoPoint = GeoPoint(x_y[0], x_y[1])
// val point: Point = projection.geoToScreen(geoPoint)
// if (point.x > max_x) {
// max_x = point.x
// }
// if (point.x < min_x) {
// min_x = point.x
// }
// if (point.y > max_y) {
// max_y = point.y
// }
// if (point.y < min_y) {
// min_y = point.y
// }
// pointList.add(point)
// }
// path.addOval(
// RectF(
// min_x.toFloat(),
// min_y.toFloat(),
// max_x.toFloat(),
// max_y.toFloat()
// ), Path.Direction.CW
// )
// }
// }
// val drawPath =
// CanvasView.DrawPath(pointList[0], path, width, color, canvasStyle)
// val rect = Rect(min_x, min_y, max_x, max_y)
// drawPath.rect = rect
// drawPath.pointList = pointList
// drawPaths.add(drawPath)
} else {
val lineGeometry = GeometryTools.createGeometry(geo.geometry)
if (lineGeometry != null) {
val xys: Array<out Coordinate> = lineGeometry.coordinates
if (xys.size > 1) {
var geoPoint = GeoPoint(xys[0].y, xys[0].x)
val movePoint: Point =
controller.viewportHandler.toScreenPoint(geoPoint)
max_x = movePoint.x
max_y = movePoint.y
min_x = movePoint.x
min_y = movePoint.y
path.reset()
path.moveTo(movePoint.x.toFloat(), movePoint.y.toFloat())
pointList.add(Point(movePoint.x, movePoint.y))
for (i in 1 until xys.size) {
val x_y = xys[i]
geoPoint = GeoPoint(x_y.y, x_y.x)
val point: Point =
controller.viewportHandler.toScreenPoint(geoPoint)
if (point.x > max_x) {
max_x = point.x
}
if (point.x < min_x) {
min_x = point.x
}
if (point.y > max_y) {
max_y = point.y
}
if (point.y < min_y) {
min_y = point.y
}
if (canvasStyle === CanvasStyle.FREE_LINE) {
val dx = abs(point.x - movePoint.x).toFloat()
val dy = abs(point.y - movePoint.y).toFloat()
if (dx >= 4 || dy >= 4) {
path.quadTo(
movePoint.x.toFloat(),
movePoint.y.toFloat(),
((point.x + movePoint.x) / 2).toFloat(),
((point.y + movePoint.y) / 2).toFloat()
) //源代码是这样写的,可是我没有弄明白,为什么要这样?
movePoint.x = point.x
movePoint.y = point.y
}
} else {
path.lineTo(point.x.toFloat(), point.y.toFloat())
}
pointList.add(point)
}
}
}
val drawPath =
CanvasView.DrawPath(pointList[0], path, width, color, canvasStyle)
val rect = Rect(min_x, min_y, max_x, max_y)
drawPath.rect = rect
drawPath.pointList = pointList
drawPaths.add(drawPath)
}
}
}
return drawPaths
}
private fun createLineStyle(canvasStyle: CanvasStyle, width: Int, color: Int): String {
val style = StringBuilder()
if (canvasStyle === CanvasStyle.RAILWAY_LINE) {
return "4060070c004ffffff16"
} else if (canvasStyle === CanvasStyle.GREENLAND_LINE) {
return "50200b050cde3ac"
} else if (canvasStyle === CanvasStyle.WATER_LINE) {
return "50200b050abcaff"
} else if (canvasStyle === CanvasStyle.PARKING_LINE) {
return "502a6a6a6fffe98"
}
if (canvasStyle === CanvasStyle.STRAIGHT_LINE) {
style.append("2")
} else if (canvasStyle === CanvasStyle.RECT_LINE) {
style.append("3")
} else if (canvasStyle === CanvasStyle.POLY_LINE) {
style.append("6")
} else if (canvasStyle === CanvasStyle.ELLIPSE_LINE) {
style.append("7")
} else if (canvasStyle === CanvasStyle.CIRCULAR_POINT) {
style.append("9")
} else {
style.append("1")
}
if (width < 10) {
style.append("0")
}
style.append(width.toString())
try {
var colorString = Integer.toHexString(color).toString()
if (colorString.length == 8) {
colorString = TextUtils.substring(colorString, 2, 8)
}
style.append(colorString)
} catch (e: Exception) {
e.printStackTrace()
}
return style.toString()
}
}

View File

@@ -0,0 +1,135 @@
package com.navinfo.omqs.ui.fragment.note
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.findNavController
import androidx.navigation.fragment.findNavController
import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.FragmentNoteBinding
import com.navinfo.omqs.ui.dialog.FirstDialog
import com.navinfo.omqs.ui.fragment.BaseFragment
import com.navinfo.omqs.ui.other.shareViewModels
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class NoteFragment : BaseFragment(), View.OnClickListener {
private var _binding: FragmentNoteBinding? = null
private val binding get() = _binding!!
private val viewModel by shareViewModels<NoteViewModel>("note")
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View {
_binding = FragmentNoteBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
binding.sketchEraser.setOnClickListener(this)
binding.sketchClear.setOnClickListener(this)
binding.sketchForward.setOnClickListener(this)
binding.sketchBack.setOnClickListener(this)
binding.noteBarSave.setOnClickListener(this)
binding.noteBarCancel.setOnClickListener(this)
binding.noteBarDelete.setOnClickListener(this)
binding.noteDescription.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
override fun afterTextChanged(s: Editable?) {
viewModel.noteBeanDescription = s.toString()
}
})
/**
* 数据操作结束
*/
viewModel.liveDataFinish.observe(viewLifecycleOwner) {
if (it)
onBackPressed()
}
/**
* 画布初始化完成
*/
viewModel.liveDataCanvasViewInitFinished.observe(viewLifecycleOwner) {
if (it)
arguments?.let { b ->
val id = b.getString("NoteId", "")
if (id.isNotEmpty()) {
viewModel.initData(id)
}
}
}
}
override fun onStart() {
super.onStart()
activity?.run {
findNavController(
R.id.main_activity_middle_fragment
).navigate(R.id.CanvasFragment)
}
}
override fun onStop() {
super.onStop()
activity?.run {
findNavController(
R.id.main_activity_middle_fragment
).navigateUp()
}
}
override fun onClick(v: View) {
when (v) {
binding.sketchEraser -> {
viewModel.onEraser()
binding.sketchEraser.isSelected = viewModel.isEraser
}
binding.sketchBack -> {
viewModel.onBack()
}
binding.sketchForward -> {
viewModel.onForward()
}
binding.sketchClear -> {
viewModel.onClear()
}
binding.noteBarSave -> {
viewModel.onSaveData()
}
binding.noteBarDelete -> {
viewModel.deleteData(requireContext())
}
binding.noteBarCancel -> {
//返回按钮点击
val mDialog = FirstDialog(context)
mDialog.setTitle("提示?")
mDialog.setMessage("是否退出,请确认!")
mDialog.setPositiveButton(
"确定"
) { _, _ ->
mDialog.dismiss()
onBackPressed()
}
mDialog.setNegativeButton("取消", null)
mDialog.show()
}
}
}
override fun onBackPressed(): Boolean {
findNavController().navigateUp()
return true
}
}

View File

@@ -0,0 +1,171 @@
package com.navinfo.omqs.ui.fragment.note
import android.content.Context
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.navinfo.collect.library.data.entity.NoteBean
import com.navinfo.collect.library.map.NIMapController
import com.navinfo.omqs.ui.dialog.FirstDialog
import dagger.hilt.android.lifecycle.HiltViewModel
import io.realm.Realm
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class NoteViewModel @Inject constructor(
val mapController: NIMapController
) : ViewModel() {
lateinit var canvasView: CanvasView
var mNoteBean: NoteBean? = null
var isEraser = false
var noteBeanDescription = ""
// /**
// * 橡皮擦开关
// */
// val liveEraserData = MutableLiveData(false)
//
// /**
// * 清除按钮
// */
// val liveClearData = MutableLiveData(false)
//
// /**
// * 回退按钮
// */
// val liveBackData = MutableLiveData(false)
//
// /**
// * 撤销按钮
// */
// val liveForward = MutableLiveData(false)
/**
* 处理结束关闭fragment
*/
val liveDataFinish = MutableLiveData(false)
/**
* 通知页面画布初始化完成
*/
val liveDataCanvasViewInitFinished = MutableLiveData(false)
fun initCanvasView(canvasView: CanvasView) {
this.canvasView = canvasView
liveDataCanvasViewInitFinished.value = true
}
/**
* 通知橡皮擦开关
*/
fun onEraser() {
isEraser = !isEraser
canvasView.setEraser(isEraser)
// liveEraserData.value = !liveEraserData.value!!
}
/**
* 通知清除
*/
fun onClear() {
canvasView.removeAllPaint()
// liveClearData.value = true
}
/**
* 通知回退
*/
fun onBack() {
canvasView.back()
// liveBackData.value = true
}
/**
* 通知撤销回退
*/
fun onForward() {
canvasView.forward()
// liveForward.value = true
}
/**
* 保存数据
*/
fun onSaveData() {
viewModelScope.launch(Dispatchers.IO) {
if (canvasView.paths != null && canvasView.paths!!.isNotEmpty()) {
var noteBean =
CanvasViewHelper.createNoteBean(mapController, canvasView.paths!!)
if (mNoteBean != null) {
noteBean.id = mNoteBean!!.id
noteBean.description = noteBeanDescription
}
mNoteBean = noteBean
val realm = Realm.getDefaultInstance()
realm.executeTransaction {
it.copyToRealmOrUpdate(noteBean)
}
mapController.markerHandle.addOrUpdateNoteMark(mNoteBean!!)
liveDataFinish.postValue(true)
}
}
}
/**
* 删除数据
*/
fun deleteData(context: Context) {
if (mNoteBean == null) {
liveDataFinish.postValue(true)
return
} else {
val mDialog = FirstDialog(context)
mDialog.setTitle("提示?")
mDialog.setMessage("是否删除标签,请确认!")
mDialog.setPositiveButton(
"确定"
) { dialog, _ ->
dialog.dismiss()
viewModelScope.launch(Dispatchers.IO) {
val realm = Realm.getDefaultInstance()
realm.executeTransaction {
val objects = it.where(NoteBean::class.java)
.equalTo("id", mNoteBean!!.id).findFirst()
objects?.deleteFromRealm()
}
mapController.markerHandle.removeNoteMark(mNoteBean!!)
liveDataFinish.postValue(true)
}
}
mDialog.setNegativeButton("取消", null)
mDialog.show()
}
}
/**
* 初始化数据
*/
fun initData(id: String) {
viewModelScope.launch(Dispatchers.IO) {
val realm = Realm.getDefaultInstance()
realm.executeTransaction { it ->
val objects = it.where(NoteBean::class.java)
.equalTo("id", id).findFirst()
mNoteBean = realm.copyFromRealm(objects)
mNoteBean?.let { bean ->
noteBeanDescription = bean.description
val list = CanvasViewHelper.createDrawPaths(mapController, bean)
canvasView.setDrawPathList(list)
}
}
}
}
}

View File

@@ -15,14 +15,18 @@ import com.blankj.utilcode.util.UriUtils
import com.github.k1rakishou.fsaf.FileChooser
import com.github.k1rakishou.fsaf.callback.FSAFActivityCallbacks
import com.github.k1rakishou.fsaf.callback.FileChooserCallback
import com.navinfo.collect.library.data.entity.TaskBean
import com.navinfo.collect.library.map.NIMapController
import com.navinfo.omqs.Constant
import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.FragmentPersonalCenterBinding
import com.navinfo.omqs.db.ImportOMDBHelper
import com.navinfo.omqs.hilt.ImportOMDBHiltFactory
import com.navinfo.omqs.tools.CoroutineUtils
import com.navinfo.omqs.ui.activity.map.MainActivity
import com.navinfo.omqs.ui.fragment.BaseFragment
import com.navinfo.omqs.ui.activity.scan.QrCodeActivity
import com.navinfo.omqs.ui.fragment.console.ConsoleFragment
import com.permissionx.guolindev.PermissionX
import dagger.hilt.android.AndroidEntryPoint
import org.oscim.core.GeoPoint
@@ -32,7 +36,7 @@ import javax.inject.Inject
* 个人中心
*/
@AndroidEntryPoint
class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) : BaseFragment(),
class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?)? = null) : BaseFragment(),
FSAFActivityCallbacks {
private var _binding: FragmentPersonalCenterBinding? = null
@@ -111,8 +115,15 @@ class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) :
}
})
}
R.id.personal_center_menu_open_auto_location -> {
Constant.AUTO_LOCATION = true
}
R.id.personal_center_menu_close_auto_location -> {
Constant.AUTO_LOCATION = false
}
R.id.personal_center_menu_test -> {
viewModel.readRealmData()
//116.25017070328308 40.061730653134696
// 定位到指定位置
niMapController.mMapView.vtmMap.animator()
.animateTo(GeoPoint( 39.7991980627346,116.50936676873703 ))
@@ -136,6 +147,9 @@ class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) :
//跳转二维码扫描界面
checkPermission()
}
R.id.personal_center_menu_scan_indoor_data -> {
indoorDataListener?.invoke(true)
}
}
true
}

View File

@@ -1,8 +1,9 @@
package com.navinfo.omqs.ui.fragment.personalcenter
import android.net.Uri
import android.os.Build
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.annotation.RequiresApi
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
@@ -16,17 +17,13 @@ import com.navinfo.omqs.bean.ScRootCauseAnalysisBean
import com.navinfo.omqs.db.ImportOMDBHelper
import com.navinfo.omqs.db.RealmOperateHelper
import com.navinfo.omqs.db.RoomAppDatabase
import com.navinfo.omqs.tools.MetadataUtils
import com.navinfo.omqs.tools.MetadataUtils.Companion.ScProblemTypeTitle
import com.navinfo.omqs.tools.MetadataUtils.Companion.ScRootCauseAnalysisTitle
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.apache.commons.io.input.BOMInputStream
import java.io.*
import java.nio.charset.Charset
import java.text.Normalizer
import java.util.*
import javax.inject.Inject
@@ -43,6 +40,7 @@ class PersonalCenterViewModel @Inject constructor(
/**
* 导入OMDB数据
* */
@RequiresApi(Build.VERSION_CODES.N)
suspend fun obtainOMDBZipData(importOMDBHelper: ImportOMDBHelper) {
Log.d("OMQSApplication", "开始生成数据")
// Realm.getDefaultInstance().beginTransaction()
@@ -164,11 +162,13 @@ class PersonalCenterViewModel @Inject constructor(
/**
* 导入OMDB数据
* */
fun importOMDBData(importOMDBHelper: ImportOMDBHelper) {
fun importOMDBData(importOMDBHelper: ImportOMDBHelper,taskId:Int?=0) {
viewModelScope.launch(Dispatchers.IO) {
Log.d("OMQSApplication", "开始导入数据")
importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile).collect {
Log.d("importOMDBData", it)
if (taskId != null) {
importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, taskId).collect {
Log.d("importOMDBData", it)
}
}
Log.d("OMQSApplication", "导入数据完成")
}

View File

@@ -0,0 +1,185 @@
package com.navinfo.omqs.ui.fragment.tasklink
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.navigation.findNavController
import androidx.navigation.fragment.findNavController
import com.navinfo.collect.library.map.NIMapController
import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.FragmentTaskLinkBinding
import com.navinfo.omqs.ui.activity.map.MainActivity
import com.navinfo.omqs.ui.fragment.BaseFragment
import com.navinfo.omqs.ui.other.shareViewModels
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class TaskLinkFragment : BaseFragment(), View.OnClickListener {
private var _binding: FragmentTaskLinkBinding? = null
private val binding get() = _binding!!
@Inject
lateinit var mapController: NIMapController
private val viewModel by shareViewModels<TaskLinkViewModel>("taskLink")
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View {
_binding = FragmentTaskLinkBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
arguments?.let {
val id = it.getString("TaskLinkId")
if (id != null && id.isNotEmpty()){
viewModel.initData(id)
}
}
binding.taskLinkAddPoint.setOnClickListener(this)
binding.taskLinkKind.setOnClickListener(this)
binding.taskLinkFunctionalLevel.setOnClickListener(this)
binding.taskLinkDataLevel.setOnClickListener(this)
binding.taskLinkBarCancel.setOnClickListener(this)
binding.taskLinkBarSave.setOnClickListener(this)
binding.taskLinkBack.setOnClickListener(this)
binding.taskLinkClear.setOnClickListener(this)
binding.taskLinkBarDelete.setOnClickListener(this)
/**
* 数据操作结束
*/
viewModel.liveDataFinish.observe(viewLifecycleOwner) {
if (it)
onBackPressed()
}
/**
* 种别
*/
viewModel.liveDataSelectKind.observe(viewLifecycleOwner) {
binding.taskLinkKind.text = it?.title
}
/**
* 功能等级
*/
viewModel.liveDataSelectFunctionLevel.observe(viewLifecycleOwner) {
binding.taskLinkFunctionalLevel.text = it?.title
}
/**
* 数据等级
*/
viewModel.liveDataSelectDataLevel.observe(viewLifecycleOwner) {
binding.taskLinkDataLevel.text = it?.title
}
/**
* 当前选中任务
*/
viewModel.liveDataTaskBean.observe(viewLifecycleOwner) {
binding.taskLinkTaskName.text = it?.evaluationTaskName
}
/**
* viewModel 返回的文字信息
*/
viewModel.liveDataToastMessage.observe(viewLifecycleOwner) {
Toast.makeText(requireContext(), it, Toast.LENGTH_SHORT).show()
}
/**
* 线长度
*/
mapController.measureLayerHandler.lineLengthLiveData.observe(viewLifecycleOwner) {
binding.taskLinkLength.text = "${it}"
}
mapController.measureLayerHandler.tempLineDistanceLiveData.observe(viewLifecycleOwner) {
(activity as MainActivity).setHomeCenterText(it)
}
}
override fun onStart() {
super.onStart()
/**
* 显示地图准星
*/
activity?.let {
(activity as MainActivity).setHomeCenterVisibility(View.VISIBLE)
}
}
override fun onDestroy() {
super.onDestroy()
}
override fun onStop() {
super.onStop()
/**
* 隐藏地图准星
*/
requireActivity().findNavController(R.id.main_activity_middle_fragment).navigateUp()
activity?.let {
(activity as MainActivity).setHomeCenterVisibility(View.GONE)
}
}
override fun onClick(v: View) {
when (v) {
binding.taskLinkAddPoint -> {
viewModel.addPoint()
}
binding.taskLinkKind -> {
showMiddleFragment()
viewModel.setAdapterList(1)
}
binding.taskLinkFunctionalLevel -> {
showMiddleFragment()
viewModel.setAdapterList(2)
}
binding.taskLinkDataLevel -> {
showMiddleFragment()
viewModel.setAdapterList(3)
}
binding.taskLinkBarCancel -> {
onBackPressed()
}
binding.taskLinkBarSave -> {
viewModel.saveData()
}
binding.taskLinkBack -> {
viewModel.removeLinkLastPoint()
}
binding.taskLinkClear -> {
viewModel.clearLink()
}
binding.taskLinkBarDelete ->{
viewModel.deleteData(requireContext())
}
}
}
/**
* 显示中间面板
*/
private fun showMiddleFragment() {
activity?.run {
val controller = findNavController(
R.id.main_activity_middle_fragment
)
if (controller.currentDestination?.id == R.id.MiddleEmptyFragment)
controller.navigate(R.id.TaskLinkMiddleFragment)
}
}
override fun onBackPressed(): Boolean {
findNavController().navigateUp()
return true
}
}

View File

@@ -0,0 +1,48 @@
package com.navinfo.omqs.ui.fragment.tasklink
import android.os.Build
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.annotation.RequiresApi
import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.AdapterElectronicEyeBinding
import com.navinfo.omqs.databinding.AdapterTaskLinkInfoBinding
import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter
import com.navinfo.omqs.ui.other.BaseViewHolder
data class TaskLinkInfoAdapterItem(
val title: String,
val type: Int
)
class TaskLinkMiddleAdapter(private var itemListener: ((Int, TaskLinkInfoAdapterItem) -> Unit?)? = null) :
BaseRecyclerViewAdapter<TaskLinkInfoAdapterItem>() {
private var selectTitle = ""
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
val viewBinding =
AdapterTaskLinkInfoBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return BaseViewHolder(viewBinding)
}
override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
val binding = holder.viewBinding as AdapterTaskLinkInfoBinding
binding.title.text = data[position].title
if (selectTitle == binding.title.text) {
binding.title.setBackgroundResource(R.drawable.shape_bg_blue_bg_4_radius)
binding.title.setTextColor(holder.viewBinding.root.context.resources.getColor(R.color.white))
} else {
binding.title.setBackgroundResource(R.drawable.shape_rect_white_2dp_bg)
binding.title.setTextColor(holder.viewBinding.root.context.resources.getColor(R.color.black))
}
binding.root.setOnClickListener {
if (selectTitle != data[position].title) {
selectTitle = data[position].title
notifyDataSetChanged()
}
itemListener?.invoke(position, data[position])
}
}
}

View File

@@ -0,0 +1,77 @@
package com.navinfo.omqs.ui.fragment.tasklink
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels
import androidx.navigation.findNavController
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import com.navinfo.collect.library.map.NIMapController
import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.FragmentTaskLinkBinding
import com.navinfo.omqs.databinding.FragmentTaskLinkMiddleBinding
import com.navinfo.omqs.ui.activity.map.MainActivity
import com.navinfo.omqs.ui.fragment.BaseFragment
import com.navinfo.omqs.ui.fragment.evaluationresult.LeftAdapter
import com.navinfo.omqs.ui.other.shareViewModels
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class TaskLinkMiddleFragment : BaseFragment(), View.OnClickListener {
private var _binding: FragmentTaskLinkMiddleBinding? = null
private val binding get() = _binding!!
@Inject
lateinit var mapController: NIMapController
private val viewModel by shareViewModels<TaskLinkViewModel>("taskLink")
/**
* 监听左侧栏的点击事件
*/
val adapter = TaskLinkMiddleAdapter { _, item ->
viewModel.setAdapterSelectValve(item)
if (activity != null) {
requireActivity().findNavController(R.id.main_activity_middle_fragment).navigateUp()
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View {
_binding = FragmentTaskLinkMiddleBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
binding.taskLinkMiddleRecyclerview.layoutManager = LinearLayoutManager(requireContext())
binding.taskLinkMiddleRecyclerview.adapter = adapter
viewModel.liveDataLeftAdapterList.observe(viewLifecycleOwner) {
adapter.refreshData(it)
}
}
override fun onStart() {
super.onStart()
}
override fun onStop() {
super.onStop()
}
override fun onClick(v: View) {
when (v) {
}
}
override fun onBackPressed(): Boolean {
findNavController().navigateUp()
return true
}
}

View File

@@ -0,0 +1,366 @@
package com.navinfo.omqs.ui.fragment.tasklink
import android.app.Dialog
import android.content.Context
import android.content.SharedPreferences
import android.os.Build
import androidx.annotation.RequiresApi
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.navinfo.collect.library.data.entity.HadLinkDvoBean
import com.navinfo.collect.library.data.entity.LinkInfoBean
import com.navinfo.collect.library.data.entity.QsRecordBean
import com.navinfo.collect.library.data.entity.TaskBean
import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.omqs.Constant
import com.navinfo.omqs.ui.dialog.FirstDialog
import dagger.hilt.android.lifecycle.HiltViewModel
import io.realm.Realm
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.bson.codecs.UuidCodec
import org.bson.internal.UuidHelper
import org.oscim.core.GeoPoint
import java.util.UUID
import javax.inject.Inject
@HiltViewModel
class TaskLinkViewModel @Inject constructor(
private val mapController: NIMapController,
private val sharedPreferences: SharedPreferences
) : ViewModel(), SharedPreferences.OnSharedPreferenceChangeListener {
/**
* 种别
*/
private val kindList = listOf(
TaskLinkInfoAdapterItem("高速道路", 1),
TaskLinkInfoAdapterItem("城市高速", 2),
TaskLinkInfoAdapterItem("国道", 3),
TaskLinkInfoAdapterItem("省道", 4),
TaskLinkInfoAdapterItem("县道", 6),
TaskLinkInfoAdapterItem("乡镇村道路", 7),
TaskLinkInfoAdapterItem("其他道路", 8),
TaskLinkInfoAdapterItem("非引导道路", 9),
TaskLinkInfoAdapterItem("步行道路", 10),
TaskLinkInfoAdapterItem("人渡", 11),
TaskLinkInfoAdapterItem("轮渡", 13),
TaskLinkInfoAdapterItem("自行车道路", 15),
)
/**
* FunctionGrade 功能等级
*/
private val functionLevelList = listOf(
TaskLinkInfoAdapterItem("等级1", 1),
TaskLinkInfoAdapterItem("等级2", 2),
TaskLinkInfoAdapterItem("等级3", 3),
TaskLinkInfoAdapterItem("等级4", 4),
TaskLinkInfoAdapterItem("等级5", 5),
)
/**
* 数据级别
*/
private val dataLevelList = listOf(
TaskLinkInfoAdapterItem("Pro lane model(有高精车道模型覆盖的高速和城高link)", 1),
TaskLinkInfoAdapterItem("Lite lane model(有高精车道模型覆盖的普通路link)", 2),
TaskLinkInfoAdapterItem("Standard road model(其他link)", 3),
)
/**
* 处理结束关闭fragment`
*/
val liveDataFinish = MutableLiveData(false)
/**
* 左侧面板展示内容
*/
val liveDataLeftAdapterList = MutableLiveData<List<TaskLinkInfoAdapterItem>>()
/**
* 选择的种别
*/
val liveDataSelectKind = MutableLiveData<TaskLinkInfoAdapterItem?>()
/**
* 选择的功能等级
*/
val liveDataSelectFunctionLevel = MutableLiveData<TaskLinkInfoAdapterItem?>()
/**
* 选择的数据等级
*/
val liveDataSelectDataLevel = MutableLiveData<TaskLinkInfoAdapterItem?>()
/**
* 要提示的错误信息
*/
val liveDataToastMessage = MutableLiveData<String>()
/**
* 当前选中的任务
*/
val liveDataTaskBean = MutableLiveData<TaskBean?>()
/**
* 当前正在编辑的线
*/
private var hadLinkDvoBean: HadLinkDvoBean? = null
/**
* 当前正在选择哪个数据 1种别 2功能等级 3数据等级
*/
private var selectType = 0
init {
getTaskBean()
sharedPreferences.registerOnSharedPreferenceChangeListener(this)
}
private fun getTaskBean() {
viewModelScope.launch(Dispatchers.IO) {
val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1)
val realm = Realm.getDefaultInstance()
val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst()
liveDataTaskBean.postValue(res?.let { realm.copyFromRealm(it) })
}
}
/**
* 编辑点
*/
fun addPoint() {
mapController.measureLayerHandler.drawLineOrPolygon(false)
}
/**
* 设置左侧面板要显示的内容
*/
fun setAdapterList(type: Int) {
selectType = type
when (type) {
1 -> liveDataLeftAdapterList.value = kindList
2 -> liveDataLeftAdapterList.value = functionLevelList
3 -> liveDataLeftAdapterList.value = dataLevelList
}
}
/**
* 返回左侧面板选择的内容
*/
fun setAdapterSelectValve(item: TaskLinkInfoAdapterItem) {
when (selectType) {
1 -> liveDataSelectKind.value = item
2 -> liveDataSelectFunctionLevel.value = item
3 -> liveDataSelectDataLevel.value = item
}
}
override fun onCleared() {
mapController.measureLayerHandler.clear()
sharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
super.onCleared()
}
/**
* 保存数据
*/
fun saveData() {
viewModelScope.launch(Dispatchers.Default) {
if (liveDataTaskBean.value == null) {
liveDataToastMessage.postValue("还没有选择任何一条任务!")
return@launch
}
if (mapController.measureLayerHandler.mPathLayer.points.size < 2) {
liveDataToastMessage.postValue("道路点少于2个")
return@launch
}
if (liveDataSelectKind.value == null) {
liveDataToastMessage.postValue("请选择种别!")
return@launch
}
if (liveDataSelectFunctionLevel.value == null) {
liveDataToastMessage.postValue("请选择功能等级!")
return@launch
}
if (liveDataSelectDataLevel.value == null) {
liveDataToastMessage.postValue("请选择数据等级!")
return@launch
}
val task: TaskBean = liveDataTaskBean.value!!
if (hadLinkDvoBean != null) {
hadLinkDvoBean!!.taskId = liveDataTaskBean.value!!.id
hadLinkDvoBean!!.length =
mapController.measureLayerHandler.lineLengthLiveData.value!!
hadLinkDvoBean!!.geometry =
GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points)
hadLinkDvoBean!!.linkInfo = LinkInfoBean(
kind = liveDataSelectKind.value!!.type,
functionLevel = liveDataSelectFunctionLevel.value!!.type,
dataLevel = liveDataSelectDataLevel.value!!.type,
)
for (l in task.hadLinkDvoList) {
if (l.linkPid == hadLinkDvoBean!!.linkPid) {
task.hadLinkDvoList.remove(l)
task.hadLinkDvoList.add(hadLinkDvoBean)
break
}
}
} else {
hadLinkDvoBean = HadLinkDvoBean(
taskId = liveDataTaskBean.value!!.id,
linkPid = UUID.randomUUID().toString(),
linkStatus = 3,
length = mapController.measureLayerHandler.lineLengthLiveData.value!!,
geometry = GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points),
linkInfo = LinkInfoBean(
kind = liveDataSelectKind.value!!.type,
functionLevel = liveDataSelectFunctionLevel.value!!.type,
dataLevel = liveDataSelectDataLevel.value!!.type,
)
)
task.hadLinkDvoList.add(hadLinkDvoBean)
}
val realm = Realm.getDefaultInstance()
realm.executeTransaction {
it.copyToRealmOrUpdate(hadLinkDvoBean)
it.copyToRealmOrUpdate(task)
}
mapController.lineHandler.addTaskLink(hadLinkDvoBean!!)
sharedPreferences.edit()
.putString(Constant.SHARED_SYNC_TASK_LINK_ID, hadLinkDvoBean!!.linkPid)
.apply()
liveDataFinish.postValue(true)
}
}
/**
* 监听shared变化
*/
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
if (key == Constant.SELECT_TASK_ID) {
getTaskBean()
}
}
/**
* 绘制线的时候回退点
*/
fun removeLinkLastPoint() {
mapController.measureLayerHandler.drawLineBackspace()
}
/**
* 清除重绘
*/
fun clearLink() {
mapController.measureLayerHandler.clear()
}
/**
* 初始化数据
*/
fun initData(id: String) {
viewModelScope.launch(Dispatchers.IO) {
val realm = Realm.getDefaultInstance()
val objects =
realm.where(HadLinkDvoBean::class.java).equalTo("linkPid", id)
.findFirst()
objects?.linkInfo?.let {
for (kind in kindList) {
if (kind.type == it.kind) {
liveDataSelectKind.postValue(kind)
break
}
}
for (function in functionLevelList) {
if (function.type == it.functionLevel) {
liveDataSelectFunctionLevel.postValue(function)
break
}
}
for (data in dataLevelList) {
if (data.type == it.dataLevel) {
liveDataSelectDataLevel.postValue(data)
break
}
}
}
val task =
realm.where(TaskBean::class.java).equalTo("id", objects?.taskId)
.findFirst()
if (task != null) {
liveDataTaskBean.postValue(realm.copyFromRealm(task))
}
hadLinkDvoBean = realm.copyFromRealm(objects)
withContext(Dispatchers.Main) {
mapController.measureLayerHandler.initPathLine(hadLinkDvoBean?.geometry!!)
}
}
}
/**
* 删除数据
*/
fun deleteData(context: Context) {
if (hadLinkDvoBean == null) {
liveDataFinish.value = true
return
}
val mDialog = FirstDialog(context)
mDialog.setTitle("提示?")
mDialog.setMessage("是否删除Mark请确认")
mDialog.setPositiveButton(
"确定"
) { _, _ ->
mDialog.dismiss()
viewModelScope.launch(Dispatchers.IO) {
val realm = Realm.getDefaultInstance()
realm.executeTransaction {
//先找到对应的任务
val task = it.where(TaskBean::class.java).equalTo("id", hadLinkDvoBean!!.taskId)
.findFirst()
//维护任务删除当前link
if (task != null) {
for (h in task.hadLinkDvoList) {
if (h.linkPid == hadLinkDvoBean!!.linkPid)
task.hadLinkDvoList.remove(h)
break
}
realm.copyToRealmOrUpdate(task)
}
//删除link
val objects = it.where(HadLinkDvoBean::class.java)
.equalTo("linkPid", hadLinkDvoBean!!.linkPid).findFirst()
objects?.deleteFromRealm()
//删除相关联的评测任务
val qsRecordBeans = it.where(QsRecordBean::class.java)
.equalTo("linkId", hadLinkDvoBean!!.linkPid).and()
.equalTo("taskId", hadLinkDvoBean!!.taskId).findAll()
if (qsRecordBeans != null) {
for (b in qsRecordBeans) {
mapController.markerHandle.removeQsRecordMark(b)
}
qsRecordBeans.deleteAllFromRealm()
}
}
mapController.lineHandler.removeTaskLink(hadLinkDvoBean!!.linkPid)
mapController.mMapView.vtmMap.updateMap(true)
liveDataFinish.postValue(true)
}
}
mDialog.setNegativeButton("取消", null)
mDialog.show()
}
}

View File

@@ -11,7 +11,7 @@ import com.navinfo.omqs.ui.other.BaseViewHolder
interface TaskAdapterCallback {
fun itemOnClick(bean: HadLinkDvoBean)
fun editOnclick(position: Int, bean: HadLinkDvoBean)
fun editOnClick(position: Int, bean: HadLinkDvoBean)
}
/**
@@ -54,7 +54,7 @@ class TaskAdapter(
}
binding.taskEdit.isSelected = bean.reason != ""
binding.taskEdit.setOnClickListener {
callback.editOnclick(position, bean)
callback.editOnClick(position, bean)
}
}

View File

@@ -1,7 +1,6 @@
package com.navinfo.omqs.ui.fragment.tasklist
import android.app.AlertDialog
import android.content.DialogInterface
import android.os.Build
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
@@ -16,14 +15,14 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.navinfo.collect.library.data.entity.HadLinkDvoBean
import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.FragmentTaskBinding
import com.navinfo.omqs.databinding.FragmentTaskListBinding
import com.navinfo.omqs.http.taskdownload.TaskDownloadManager
import com.navinfo.omqs.http.taskupload.TaskUploadManager
import com.navinfo.omqs.ui.fragment.BaseFragment
import com.navinfo.omqs.ui.other.shareViewModels
import com.yanzhenjie.recyclerview.SwipeMenuBridge
import com.yanzhenjie.recyclerview.SwipeMenuCreator
import com.yanzhenjie.recyclerview.SwipeMenuItem
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import javax.inject.Inject
import org.videolan.vlc.Util
/**
* 当前任务的道路列表
@@ -41,14 +40,12 @@ class TaskFragment : BaseFragment() {
private val adapter: TaskAdapter by lazy {
TaskAdapter(object : TaskAdapterCallback {
override fun itemOnClick(bean: HadLinkDvoBean) {
if(bean!=null){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
viewModel.showCurrentLink(bean)
}else{
Toast.makeText(context, "数据错误,无法显示!", Toast.LENGTH_SHORT).show()
}
}
override fun editOnclick(position: Int, bean: HadLinkDvoBean) {
override fun editOnClick(position: Int, bean: HadLinkDvoBean) {
showLinkEditDialog(position, bean)
}
})
@@ -66,11 +63,43 @@ class TaskFragment : BaseFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.taskAddLink.setOnClickListener {
viewModel.setSelectLink(!binding.taskAddLink.isSelected)
}
viewModel.liveDataSelectNewLink.observe(viewLifecycleOwner) {
binding.taskAddLink.isSelected = it
}
//注意:使用滑动菜单不能开启滑动删除,否则只有滑动删除没有滑动菜单
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.taskRecyclerview.setHasFixedSize(true)
binding.taskRecyclerview.layoutManager = layoutManager
//增加侧滑按钮
binding.taskRecyclerview.setSwipeMenuCreator(mSwipeMenuCreator)
//单项点击
binding.taskRecyclerview.setOnItemMenuClickListener { menuBridge, position ->
menuBridge.closeMenu()
viewModel.deleteTaskLink(requireContext(), adapter.data[position])
}
binding.taskRecyclerview.adapter = adapter
binding.taskSearchClear.setOnClickListener {
binding.taskSearch.setText("")
}
@@ -93,6 +122,7 @@ class TaskFragment : BaseFragment() {
})
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null

View File

@@ -1,16 +1,18 @@
package com.navinfo.omqs.ui.fragment.tasklist
import android.annotation.SuppressLint
import android.app.Dialog
import android.graphics.Color
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.RecyclerView
import com.navinfo.collect.library.data.entity.QsRecordBean
import com.navinfo.collect.library.data.entity.TaskBean
import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.AdapterTaskListBinding
@@ -19,15 +21,10 @@ import com.navinfo.omqs.http.taskupload.TaskUploadManager
import com.navinfo.omqs.tools.FileManager
import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus
import com.navinfo.omqs.tools.FileManager.Companion.FileUploadStatus
import com.navinfo.omqs.ui.dialog.FirstDialog
import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter
import com.navinfo.omqs.ui.other.BaseViewHolder
import com.navinfo.omqs.ui.other.OnLifecycleStateListener
import com.navinfo.omqs.ui.widget.LeftDeleteView
import io.realm.Realm
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
/**
* 离线地图城市列表 RecyclerView 适配器
@@ -51,8 +48,7 @@ class TaskListAdapter(
private var isShowDeleteView = false
private
val downloadBtnClick = View.OnClickListener() {
private val downloadBtnClick = View.OnClickListener() {
if (it.tag != null) {
val taskBean = data[it.tag as Int]
if (taskBean.hadLinkDvoList.isNotEmpty()) {
@@ -124,6 +120,7 @@ class TaskListAdapter(
override fun onViewRecycled(holder: BaseViewHolder) {
super.onViewRecycled(holder)
//页面滑动时会用holder重构页面但是对进度条的监听回调会一直返回扰乱UI所以当当前holder去重构的时候移除监听
//这里 BaseViewHolder 的LifecycleOwner 状态很早就DESTROYED 了,这个回调比较晚,起到的作用很小
downloadManager.removeObserver(holder.tag.toInt())
}
@@ -131,6 +128,7 @@ class TaskListAdapter(
holder: BaseViewHolder,
@SuppressLint("RecyclerView") position: Int
) {
val binding: AdapterTaskListBinding =
holder.viewBinding as AdapterTaskListBinding
val taskBean = data[position]
@@ -149,8 +147,22 @@ class TaskListAdapter(
//tag 方便onclick里拿到数据
holder.tag = taskBean.id.toString()
changeViews(binding, taskBean)
holder.addObserver(object : OnLifecycleStateListener {
override fun onState(tag: String, state: Lifecycle.State) {
when (state) {
Lifecycle.State.STARTED ->
downloadManager.observer(
taskBean.id,
holder,
DownloadObserver(taskBean.id, holder)
)
Lifecycle.State.DESTROYED ->
downloadManager.removeObserver(tag.toInt())
else -> {}
}
}
})
downloadManager.addTask(taskBean)
downloadManager.observer(taskBean.id, holder, DownloadObserver(taskBean.id, holder))
uploadManager.addTask(taskBean)
uploadManager.observer(taskBean.id, holder, UploadObserver(taskBean.id, binding))
if (taskBean.status == FileDownloadStatus.NONE) {
@@ -203,7 +215,12 @@ class TaskListAdapter(
binding.taskDeleteLayout.setOnClickListener {
//重置状态
leftDeleteView?.resetDeleteStatus()
itemListener?.invoke(position, ItemClickStatus.DELETE_LAYOUT_CLICK, taskBean)
if (taskBean.syncStatus != FileUploadStatus.DONE) {
Toast.makeText(binding.taskUploadBtn.context, "数据未上传,不允许关闭!", Toast.LENGTH_SHORT)
.show()
} else {
itemListener?.invoke(position, ItemClickStatus.DELETE_LAYOUT_CLICK, taskBean)
}
}
}
@@ -212,7 +229,7 @@ class TaskListAdapter(
* 重置item状态
* @param point
*/
fun restoreItemView() {
private fun restoreItemView() {
leftDeleteView?.let {
if (isShowDeleteView)
it.resetDeleteStatus()
@@ -245,8 +262,9 @@ class TaskListAdapter(
FileUploadStatus.DONE -> {
binding.taskUploadBtn.stopAnimator()
binding.taskUploadBtn.setText("已上传")
binding.taskUploadBtn.isEnabled = false
binding.taskUploadBtn.setProgress(0)
binding.taskUploadBtn.setBackgroundColor(binding.root.resources.getColor(R.color.ripple_end_color))
binding.taskUploadBtn.setBackgroundColor(binding.root.resources.getColor(R.color.gray_121))
}
FileUploadStatus.ERROR -> {
@@ -366,6 +384,17 @@ class TaskListAdapter(
}
}
fun initSelectTask(list: List<TaskBean>, id: Int?) {
for (i in list.indices) {
if (list[i].id == id) {
selectPosition = i
break
}
}
refreshData(list)
}
companion object {
object ItemClickStatus {
const val ITEM_LAYOUT_CLICK = 0 //条目点击

View File

@@ -1,6 +1,5 @@
package com.navinfo.omqs.ui.fragment.tasklist
import android.app.Dialog
import android.os.Build
import android.os.Bundle
import android.text.Editable
@@ -9,26 +8,15 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.recyclerview.widget.LinearLayoutManager
import com.navinfo.collect.library.data.entity.QsRecordBean
import com.navinfo.collect.library.data.entity.TaskBean
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.dialog.FirstDialog
import com.navinfo.omqs.ui.fragment.BaseFragment
import com.navinfo.omqs.ui.other.shareViewModels
import dagger.hilt.android.AndroidEntryPoint
import io.realm.Realm
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import javax.inject.Inject
@RequiresApi(Build.VERSION_CODES.M)
@AndroidEntryPoint
class TaskListFragment : BaseFragment() {
@@ -47,21 +35,28 @@ class TaskListFragment : BaseFragment() {
private val adapter: TaskListAdapter by lazy {
TaskListAdapter(
downloadManager, uploadManager,binding.taskListRecyclerview
downloadManager, uploadManager, binding.taskListRecyclerview
) { _, status, taskBean ->
if(taskBean.hadLinkDvoList.isEmpty()){
if (taskBean.hadLinkDvoList.isEmpty()) {
Toast.makeText(context, "数据错误无Link数据", Toast.LENGTH_SHORT).show()
}
if(status==TaskListAdapter.Companion.ItemClickStatus.ITEM_LAYOUT_CLICK){
viewModel.setSelectTaskBean(taskBean as TaskBean)
}else if(status==TaskListAdapter.Companion.ItemClickStatus.DELETE_LAYOUT_CLICK){
context?.let { viewModel.removeTask(it, taskBean as TaskBean) }
}else if(status==TaskListAdapter.Companion.ItemClickStatus.UPLOAD_LAYOUT_CLICK){
showLoadingDialog("正在校验")
Toast.makeText(context, "正在校验", Toast.LENGTH_SHORT).show()
viewModel.checkUploadTask(binding.root.context,taskBean)
} else {
when (status) {
TaskListAdapter.Companion.ItemClickStatus.ITEM_LAYOUT_CLICK -> {
viewModel.setSelectTaskBean(taskBean)
}
TaskListAdapter.Companion.ItemClickStatus.DELETE_LAYOUT_CLICK -> {
showLoadingDialog("正在关闭")
context?.let { viewModel.removeTask(it, taskBean) }
}
TaskListAdapter.Companion.ItemClickStatus.UPLOAD_LAYOUT_CLICK -> {
showLoadingDialog("正在校验")
Toast.makeText(context, "正在校验", Toast.LENGTH_SHORT).show()
viewModel.checkUploadTask(binding.root.context, taskBean)
}
else -> {
}
}
}
}
@@ -85,13 +80,13 @@ class TaskListFragment : BaseFragment() {
binding.taskListRecyclerview.layoutManager = layoutManager
binding.taskListRecyclerview.adapter = adapter
viewModel.liveDataTaskList.observe(viewLifecycleOwner) {
adapter.refreshData(it)
adapter.initSelectTask(it, viewModel.currentSelectTaskBean?.id)
}
//监听并调用上传
viewModel.liveDataTaskUpload.observe(viewLifecycleOwner){
viewModel.liveDataTaskUpload.observe(viewLifecycleOwner) {
for ((key, value) in it) {
if(value){
if (value) {
adapter.uploadTask(key)
}
}
@@ -111,6 +106,8 @@ class TaskListFragment : BaseFragment() {
})
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null

View File

@@ -4,7 +4,9 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.navigation.fragment.findNavController
import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.tabs.TabLayoutMediator
import com.navinfo.omqs.databinding.FragmentTaskManagerBinding
import com.navinfo.omqs.ui.fragment.BaseFragment
@@ -38,10 +40,20 @@ class TaskManagerFragment(private var backListener: ((TaskManagerFragment) -> Un
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.liveDataToastMessage.observe(viewLifecycleOwner) {
Toast.makeText(requireContext(), it, Toast.LENGTH_SHORT).show()
}
//禁止滑动,因为页面在抽屉里,和抽屉的滑动有冲突
binding.taskManagerViewpager.isUserInputEnabled = false
//创建viewpager2的适配器
binding.taskManagerViewpager.adapter = activity?.let { TaskManagerAdapter(it) }
binding.taskManagerViewpager.registerOnPageChangeCallback(object :
ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
viewModel.setSelectLink(false)
}
})
//绑定viewpager2与tabLayout
TabLayoutMediator(
binding.taskManagerTabLayout,

View File

@@ -1,20 +1,24 @@
package com.navinfo.omqs.ui.fragment.tasklist
import android.app.Dialog
import android.content.Context
import android.graphics.Color
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
import androidx.lifecycle.viewModelScope
import com.navinfo.collect.library.data.dao.impl.TraceDataBase
import com.navinfo.collect.library.data.entity.HadLinkDvoBean
import com.navinfo.collect.library.data.entity.NiLocation
import com.navinfo.collect.library.data.entity.QsRecordBean
import com.navinfo.collect.library.data.entity.TaskBean
import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.map.OnGeoPointClickListener
import com.navinfo.collect.library.utils.GeometryTools
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
@@ -23,13 +27,19 @@ import com.navinfo.omqs.util.DateTimeUtil
import dagger.hilt.android.lifecycle.HiltViewModel
import io.realm.Realm
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.collectLatest
import org.oscim.core.GeoPoint
import javax.inject.Inject
@HiltViewModel
class TaskViewModel @Inject constructor(
private val networkService: NetworkService, private val mapController: NIMapController
) : ViewModel() {
private val networkService: NetworkService,
private val mapController: NIMapController,
private val sharedPreferences: SharedPreferences,
private val realmOperateHelper: RealmOperateHelper,
) : ViewModel(), OnSharedPreferenceChangeListener {
private val TAG = "TaskViewModel"
/**
* 用来更新任务列表
@@ -46,13 +56,22 @@ class TaskViewModel @Inject constructor(
*/
val liveDataTaskUpload = MutableLiveData<Map<TaskBean, Boolean>>()
private val colors =
arrayOf(Color.RED, Color.YELLOW, Color.BLUE, Color.MAGENTA, Color.GREEN, Color.CYAN)
// private val colors =
// arrayOf(Color.RED, Color.YELLOW, Color.BLUE, Color.MAGENTA, Color.GREEN, Color.CYAN)
/**
* 用来确定是否关闭
*/
val liveDataCloseTask = MutableLiveData<Boolean>()
/**
* 提示信息
*/
val liveDataToastMessage = MutableLiveData<String>()
/**
* 当前选中的任务
*/
private var currentSelectTaskBean: TaskBean? = null
var currentSelectTaskBean: TaskBean? = null
/**
* 任务列表查询协程
@@ -61,13 +80,21 @@ class TaskViewModel @Inject constructor(
private var filterTaskJob: Job? = null
/**
* 是否开启了道路选择
*/
var liveDataSelectNewLink = MutableLiveData(false)
init {
sharedPreferences.registerOnSharedPreferenceChangeListener(this)
}
/**
* 下载任务列表
*/
fun getTaskList(context: Context) {
viewModelScope.launch(Dispatchers.IO) {
var taskList: List<TaskBean> = mutableListOf()
when (val result = networkService.getTaskList(Constant.USER_ID)) {
is NetResult.Success -> {
if (result.data != null) {
@@ -83,6 +110,7 @@ class TaskViewModel @Inject constructor(
task.fileSize = item.fileSize
task.status = item.status
task.currentSize = item.currentSize
task.hadLinkDvoList = item.hadLinkDvoList
//已上传后不在更新操作时间
if (task.syncStatus != FileManager.Companion.FileUploadStatus.DONE) {
//赋值时间,用于查询过滤
@@ -116,35 +144,63 @@ class TaskViewModel @Inject constructor(
is NetResult.Loading -> {}
}
val realm = Realm.getDefaultInstance()
//过滤掉已上传的超过90天的数据
var nowTime: Long = DateTimeUtil.getNowDate().time
var beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L
var syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE
val objects =
realm.where(TaskBean::class.java).notEqualTo("syncStatus", syncUpload).or()
.between("operationTime", beginNowTime, nowTime)
.equalTo("syncStatus", syncUpload).findAll()
taskList = realm.copyFromRealm(objects)
getLocalTaskList()
}
}
/**
* 获取任务列表
*/
private suspend fun getLocalTaskList() {
val realm = Realm.getDefaultInstance()
//过滤掉已上传的超过90天的数据
val nowTime: Long = DateTimeUtil.getNowDate().time
val beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L
val syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE
val objects =
realm.where(TaskBean::class.java).notEqualTo("syncStatus", syncUpload).or()
.between("operationTime", beginNowTime, nowTime)
.equalTo("syncStatus", syncUpload).findAll().sort("id")
val taskList = realm.copyFromRealm(objects)
for (item in taskList) {
FileManager.checkOMDBFileInfo(item)
}
liveDataTaskList.postValue(taskList)
val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1)
if (id > -1) {
for (item in taskList) {
FileManager.checkOMDBFileInfo(item)
if (item.id == id) {
currentSelectTaskBean = item
liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList)
withContext(Dispatchers.Main) {
showTaskLinks(currentSelectTaskBean!!)
}
break
}
}
liveDataTaskList.postValue(taskList)
}
}
/**
* 设置当前选择的任务并高亮当前任务的所有link
*/
@RequiresApi(Build.VERSION_CODES.M)
fun setSelectTaskBean(taskBean: TaskBean) {
sharedPreferences.edit().putInt(Constant.SELECT_TASK_ID, taskBean.id).apply()
currentSelectTaskBean = taskBean
liveDataTaskLinks.value = taskBean.hadLinkDvoList
showTaskLinks(taskBean)
}
mapController.lineHandler.omdbTaskLinkLayer.removeAll()
private fun showTaskLinks(taskBean: TaskBean) {
mapController.lineHandler.removeAllTaskLine()
mapController.markerHandle.clearNiLocationLayer()
if (taskBean.hadLinkDvoList.isNotEmpty()) {
mapController.lineHandler.omdbTaskLinkLayer.addLineList(taskBean.hadLinkDvoList)
mapController.lineHandler.showTaskLines(taskBean.hadLinkDvoList)
var maxX = 0.0
var maxY = 0.0
var minX = 0.0
@@ -174,14 +230,25 @@ class TaskViewModel @Inject constructor(
)
}
}
//重新加载轨迹
viewModelScope.launch(Dispatchers.IO) {
val list: List<NiLocation>? = TraceDataBase.getDatabase(
mapController.mMapView.context,
Constant.USER_DATA_PATH
).niLocationDao.findToTaskIdAll(taskBean.id.toString())
list!!.forEach {
mapController.markerHandle.addNiLocationMarkerItem(it)
}
}
}
/**
* 高亮当前选中的link
*/
@RequiresApi(Build.VERSION_CODES.M)
fun showCurrentLink(link: HadLinkDvoBean) {
mapController.lineHandler.omdbTaskLinkLayer.showSelectLine(link)
mapController.lineHandler.showLine(link.geometry)
// mapController.lineHandler.omdbTaskLinkLayer.showSelectLine(link)
val geometry = GeometryTools.createGeometry(link.geometry)
if (geometry != null) {
val envelope = geometry.envelopeInternal
@@ -196,13 +263,14 @@ class TaskViewModel @Inject constructor(
}
override fun onCleared() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mapController.lineHandler.omdbTaskLinkLayer.clearSelectLine()
}
mapController.lineHandler.removeLine()
sharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
super.onCleared()
}
/**
* 保存link补作业原因
*/
suspend fun saveLinkReason(bean: HadLinkDvoBean, text: String) {
withContext(Dispatchers.IO) {
currentSelectTaskBean?.let {
@@ -211,11 +279,12 @@ class TaskViewModel @Inject constructor(
item.reason = text
}
}
val realm = Realm.getDefaultInstance()
realm.executeTransaction { r ->
r.copyToRealmOrUpdate(it)
}
}
val realm = Realm.getDefaultInstance()
realm.executeTransaction {
realm.copyToRealmOrUpdate(currentSelectTaskBean)
}
}
}
@@ -239,6 +308,9 @@ class TaskViewModel @Inject constructor(
}
}
/**
* 筛选link
*/
fun filterTask(pidKey: String) {
if (currentSelectTaskBean == null)
return
@@ -256,53 +328,61 @@ class TaskViewModel @Inject constructor(
}
}
/**
* 关闭任务
*/
fun removeTask(context: Context, taskBean: TaskBean) {
if (taskBean != null) {
val mDialog = FirstDialog(context)
mDialog.setTitle("提示?")
mDialog.setMessage("是否关闭,请确认!")
mDialog.setPositiveButton("确定", object : FirstDialog.OnClickListener {
override fun onClick(dialog: Dialog?, which: Int) {
mDialog.dismiss()
viewModelScope.launch(Dispatchers.IO) {
val realm = Realm.getDefaultInstance()
realm.executeTransaction {
val objects = it.where(TaskBean::class.java)
.equalTo("id", taskBean.id).findFirst()
objects?.deleteFromRealm()
val mDialog = FirstDialog(context)
mDialog.setTitle("提示?")
mDialog.setMessage("是否关闭,请确认!")
mDialog.setPositiveButton(
"确定"
) { dialog, _ ->
dialog.dismiss()
viewModelScope.launch(Dispatchers.IO) {
val realm = Realm.getDefaultInstance()
realm.executeTransaction {
val objects = it.where(TaskBean::class.java)
.equalTo("id", taskBean.id).findFirst()
objects?.deleteFromRealm()
}
//遍历删除对应的数据
taskBean.hadLinkDvoList.forEach { hadLinkDvoBean ->
val qsRecordList = realm.where(QsRecordBean::class.java)
.equalTo("linkId", hadLinkDvoBean.linkPid).and()
.equalTo("taskId", hadLinkDvoBean.taskId).findAll()
if (qsRecordList != null && qsRecordList.size > 0) {
val copyList = realm.copyFromRealm(qsRecordList)
copyList.forEach {
it.deleteFromRealm()
mapController.markerHandle.removeQsRecordMark(it)
mapController.mMapView.vtmMap.updateMap(true)
}
//遍历删除对应的数据
taskBean.hadLinkDvoList.forEach { hadLinkDvoBean ->
val qsRecordList = realm.where(QsRecordBean::class.java)
.equalTo("linkId", hadLinkDvoBean.linkPid).findAll()
if (qsRecordList != null && qsRecordList.size > 0) {
val copyList = realm.copyFromRealm(qsRecordList)
copyList.forEach {
it.deleteFromRealm()
mapController.markerHandle.removeQsRecordMark(it)
mapController.mMapView.vtmMap.updateMap(true)
}
}
}
//过滤掉已上传的超过90天的数据
var nowTime: Long = DateTimeUtil.getNowDate().time
var beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L
var syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE
val objects = realm.where(TaskBean::class.java)
.notEqualTo("syncStatus", syncUpload).or()
.between("operationTime", beginNowTime, nowTime)
.equalTo("syncStatus", syncUpload).findAll()
val taskList = realm.copyFromRealm(objects)
for (item in taskList) {
FileManager.checkOMDBFileInfo(item)
}
liveDataTaskList.postValue(taskList)
}
}
})
mDialog.setNegativeButton("取消", null)
mDialog.show()
//过滤掉已上传的超过90天的数据
val nowTime: Long = DateTimeUtil.getNowDate().time
val beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L
val syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE
val objects = realm.where(TaskBean::class.java)
.notEqualTo("syncStatus", syncUpload).or()
.between("operationTime", beginNowTime, nowTime)
.equalTo("syncStatus", syncUpload).findAll()
val taskList = realm.copyFromRealm(objects)
for (item in taskList) {
FileManager.checkOMDBFileInfo(item)
}
liveDataTaskList.postValue(taskList)
liveDataCloseTask.postValue(true)
}
}
mDialog.setNegativeButton(
"取消"
) { _, _ ->
liveDataCloseTask.postValue(false)
mDialog.dismiss()
}
mDialog.show()
}
fun checkUploadTask(context: Context, taskBean: TaskBean) {
@@ -310,7 +390,8 @@ class TaskViewModel @Inject constructor(
val realm = Realm.getDefaultInstance()
taskBean.hadLinkDvoList.forEach { hadLinkDvoBean ->
val objects = realm.where(QsRecordBean::class.java)
.equalTo("linkId", hadLinkDvoBean.linkPid).findAll()
.equalTo("linkId", hadLinkDvoBean.linkPid).and()
.equalTo("taskId", hadLinkDvoBean.taskId).findAll()
val map: MutableMap<TaskBean, Boolean> = HashMap<TaskBean, Boolean>()
if (objects.isEmpty() && hadLinkDvoBean.reason.isEmpty()) {
withContext(Dispatchers.Main) {
@@ -319,19 +400,15 @@ class TaskViewModel @Inject constructor(
mDialog.setTitle("提示?")
mDialog.setMessage("此任务中存在未测评link请确认")
mDialog.setPositiveButton(
"确定",
object : FirstDialog.OnClickListener {
override fun onClick(dialog: Dialog?, which: Int) {
mDialog.dismiss()
map[taskBean] = true
liveDataTaskUpload.postValue(map)
}
})
mDialog.setNegativeButton("取消", object : FirstDialog.OnClickListener {
override fun onClick(dialog: Dialog?, which: Int) {
mDialog.dismiss()
}
})
"确定"
) { _, _ ->
mDialog.dismiss()
map[taskBean] = true
liveDataTaskUpload.postValue(map)
}
mDialog.setNegativeButton(
"取消"
) { _, _ -> mDialog.dismiss() }
mDialog.show()
}
return@launch
@@ -341,4 +418,131 @@ class TaskViewModel @Inject constructor(
}
}
}
/**
* 监听新增的评测link
*/
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
if (key == Constant.SHARED_SYNC_TASK_LINK_ID) {
viewModelScope.launch(Dispatchers.IO) {
getLocalTaskList()
}
}
}
/**
* 设置是否开启选择link
*/
fun setSelectLink(selected: Boolean) {
liveDataSelectNewLink.value = selected
//开始捕捉
if (selected) {
mapController.mMapView.addOnNIMapClickListener(TAG, object : OnGeoPointClickListener {
override fun onMapClick(tag: String, point: GeoPoint) {
if (tag == TAG) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
viewModelScope.launch(Dispatchers.Default) {
if (currentSelectTaskBean == null) {
liveDataToastMessage.postValue("还没有开启任何任务")
} else {
val links = realmOperateHelper.queryLink(
point = point,
)
if (links.isNotEmpty()) {
val l = links[0]
for (link in currentSelectTaskBean!!.hadLinkDvoList) {
if (link.linkPid == l.properties["linkPid"]) {
return@launch
}
}
val hadLinkDvoBean = HadLinkDvoBean(
taskId = currentSelectTaskBean!!.id,
linkPid = l.properties["linkPid"]!!,
geometry = l.geometry,
linkStatus = 2
)
currentSelectTaskBean!!.hadLinkDvoList.add(
hadLinkDvoBean
)
val realm = Realm.getDefaultInstance()
realm.executeTransaction { r ->
r.copyToRealmOrUpdate(hadLinkDvoBean)
r.copyToRealmOrUpdate(currentSelectTaskBean!!)
}
liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList)
mapController.lineHandler.addTaskLink(hadLinkDvoBean)
}
}
}
}
}
}
})
} else {
mapController.mMapView.removeOnNIMapClickListener(TAG)
mapController.lineHandler.removeLine()
}
}
/**
* 删除评测link
*/
fun deleteTaskLink(context: Context, hadLinkDvoBean: HadLinkDvoBean) {
if (hadLinkDvoBean.linkStatus == 1) {
val mDialog = FirstDialog(context)
mDialog.setTitle("提示")
mDialog.setMessage("当前要评测的link是任务原始规划的不能删除如果不进行作业请标记原因")
mDialog.setCancelVisibility(View.GONE)
mDialog.setPositiveButton(
"确定"
) { _, _ ->
mDialog.dismiss()
}
mDialog.show()
} else {
val mDialog = FirstDialog(context)
mDialog.setTitle("提示")
mDialog.setMessage("是否删除当前link与之相关联的评测任务会一起删除")
mDialog.setPositiveButton(
"确定"
) { dialog, _ ->
dialog.dismiss()
viewModelScope.launch(Dispatchers.IO) {
val realm = Realm.getDefaultInstance()
realm.executeTransaction {
for (link in currentSelectTaskBean!!.hadLinkDvoList) {
if (link.linkPid == hadLinkDvoBean.linkPid) {
currentSelectTaskBean!!.hadLinkDvoList.remove(link)
break
}
}
realm.where(HadLinkDvoBean::class.java)
.equalTo("linkPid", hadLinkDvoBean.linkPid).findFirst()
?.deleteFromRealm()
val markers = realm.where(QsRecordBean::class.java)
.equalTo("linkId", hadLinkDvoBean.linkPid)
.and().equalTo("taskId", hadLinkDvoBean.taskId)
.findAll()
if(markers != null){
for(marker in markers){
mapController.markerHandle.removeQsRecordMark(marker)
}
markers.deleteAllFromRealm()
}
realm.copyToRealmOrUpdate(currentSelectTaskBean)
mapController.lineHandler.removeTaskLink(hadLinkDvoBean.linkPid)
liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList)
}
}
}
mDialog.setNegativeButton(
"取消"
) { _, _ ->
mDialog.dismiss()
}
mDialog.show()
}
}
}