From 43b62f9947d4a046e57590b10b45c4b15988da7e Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Thu, 13 Jul 2023 16:36:43 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=84=E6=B5=8Blink?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 + .../main/java/com/navinfo/omqs/Constant.kt | 2 + .../omqs/ui/activity/map/MainViewModel.kt | 27 +-- .../ui/fragment/tasklink/TaskLinkFragment.kt | 6 +- .../ui/fragment/tasklink/TaskLinkViewModel.kt | 39 +++- .../ui/fragment/tasklist/TaskViewModel.kt | 212 +++++++++++------- 6 files changed, 168 insertions(+), 120 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 03268d5c..ca4fa52f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -131,6 +131,8 @@ dependencies { //图片加载 implementation 'com.github.bumptech.glide:glide:4.15.1' annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1' +// implementation "io.realm:realm-kotlin-extensions:6.1.0" + } //允许引用生成的代码 kapt { diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index 3e194ff9..27fb6278 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -94,6 +94,8 @@ class Constant { const val EVENT_LAYER_MANAGER_CHANGE = "EVENT_LAYER_MANAGER_CHANGE" // 图层管理中的配置修改 const val SELECT_TASK_ID = "select_task_id" //选中的任务ID + + const val SHARED_SYNC_TASK_LINK_ID = "shared_sync_task_link_id"//利用shared通知任务页面更新 } 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..0894b197 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 @@ -64,6 +65,7 @@ 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 @@ -152,30 +154,19 @@ class MainViewModel @Inject constructor( } /** - * 初始话任务高亮高亮 + * 初始化选中的任务高亮高亮 */ private fun initTaskData() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - viewModelScope.launch { + viewModelScope.launch(Dispatchers.IO) { + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) 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) - } - } - 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)) -// } - mapController.lineHandler.omdbTaskLinkLayer.addLineList(item.hadLinkDvoList) + val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst() + if (res != null) { + val taskBean = realm.copyFromRealm(res) + mapController.lineHandler.omdbTaskLinkLayer.addLineList(taskBean.hadLinkDvoList) } } -// realm.close() } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt index 703e0d85..f259415d 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt @@ -6,7 +6,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast -import androidx.fragment.app.viewModels import androidx.navigation.findNavController import androidx.navigation.fragment.findNavController import com.navinfo.collect.library.map.NIMapController @@ -14,7 +13,6 @@ 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.BaseToast import com.navinfo.omqs.ui.other.shareViewModels import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -144,7 +142,9 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener { onBackPressed() } binding.taskLinkBarSave -> { - viewModel.saveData() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + viewModel.saveData() + } } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt index 88778e8e..1ccd5587 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt @@ -2,12 +2,14 @@ package com.navinfo.omqs.ui.fragment.tasklink 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.TaskBean import com.navinfo.collect.library.map.NIMapController +import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.omqs.Constant import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Realm @@ -22,14 +24,14 @@ import javax.inject.Inject @HiltViewModel class TaskLinkViewModel @Inject constructor( - val mapController: NIMapController, - val sharedPreferences: SharedPreferences + private val mapController: NIMapController, + private val sharedPreferences: SharedPreferences ) : ViewModel(), SharedPreferences.OnSharedPreferenceChangeListener { /** * 种别 */ - private val kindList = listOf( + private val kindList = listOf( TaskLinkInfoAdapterItem("高速道路", "1"), TaskLinkInfoAdapterItem("城市高速", "2"), TaskLinkInfoAdapterItem("国道", "3"), @@ -47,7 +49,7 @@ class TaskLinkViewModel @Inject constructor( /** * FunctionGrade 功能等级 */ - private val functionLevelList = listOf( + private val functionLevelList = listOf( TaskLinkInfoAdapterItem("等级1", "1"), TaskLinkInfoAdapterItem("等级2", "2"), TaskLinkInfoAdapterItem("等级3", "3"), @@ -58,7 +60,7 @@ class TaskLinkViewModel @Inject constructor( /** * 数据级别 */ - private val dataLevelList = listOf( + private val dataLevelList = listOf( TaskLinkInfoAdapterItem("Pro lane model(有高精车道模型覆盖的高速和城高link)", "1"), TaskLinkInfoAdapterItem("Lite lane model(有高精车道模型覆盖的普通路link)", "2"), TaskLinkInfoAdapterItem("Standard road model(其他link)", "3"), @@ -115,7 +117,7 @@ class TaskLinkViewModel @Inject constructor( 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(realm.copyFromRealm(res)) + liveDataTaskBean.postValue(res?.let { realm.copyFromRealm(it) }) } } @@ -162,18 +164,17 @@ class TaskLinkViewModel @Inject constructor( /** * 保存数据 */ + @RequiresApi(Build.VERSION_CODES.M) fun saveData() { viewModelScope.launch(Dispatchers.Default) { if (liveDataTaskBean.value == null) { liveDataToastMessage.postValue("还没有选择任何一条任务!") return@launch } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (mapController.measureLayerHandler.mPathLayer.points.size < 2) { - liveDataToastMessage.postValue("道路点少于2个!") - return@launch - } + if (mapController.measureLayerHandler.mPathLayer.points.size < 2) { + liveDataToastMessage.postValue("道路点少于2个!") + return@launch } if (liveDataSelectKind.value == null) { liveDataToastMessage.postValue("请选择种别!") @@ -187,7 +188,21 @@ class TaskLinkViewModel @Inject constructor( liveDataToastMessage.postValue("请选择数据等级!") return@launch } - val linkBean = HadLinkDvoBean(linkPid = UUID.randomUUID().toString()) + val linkBean = HadLinkDvoBean( + linkPid = UUID.randomUUID().toString(), + linkStatus = 3, + geometry = GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points), + linkLength = mapController.measureLayerHandler.lineLenghtLiveData.value!!, + ) + val task: TaskBean = liveDataTaskBean.value!! + task.hadLinkDvoList.add(linkBean) + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + it.copyToRealmOrUpdate(task) + } + sharedPreferences.edit().putString(Constant.SHARED_SYNC_TASK_LINK_ID, linkBean.linkPid) + .apply() + liveDataFinish.postValue(true) } } 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 7ffa46e3..2552b46e 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 @@ -1,9 +1,8 @@ package com.navinfo.omqs.ui.fragment.tasklist -import android.app.Dialog import android.content.Context import android.content.SharedPreferences -import android.graphics.Color +import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.os.Build import android.widget.Toast import androidx.annotation.RequiresApi @@ -32,7 +31,7 @@ class TaskViewModel @Inject constructor( private val networkService: NetworkService, private val mapController: NIMapController, private val sharedPreferences: SharedPreferences -) : ViewModel() { +) : ViewModel(), OnSharedPreferenceChangeListener { /** * 用来更新任务列表 @@ -49,8 +48,8 @@ class TaskViewModel @Inject constructor( */ val liveDataTaskUpload = MutableLiveData>() - 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) /** * 当前选中的任务 @@ -65,13 +64,16 @@ class TaskViewModel @Inject constructor( private var filterTaskJob: Job? = null + init { + sharedPreferences.registerOnSharedPreferenceChangeListener(this) + } + /** * 下载任务列表 */ fun getTaskList(context: Context) { viewModelScope.launch(Dispatchers.IO) { - var taskList: List = mutableListOf() when (val result = networkService.getTaskList(Constant.USER_ID)) { is NetResult.Success -> { if (result.data != null) { @@ -87,6 +89,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) { //赋值时间,用于查询过滤 @@ -120,27 +123,40 @@ 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() + 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) - } - liveDataTaskList.postValue(taskList) - val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) - if (id > -1) { - for(item in taskList){ - if(item.id == id){ - currentSelectTaskBean = item - liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList) + if (item.id == id) { + currentSelectTaskBean = item + liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList) + withContext(Dispatchers.Main) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + showTaskLinks(currentSelectTaskBean!!) + } } + break } } } @@ -149,14 +165,21 @@ class TaskViewModel @Inject constructor( /** * 设置当前选择的任务,并高亮当前任务的所有link */ - @RequiresApi(Build.VERSION_CODES.M) + fun setSelectTaskBean(taskBean: TaskBean) { - sharedPreferences.edit().putInt(Constant.SELECT_TASK_ID, taskBean.id).commit() + sharedPreferences.edit().putInt(Constant.SELECT_TASK_ID, taskBean.id).apply() currentSelectTaskBean = taskBean liveDataTaskLinks.value = taskBean.hadLinkDvoList + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + showTaskLinks(taskBean) + } + } + + @RequiresApi(Build.VERSION_CODES.M) + private fun showTaskLinks(taskBean: TaskBean) { mapController.lineHandler.omdbTaskLinkLayer.removeAll() if (taskBean.hadLinkDvoList.isNotEmpty()) { @@ -215,10 +238,13 @@ class TaskViewModel @Inject constructor( if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { mapController.lineHandler.omdbTaskLinkLayer.clearSelectLine() } + sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) super.onCleared() } - + /** + * 保存link补作业原因 + */ suspend fun saveLinkReason(bean: HadLinkDvoBean, text: String) { withContext(Dispatchers.IO) { currentSelectTaskBean?.let { @@ -227,11 +253,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) - } + } } @@ -255,6 +282,9 @@ class TaskViewModel @Inject constructor( } } + /** + * 筛选link + */ fun filterTask(pidKey: String) { if (currentSelectTaskBean == null) return @@ -272,53 +302,54 @@ 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( + "确定" + ) { _, _ -> + 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() + } + //遍历删除对应的数据 + 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) } - //遍历删除对应的数据 - 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) + } } + mDialog.setNegativeButton("取消", null) + mDialog.show() } fun checkUploadTask(context: Context, taskBean: TaskBean) { @@ -335,19 +366,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 @@ -357,4 +384,15 @@ 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() + } + } + } } From be2d0389cfc56a8d6f779d466409eb42090b0c6f Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Thu, 13 Jul 2023 17:43:38 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=84=E6=B5=8Blink?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainViewModel.kt | 61 ++- .../library/map/handler/MarkHandler.kt | 367 +++++++++--------- 2 files changed, 228 insertions(+), 200 deletions(-) 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 0894b197..ab19604d 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 @@ -19,10 +19,13 @@ import androidx.annotation.RequiresApi import androidx.constraintlayout.widget.Group import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.lifecycleScope 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.NoteBean +import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController @@ -44,6 +47,7 @@ import com.navinfo.omqs.util.SpeakMode import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Realm import io.realm.RealmSet +import io.realm.kotlin.where import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @@ -149,27 +153,62 @@ class MainViewModel @Inject constructor( } } } - - initTaskData() + viewModelScope.launch(Dispatchers.IO) { + initTaskData() + initQsRecordData() + initNoteData() + } } /** * 初始化选中的任务高亮高亮 */ - private fun initTaskData() { + private suspend fun initTaskData() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - 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() - if (res != null) { - val taskBean = realm.copyFromRealm(res) - mapController.lineHandler.omdbTaskLinkLayer.addLineList(taskBean.hadLinkDvoList) - } + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + val realm = Realm.getDefaultInstance() + val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst() + if (res != null) { + val taskBean = realm.copyFromRealm(res) + mapController.lineHandler.omdbTaskLinkLayer.addLineList(taskBean.hadLinkDvoList) } } } + /** + * 初始化渲染质检数据 + */ + private suspend fun initQsRecordData() { + var list = mutableListOf() + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + val objects = realm.where().findAll() + list = realm.copyFromRealm(objects) + } + for (item in list) { + mapController.markerHandle.addOrUpdateQsRecordMark(item) + } + } + + /** + * 初始化渲染便签数据 + */ + private suspend fun initNoteData() { + var list = mutableListOf() + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + val objects = realm.where().findAll() + list = realm.copyFromRealm(objects) + } + + for (item in list) { + mapController.markerHandle.addOrUpdateNoteMark(item) + } + } + + /** + * 初始化定位信息 + */ private fun initLocation() { //用于定位点存储到数据库 viewModelScope.launch(Dispatchers.Default) { 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 4ba05831..a8d968dc 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 @@ -42,8 +42,6 @@ import java.util.* class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView) { - // //默认marker图层 - private var mDefaultMarkerLayer: ItemizedLayer /** * 默认文字颜色 @@ -53,22 +51,94 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 文字画笔 */ - - private lateinit var paint: Paint - - //画布 - private lateinit var canvas: org.oscim.backend.canvas.Canvas - private lateinit var itemizedLayer: MyItemizedLayer - - private lateinit var markerRendererFactory: MarkerRendererFactory - private val resId = R.mipmap.map_icon_report - private val noteResId = R.drawable.icon_note_marker - private var itemListener: OnQsRecordItemClickListener? = null + private val paint: Paint by lazy { + val p = CanvasAdapter.newPaint() + p.setTypeface(Paint.FontFamily.DEFAULT, Paint.FontStyle.NORMAL) + p.setTextSize(NUM_13 * CanvasAdapter.getScale()) + p.strokeWidth = 2 * CanvasAdapter.getScale() + p.color = Color.parseColor(mDefaultTextColor) + p + } /** - * 文字大小 + * 画布 */ - private val NUM_13 = 13 + private val canvas: org.oscim.backend.canvas.Canvas by lazy { + CanvasAdapter.newCanvas() + } + + /** + * 默认marker图层 + */ + private val mDefaultMarkerLayer: ItemizedLayer by lazy { + //新增marker图标样式 + val mDefaultBitmap = + AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.marker)) + + val markerSymbol = MarkerSymbol( + mDefaultBitmap, + MarkerSymbol.HotspotPlace.BOTTOM_CENTER + ) + val layer = ItemizedLayer( + mapView.vtmMap, + ArrayList(), + markerSymbol, + object : OnItemGestureListener { + override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { + return false + } + + override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean { + return false + } + + } + ) + addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) + layer + } + + + /** + * 评测数据marker 图层 + */ + private val qsRecordItemizedLayer: MyItemizedLayer by lazy { + val layer = MyItemizedLayer( + mMapView.vtmMap, + mutableListOf(), + markerRendererFactory, + object : MyItemizedLayer.OnItemGestureListener { + override fun onItemSingleTapUp( + list: MutableList, + nearest: Int + ): Boolean { + itemListener?.let { + val idList = mutableListOf() + if (list.size == 0) { + } else { + for (i in list) { + val markerInterface: MarkerInterface = + qsRecordItemizedLayer.itemList[i] + if (markerInterface is MarkerItem) { + idList.add(markerInterface.title) + } + } + it.onQsRecordList(idList.distinct().toMutableList()) + } + } + return true + } + + override fun onItemLongPress( + list: MutableList?, + nearest: Int + ): Boolean { + return true + } + }) + addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) + layer + } /** * 便签线图层 @@ -79,7 +149,9 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : layer } - + /** + * 便签图标图层 + */ private val noteLayer: MyItemizedLayer by lazy { val layer = MyItemizedLayer( @@ -94,6 +166,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : itemListener?.let { val idList = mutableListOf() if (list.size == 0) { + } else { for (i in list) { val markerInterface: MarkerInterface = @@ -120,50 +193,61 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : layer } - init { - //新增marker图标样式 - val mDefaultBitmap = - AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.marker)); - val markerSymbol = MarkerSymbol( - mDefaultBitmap, - MarkerSymbol.HotspotPlace.BOTTOM_CENTER - ); - //新增marker图层 - mDefaultMarkerLayer = ItemizedLayer( - mapView.vtmMap, - ArrayList(), - markerSymbol, - object : OnItemGestureListener { - override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { - return false - } - - override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean { - return false - } - - } + private val markerRendererFactory: MarkerRendererFactory by lazy { + val bitmapPoi: Bitmap = AndroidBitmap( + BitmapFactory.decodeResource( + mContext.resources, + R.mipmap.map_icon_blue2 + ) ) + val symbol = MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER) + MarkerRendererFactory { markerLayer -> + object : ClusterMarkerRenderer( + mContext, + markerLayer, + symbol, + ClusterStyle( + org.oscim.backend.canvas.Color.WHITE, + org.oscim.backend.canvas.Color.BLUE + ) + ) { +// override fun getClusterBitmap(size: Int): Bitmap? { +// return super.getclusterbitmap(size) +// } + } + } + } + private val resId = R.mipmap.map_icon_report + private val noteResId = R.drawable.icon_note_marker + private var itemListener: OnQsRecordItemClickListener? = null - //初始化之间数据图层 - initQsRecordDataLayer() - addLayer(mDefaultMarkerLayer, NIMapView.LAYER_GROUPS.OPERATE_MARKER); + /** + * 文字大小 + */ + private val NUM_13 = 13 + + + init { // 设置矢量图层均在12级以上才显示 mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> if (e == Map.SCALE_EVENT) { - itemizedLayer.isEnabled = mapPosition.getZoomLevel() >= 12 + qsRecordItemizedLayer.isEnabled = mapPosition.getZoomLevel() >= 12 } }) - initNoteData() - mMapView.updateMap() } + /** + * 设置marker 点击回调 + */ fun setOnQsRecordItemClickListener(listener: OnQsRecordItemClickListener?) { itemListener = listener } - //增加marker + /** + * 增加marker + */ + fun addMarker( geoPoint: GeoPoint, title: String?, @@ -177,16 +261,16 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } } if (marker == null) { - var tempTitle = title; + var tempTitle = title if (tempTitle.isNullOrBlank()) { - tempTitle = StringUtil.createUUID(); + tempTitle = StringUtil.createUUID() } val marker = MarkerItem( tempTitle, description, geoPoint ) - mDefaultMarkerLayer.addItem(marker); + mDefaultMarkerLayer.addItem(marker) mMapView.vtmMap.updateMap(true) } else { marker.description = description @@ -218,26 +302,24 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 增加或更新marker */ - suspend fun addOrUpdateQsRecordMark(data: QsRecordBean) { - for (item in itemizedLayer.itemList) { + fun addOrUpdateQsRecordMark(data: QsRecordBean) { + for (item in qsRecordItemizedLayer.itemList) { if (item is MarkerItem) { if (item.title == data.id) { - itemizedLayer.itemList.remove(item) + qsRecordItemizedLayer.itemList.remove(item) break } } } - createMarkerItem(data) - withContext(Dispatchers.Main) { - mMapView.updateMap(true) - } + createQsRecordMarker(data) + mMapView.updateMap(true) } /** * 增加或更新便签 */ - suspend fun addOrUpdateNoteMark(data: NoteBean) { + fun addOrUpdateNoteMark(data: NoteBean) { for (item in noteLayer.itemList) { if (item is MarkerItem) { if (item.title == data.id) { @@ -248,9 +330,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } noteLineLayer.removeNoteBeanLines(data) createNoteMarkerItem(data) - withContext(Dispatchers.Main) { - mMapView.updateMap(true) - } + mMapView.updateMap(true) } @@ -258,19 +338,13 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : var resultDrawable: Drawable? = null if ("POINT" == geometry.geometryType.uppercase(Locale.getDefault())) { val geoPoint = GeoPoint(geometry.coordinate.y, geometry.coordinate.x) - if (geoPoint != null) { - resultDrawable = PointDrawable(geoPoint, vectorLayerStyle) - } + resultDrawable = PointDrawable(geoPoint, vectorLayerStyle) } else if ("LINESTRING" == geometry.geometryType.uppercase(Locale.getDefault())) { val lineString = geometry as LineString - if (lineString != null) { - resultDrawable = LineDrawable(lineString, vectorLayerStyle) - } + resultDrawable = LineDrawable(lineString, vectorLayerStyle) } else if ("POLYGON" == geometry.geometryType.uppercase(Locale.getDefault())) { val polygon = geometry as Polygon - if (polygon != null) { - resultDrawable = PolygonDrawable(polygon, vectorLayerStyle) - } + resultDrawable = PolygonDrawable(polygon, vectorLayerStyle) } return resultDrawable } @@ -279,12 +353,12 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 删除质检数据 */ - suspend fun removeQsRecordMark(data: QsRecordBean) { - for (item in itemizedLayer.itemList) { + fun removeQsRecordMark(data: QsRecordBean) { + for (item in qsRecordItemizedLayer.itemList) { if (item is MarkerItem) { if (item.title == data.id) { - itemizedLayer.itemList.remove(item) - itemizedLayer.populate() + qsRecordItemizedLayer.itemList.remove(item) + qsRecordItemizedLayer.populate() return } } @@ -294,141 +368,56 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 删除标签 */ - suspend fun removeNoteMark(data: NoteBean) { + fun removeNoteMark(data: NoteBean) { for (item in noteLayer.itemList) { if (item is MarkerItem) { if (item.title == data.id) { noteLayer.itemList.remove(item) noteLineLayer.removeNoteBeanLines(data) noteLayer.populate() - withContext(Dispatchers.Main) { - mMapView.updateMap(true) - } + mMapView.updateMap(true) return } } } } - /** - * 初始化便签 - */ - private fun initNoteData() { - mContext.lifecycleScope.launch(Dispatchers.IO) { - var list = mutableListOf() - val realm = Realm.getDefaultInstance() - realm.executeTransaction { - val objects = realm.where().findAll() - list = realm.copyFromRealm(objects) - } - for (item in list) { - createNoteMarkerItem(item) - } - } - } - - /** - * 初始话质检数据图层 - */ - private fun initQsRecordDataLayer() { - - canvas = CanvasAdapter.newCanvas() - paint = CanvasAdapter.newPaint() - paint.setTypeface(Paint.FontFamily.DEFAULT, Paint.FontStyle.NORMAL) - paint.setTextSize(NUM_13 * CanvasAdapter.getScale()) - paint.strokeWidth = 2 * CanvasAdapter.getScale() - paint.color = Color.parseColor(mDefaultTextColor) - val bitmapPoi: Bitmap = AndroidBitmap( - BitmapFactory.decodeResource( - mContext.resources, - R.mipmap.map_icon_blue2 - ) - ) - val symbol = MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER) - markerRendererFactory = MarkerRendererFactory { markerLayer -> - object : ClusterMarkerRenderer( - mContext, - markerLayer, - symbol, - ClusterStyle( - org.oscim.backend.canvas.Color.WHITE, - org.oscim.backend.canvas.Color.BLUE - ) - ) { -// override fun getClusterBitmap(size: Int): Bitmap? { -// return super.getclusterbitmap(size) -// } - } - } - - itemizedLayer = - MyItemizedLayer( - mMapView.vtmMap, - mutableListOf(), - markerRendererFactory, - object : MyItemizedLayer.OnItemGestureListener { - override fun onItemSingleTapUp( - list: MutableList, - nearest: Int - ): Boolean { - itemListener?.let { - val idList = mutableListOf() - if (list.size == 0) { - } else { - for (i in list) { - val markerInterface: MarkerInterface = - itemizedLayer.itemList[i] - if (markerInterface is MarkerItem) { - idList.add(markerInterface.title) - } - } - it.onQsRecordList(idList.distinct().toMutableList()) - } - } - return true - } - - override fun onItemLongPress( - list: MutableList?, - nearest: Int - ): Boolean { - return true - } - }) - addLayer(itemizedLayer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) - mContext.lifecycleScope.launch(Dispatchers.IO) { - var list = mutableListOf() - val realm = Realm.getDefaultInstance() - realm.executeTransaction { - val objects = realm.where().findAll() - list = realm.copyFromRealm(objects) - } -// realm.close() - - for (item in list) { - createMarkerItem(item) - } - } - - } +// /** +// * 初始话质检数据图层 +// */ +// private fun initQsRecordDataLayer() { +// +// mContext.lifecycleScope.launch(Dispatchers.IO) { +// var list = mutableListOf() +// val realm = Realm.getDefaultInstance() +// realm.executeTransaction { +// val objects = realm.where().findAll() +// list = realm.copyFromRealm(objects) +// } +// for (item in list) { +// createMarkerItem(item) +// } +// } +// +// } /** * 添加质检数据marker */ - private suspend fun createNoteMarkerItem(item: NoteBean) { + private fun createNoteMarkerItem(item: NoteBean) { val bitmap: Bitmap = createTextMarkerBitmap(mContext, item.description, noteResId) val geometry: Geometry? = GeometryTools.createGeometry(item.guideGeometry) if (geometry != null) { - var geoPoint: org.oscim.core.GeoPoint? = null + var geoPoint: GeoPoint? = null if (geometry.geometryType != null) { when (geometry.geometryType.uppercase(Locale.getDefault())) { "POINT" -> geoPoint = - org.oscim.core.GeoPoint(geometry.coordinate.y, geometry.coordinate.x) + GeoPoint(geometry.coordinate.y, geometry.coordinate.x) } } if (geoPoint != null) { - var geoMarkerItem: MarkerItem + val geoMarkerItem: MarkerItem geoMarkerItem = ClusterMarkerItem( 1, item.id, item.description, geoPoint ) @@ -446,16 +435,16 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 添加质检数据marker */ - private suspend fun createMarkerItem(item: QsRecordBean) { + private fun createQsRecordMarker(item: QsRecordBean) { val bitmap: Bitmap = createTextMarkerBitmap(mContext, item.description, resId) if (item.t_lifecycle != 2) { val geometry: Geometry? = GeometryTools.createGeometry(item.geometry) if (geometry != null) { - var geoPoint: org.oscim.core.GeoPoint? = null + var geoPoint: GeoPoint? = null if (geometry.geometryType != null) { when (geometry.geometryType.uppercase(Locale.getDefault())) { "POINT" -> geoPoint = - org.oscim.core.GeoPoint(geometry.coordinate.y, geometry.coordinate.x) + GeoPoint(geometry.coordinate.y, geometry.coordinate.x) // "LINESTRING" -> { // val lineString = geometry as LineString // if (lineString != null && lineString.coordinates.size > 0) { @@ -487,7 +476,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } } if (geoPoint != null) { - var geoMarkerItem: MarkerItem + val geoMarkerItem: MarkerItem // if (item.getType() === 1) { geoMarkerItem = ClusterMarkerItem( 1, item.id, item.description, geoPoint @@ -503,11 +492,11 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : val markerSymbol = MarkerSymbol(bitmap, MarkerSymbol.HotspotPlace.CENTER) geoMarkerItem.marker = markerSymbol - itemizedLayer.itemList.add(geoMarkerItem) + qsRecordItemizedLayer.itemList.add(geoMarkerItem) } } } - itemizedLayer.populate() + qsRecordItemizedLayer.populate() } @@ -700,7 +689,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : val originBitmap = android.graphics.Bitmap.createBitmap( if (drawable.intrinsicWidth > maxWidth) drawable.intrinsicWidth else maxWidth.toInt(), drawable.intrinsicHeight * 2, - android.graphics.Bitmap.Config.ARGB_4444 + android.graphics.Bitmap.Config.ARGB_8888 ) val androidCanvas = Canvas(originBitmap) val startX = (originBitmap.width - drawable.intrinsicWidth) / 2