From 108c6daa2f230afe598dc7d536ba76619634853f Mon Sep 17 00:00:00 2001
From: qiji4215 <qiji4215@navinfo.com>
Date: Fri, 14 Jul 2023 10:54:02 +0800
Subject: [PATCH] merge code

---
 .../omqs/ui/activity/map/MainActivity.kt      |   6 +
 .../omqs/ui/activity/map/MainViewModel.kt     | 245 ++++++++++--------
 .../ui/fragment/tasklist/TaskViewModel.kt     |  15 ++
 .../library/data/dao/impl/INiLocationDao.java |   3 +
 .../library/map/handler/MarkHandler.kt        |  39 +--
 5 files changed, 180 insertions(+), 128 deletions(-)

diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt
index 470c9128..c5151558 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt
@@ -220,6 +220,12 @@ class MainActivity : BaseActivity() {
                 }
             }
         }
+
+        //捕捉列表变化回调
+        viewModel.liveDataNILocationList.observe(this) {
+             Toast.makeText(this,"轨迹被点击了",Toast.LENGTH_LONG).show()
+        }
+
         //右上角菜单是否被点击
         viewModel.liveDataMenuState.observe(this) {
             binding.mainActivityMenu.isSelected = it
diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt
index 33720482..eb5ada1d 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt
@@ -3,6 +3,7 @@ package com.navinfo.omqs.ui.activity.map
 import android.app.Activity
 import android.content.Context
 import android.content.DialogInterface
+import android.content.SharedPreferences
 import android.graphics.drawable.AnimationDrawable
 import android.graphics.drawable.BitmapDrawable
 import android.os.Build
@@ -15,13 +16,13 @@ import android.view.ViewGroup
 import android.widget.ImageView
 import android.widget.PopupWindow
 import androidx.annotation.RequiresApi
-import androidx.constraintlayout.widget.Group
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import androidx.navigation.findNavController
 import com.blankj.utilcode.util.ToastUtils
 import com.navinfo.collect.library.data.dao.impl.TraceDataBase
+import com.navinfo.collect.library.data.entity.NiLocation
 import com.navinfo.collect.library.data.entity.RenderEntity
 import com.navinfo.collect.library.data.entity.TaskBean
 import com.navinfo.collect.library.map.NIMapController
@@ -31,7 +32,6 @@ import com.navinfo.collect.library.utils.GeometryToolsKt
 import com.navinfo.omqs.Constant
 import com.navinfo.omqs.R
 import com.navinfo.omqs.bean.ImportConfig
-import com.navinfo.omqs.bean.RoadNameBean
 import com.navinfo.omqs.bean.SignBean
 import com.navinfo.omqs.db.RealmOperateHelper
 import com.navinfo.omqs.ui.dialog.CommonDialog
@@ -59,11 +59,13 @@ import javax.inject.Inject
  * 创建Activity全局viewmode
  */
 
+@RequiresApi(Build.VERSION_CODES.M)
 @HiltViewModel
 class MainViewModel @Inject constructor(
     private val mapController: NIMapController,
     private val traceDataBase: TraceDataBase,
     private val realmOperateHelper: RealmOperateHelper,
+    private val sharedPreferences: SharedPreferences,
 ) : ViewModel() {
 
     private var mCameraDialog: CommonDialog? = null
@@ -74,6 +76,9 @@ class MainViewModel @Inject constructor(
     //地图点击捕捉到的标签ID列表
     val liveDataNoteIdList = MutableLiveData<List<String>>()
 
+    //地图点击捕捉到的轨迹列表
+    val liveDataNILocationList = MutableLiveData<List<NiLocation>>()
+
     //左侧看板数据
     val liveDataSignList = MutableLiveData<List<SignBean>>()
 
@@ -117,6 +122,8 @@ class MainViewModel @Inject constructor(
 
     private var linkIdCache = ""
 
+    private var lastNiLocaion: NiLocation? = null
+
     init {
         mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition ->
             when (e) {
@@ -135,6 +142,10 @@ class MainViewModel @Inject constructor(
             override fun onNoteList(list: MutableList<String>) {
                 liveDataNoteIdList.value = list
             }
+
+            override fun onNiLocationList(list: MutableList<NiLocation>) {
+                liveDataNILocationList.value = list
+            }
         })
         initLocation()
         //处理地图点击操作
@@ -154,29 +165,26 @@ class MainViewModel @Inject constructor(
     /**
      * 初始话任务高亮高亮
      */
+    @RequiresApi(Build.VERSION_CODES.M)
     private fun initTaskData() {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-            viewModelScope.launch {
-                val realm = Realm.getDefaultInstance()
-                val results = realm.where(TaskBean::class.java).findAll()
-                val list = realm.copyFromRealm(results)
-                results.addChangeListener { changes ->
-                    val list2 = realm.copyFromRealm(changes)
-                    mapController.lineHandler.omdbTaskLinkLayer.removeAll()
-                    for (item in list2) {
-                        mapController.lineHandler.omdbTaskLinkLayer.addLineList(item.hadLinkDvoList)
-                    }
-                }
+        viewModelScope.launch {
+            val realm = Realm.getDefaultInstance()
+            val results = realm.where(TaskBean::class.java).findAll()
+            val list = realm.copyFromRealm(results)
+            results.addChangeListener { changes ->
+                val list2 = realm.copyFromRealm(changes)
                 mapController.lineHandler.omdbTaskLinkLayer.removeAll()
-                for (item in list) {
-//                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-//                        mapController.lineHandler.omdbTaskLinkLayer.setLineColor(Color.valueOf(item.color))
-//                    }
+                for (item in list2) {
                     mapController.lineHandler.omdbTaskLinkLayer.addLineList(item.hadLinkDvoList)
                 }
             }
-//            realm.close()
+            mapController.lineHandler.omdbTaskLinkLayer.removeAll()
+            for (item in list) {
+                mapController.lineHandler.omdbTaskLinkLayer.addLineList(item.hadLinkDvoList)
+            }
         }
+
+
     }
 
     private fun initLocation() {
@@ -206,8 +214,27 @@ class MainViewModel @Inject constructor(
                 } catch (e: Exception) {
 
                 }
-                traceDataBase.niLocationDao.insert(location)
-                mapController.mMapView.vtmMap.updateMap(true)
+                val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1)
+                location.taskId = id.toString()
+                //增加间距判断
+                if (lastNiLocaion != null) {
+                    val disance = GeometryTools.distanceToDouble(
+                        GeoPoint(location.latitude, location.longitude), GeoPoint(
+                            lastNiLocaion!!.latitude, lastNiLocaion!!.longitude
+                        )
+                    )
+                    //相距差距大于0.5米以上进行存储
+                    if (disance > 0.5) {
+                        traceDataBase.niLocationDao.insert(location)
+                        mapController.markerHandle.addNiLocationMarkerItem(location)
+                    }
+                } else {
+                    traceDataBase.niLocationDao.insert(location)
+                    mapController.markerHandle.addNiLocationMarkerItem(location)
+                }
+
+                lastNiLocaion = location
+                //mapController.mMapView.vtmMap.updateMap(true)
             }
         }
         //用于定位点捕捉道路
@@ -217,6 +244,18 @@ class MainViewModel @Inject constructor(
             }
         }
 
+        //加载轨迹数据
+        viewModelScope.launch(Dispatchers.IO) {
+            val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1)
+            val list: List<NiLocation>? = TraceDataBase.getDatabase(
+                mapController.mMapView.context,
+                Constant.USER_DATA_PATH
+            ).niLocationDao.findToTaskIdAll(id.toString())
+            list!!.forEach {
+                mapController.markerHandle.addNiLocationMarkerItem(it)
+            }
+        }
+
         //显示轨迹图层
         mapController.layerManagerHandler.showNiLocationLayer()
 
@@ -225,102 +264,104 @@ class MainViewModel @Inject constructor(
     /**
      * 捕获道路和面板
      */
+    @RequiresApi(Build.VERSION_CODES.N)
     private suspend fun captureLink(point: GeoPoint) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            val linkList = realmOperateHelper.queryLink(
-                point = point,
-            )
-            var hisRoadName = false
-            if (linkList.isNotEmpty()) {
-                //看板数据
-                val signList = mutableListOf<SignBean>()
-                val topSignList = mutableListOf<SignBean>()
-                mapController.lineHandler.linksLayer.clear()
 
-                val link = linkList[0]
+        val linkList = realmOperateHelper.queryLink(
+            point = point,
+        )
+        var hisRoadName = false
+        if (linkList.isNotEmpty()) {
+            //看板数据
+            val signList = mutableListOf<SignBean>()
+            val topSignList = mutableListOf<SignBean>()
+            mapController.lineHandler.linksLayer.clear()
 
-                val linkId = link.properties[RenderEntity.Companion.LinkTable.linkPid]
+            val link = linkList[0]
 
-                if (linkIdCache != linkId) {
+            val linkId = link.properties[RenderEntity.Companion.LinkTable.linkPid]
 
-                    mapController.lineHandler.showLine(link.geometry)
-                    linkId?.let {
-                        var elementList = realmOperateHelper.queryLinkByLinkPid(it)
-                        for (element in elementList) {
+            if (linkIdCache != linkId) {
 
-                            if (element.code == 2011) {
-                                hisRoadName = true
-                                liveDataRoadName.postValue(element)
-                                continue
-                            }
-
-                            val distance = GeometryTools.distanceToDouble(
-                                point, GeometryTools.createGeoPoint(element.geometry)
-                            )
-
-                            val signBean = SignBean(
-                                iconId = SignUtil.getSignIcon(element),
-                                iconText = SignUtil.getSignIconText(element),
-                                distance = distance.toInt(),
-                                linkId = linkId,
-                                name = SignUtil.getSignNameText(element),
-                                bottomRightText = SignUtil.getSignBottomRightText(element),
-                                renderEntity = element,
-                                isMoreInfo = SignUtil.isMoreInfo(element),
-                                index = SignUtil.getRoadInfoIndex(element)
-                            )
-                            Log.e("jingo", "捕捉到的数据code ${element.code}")
-                            when (element.code) {
-                                //车道数,种别,功能等级,线限速,道路方向
-                                2041, 2008, 2002, 2019, 2010 -> topSignList.add(
-                                    signBean
-                                )
-                                4002, 4003, 4004, 4010, 4022, 4601 -> signList.add(
-                                    signBean
-                                )
-                            }
+                mapController.lineHandler.showLine(link.geometry)
+                linkId?.let {
+                    var elementList = realmOperateHelper.queryLinkByLinkPid(it)
+                    for (element in elementList) {
 
+                        if (element.code == 2011) {
+                            hisRoadName = true
+                            liveDataRoadName.postValue(element)
+                            continue
                         }
 
-                        val realm = Realm.getDefaultInstance()
-                        val entity = realm.where(RenderEntity::class.java)
-                            .equalTo("table", "OMDB_RESTRICTION").and().equalTo(
-                                "properties['linkIn']", it
+                        val distance = GeometryTools.distanceToDouble(
+                            point, GeometryTools.createGeoPoint(element.geometry)
+                        )
+
+                        val signBean = SignBean(
+                            iconId = SignUtil.getSignIcon(element),
+                            iconText = SignUtil.getSignIconText(element),
+                            distance = distance.toInt(),
+                            linkId = linkId,
+                            name = SignUtil.getSignNameText(element),
+                            bottomRightText = SignUtil.getSignBottomRightText(element),
+                            renderEntity = element,
+                            isMoreInfo = SignUtil.isMoreInfo(element),
+                            index = SignUtil.getRoadInfoIndex(element)
+                        )
+                        Log.e("jingo", "捕捉到的数据code ${element.code}")
+                        when (element.code) {
+                            //车道数,种别,功能等级,线限速,道路方向
+                            2041, 2008, 2002, 2019, 2010 -> topSignList.add(
+                                signBean
+                            )
+
+                            4002, 4003, 4004, 4010, 4022, 4601 -> signList.add(
+                                signBean
+                            )
+                        }
+
+                    }
+
+                    val realm = Realm.getDefaultInstance()
+                    val entity = realm.where(RenderEntity::class.java)
+                        .equalTo("table", "OMDB_RESTRICTION").and().equalTo(
+                            "properties['linkIn']", it
+                        ).findFirst()
+                    if (entity != null) {
+                        val outLink = entity.properties["linkOut"]
+                        val linkOutEntity = realm.where(RenderEntity::class.java)
+                            .equalTo("table", "OMDB_RD_LINK").and().equalTo(
+                                "properties['${RenderEntity.Companion.LinkTable.linkPid}']",
+                                outLink
                             ).findFirst()
-                        if (entity != null) {
-                            val outLink = entity.properties["linkOut"]
-                            val linkOutEntity = realm.where(RenderEntity::class.java)
-                                .equalTo("table", "OMDB_RD_LINK").and().equalTo(
-                                    "properties['${RenderEntity.Companion.LinkTable.linkPid}']",
-                                    outLink
-                                ).findFirst()
-                            if (linkOutEntity != null) {
-                                mapController.lineHandler.linksLayer.addLine(
-                                    linkOutEntity.geometry, 0x7DFF0000
-                                )
-                            }
+                        if (linkOutEntity != null) {
+                            mapController.lineHandler.linksLayer.addLine(
+                                linkOutEntity.geometry, 0x7DFF0000
+                            )
                         }
                     }
-
-                    liveDataTopSignList.postValue(topSignList.distinctBy { it.name }
-                        .sortedBy { it.index })
-
-                    liveDataSignList.postValue(signList.sortedBy { it.distance })
-                    val speechText = SignUtil.getRoadSpeechText(topSignList)
-                    withContext(Dispatchers.Main) {
-                        speakMode?.speakText(speechText)
-                    }
-                    linkIdCache = linkId ?: ""
                 }
-            } else {
-                mapController.lineHandler.removeLine()
-                linkIdCache = ""
-            }
-            //如果没有捕捉到道路名
-            if (!hisRoadName) {
-                liveDataRoadName.postValue(null)
+
+                liveDataTopSignList.postValue(topSignList.distinctBy { it.name }
+                    .sortedBy { it.index })
+
+                liveDataSignList.postValue(signList.sortedBy { it.distance })
+                val speechText = SignUtil.getRoadSpeechText(topSignList)
+                withContext(Dispatchers.Main) {
+                    speakMode?.speakText(speechText)
+                }
+                linkIdCache = linkId ?: ""
             }
+        } else {
+            mapController.lineHandler.removeLine()
+            linkIdCache = ""
         }
+        //如果没有捕捉到道路名
+        if (!hisRoadName) {
+            liveDataRoadName.postValue(null)
+        }
+
     }
 
     /**
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
index 35a66f37..64df50fb 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
@@ -10,7 +10,9 @@ 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
@@ -164,6 +166,8 @@ class TaskViewModel @Inject constructor(
         liveDataTaskLinks.value = taskBean.hadLinkDvoList
 
         mapController.lineHandler.omdbTaskLinkLayer.removeAll()
+        mapController.markerHandle.clearNiLocationLayer()
+
         if (taskBean.hadLinkDvoList.isNotEmpty()) {
             mapController.lineHandler.omdbTaskLinkLayer.addLineList(taskBean.hadLinkDvoList)
             var maxX = 0.0
@@ -195,6 +199,17 @@ 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)
+            }
+        }
     }
 
     /**
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/dao/impl/INiLocationDao.java b/collect-library/src/main/java/com/navinfo/collect/library/data/dao/impl/INiLocationDao.java
index 89c6c185..9d362617 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/data/dao/impl/INiLocationDao.java
+++ b/collect-library/src/main/java/com/navinfo/collect/library/data/dao/impl/INiLocationDao.java
@@ -46,4 +46,7 @@ public interface INiLocationDao {
 
     @Query("SELECT * FROM niLocation")
     List<NiLocation> findAll();
+
+    @Query("SELECT * FROM niLocation where taskId =:taskId")
+    List<NiLocation> findToTaskIdAll(String taskId);
 }
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt
index 63aca800..45eff38c 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt
@@ -1,6 +1,7 @@
 package com.navinfo.collect.library.map.handler
 
 import android.content.Context
+import android.content.SharedPreferences
 import android.graphics.BitmapFactory
 import android.graphics.Canvas
 import android.graphics.Color
@@ -8,6 +9,7 @@ import androidx.appcompat.app.AppCompatActivity
 import androidx.core.content.res.ResourcesCompat
 import androidx.lifecycle.lifecycleScope
 import com.navinfo.collect.library.R
+import com.navinfo.collect.library.data.dao.impl.TraceDataBase
 import com.navinfo.collect.library.data.entity.NiLocation
 import com.navinfo.collect.library.data.entity.NoteBean
 import com.navinfo.collect.library.data.entity.QsRecordBean
@@ -235,7 +237,6 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
         }
     }
 
-
     /**
      * 增加或更新marker
      */
@@ -449,17 +450,17 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
                         nearest: Int
                     ): Boolean {
                         itemListener?.let {
-                            val idList = mutableListOf<String>()
+                            val idList = mutableListOf<NiLocation>()
                             if (list.size == 0) {
                             } else {
                                 for (i in list) {
                                     val markerInterface: MarkerInterface =
-                                        itemizedLayer.itemList[i]
+                                        niLocationItemizedLayer.itemList[i]
                                     if (markerInterface is MarkerItem) {
-                                        idList.add(markerInterface.title)
+                                        idList.add(markerInterface.uid as NiLocation)
                                     }
                                 }
-                                it.onQsRecordList(idList.distinct().toMutableList())
+                                it.onNiLocationList(idList.distinct().toMutableList())
                             }
                         }
                         return true
@@ -473,11 +474,6 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
                     }
                 })
         addLayer(niLocationItemizedLayer, NIMapView.LAYER_GROUPS.OPERATE_MARKER)
-        mContext.lifecycleScope.launch(Dispatchers.IO) {
-            var list = mutableListOf<QsRecordBean>()
-
-        }
-
     }
 
     /**
@@ -544,8 +540,8 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
     /**
      * 添加质检数据marker
      */
-    private suspend fun addNiLocationMarkerItem(niLocation: NiLocation) {
-        val item = MarkerItem(niLocation.id, "", GeoPoint(niLocation.latitude, niLocation.longitude))
+    public suspend fun addNiLocationMarkerItem(niLocation: NiLocation) {
+        val item = MarkerItem(niLocation, niLocation.id, "", GeoPoint(niLocation.latitude, niLocation.longitude))
         var itemizedLayer: ItemizedLayer? = null
         val direction: Double = niLocation.direction
         //角度
@@ -800,21 +796,11 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
     }
 
     /**
-     * 添加质检数据marker
+     * 移除轨迹图层
      */
-    private suspend fun createTrackMarkerItem(item: NiLocation) {
-        for (item in itemizedLayer.itemList) {
-            if (item is MarkerItem) {
-                if (item.title == item.uid) {
-                    itemizedLayer.itemList.remove(item)
-                    break
-                }
-            }
-        }
-        //createMarkerItem(data)
-        withContext(Dispatchers.Main) {
-            mMapView.updateMap(true)
-        }
+    fun clearNiLocationLayer() {
+        niLocationItemizedLayer.removeAllItems()
+        niLocationItemizedLayer.update()
     }
 
 }
@@ -822,4 +808,5 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
 interface OnQsRecordItemClickListener {
     fun onQsRecordList(list: MutableList<String>)
     fun onNoteList(list: MutableList<String>)
+    fun onNiLocationList(list: MutableList<NiLocation>)
 }