Merge branch 'master' of gitlab.navinfo.com:CollectVehicle/OneMapQS
This commit is contained in:
@@ -99,6 +99,10 @@ class LoginActivity : CheckPermissionsActivity() {
|
||||
LoginStatus.LOGIN_STATUS_NET_OFFLINE_MAP -> {
|
||||
loginDialog("检查离线地图...")
|
||||
}
|
||||
LoginStatus.LOGIN_STATUS_NET_GET_TASK_LIST -> {
|
||||
loginDialog("获取任务列表...")
|
||||
}
|
||||
else -> {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,6 +117,7 @@ class LoginActivity : CheckPermissionsActivity() {
|
||||
*/
|
||||
private fun loginDialog(message: String) {
|
||||
if (loginDialog == null) {
|
||||
Log.e("jingo", "登录dialog显示")
|
||||
loginDialog = MaterialAlertDialogBuilder(
|
||||
this, com.google.android.material.R.style.MaterialAlertDialog_Material3
|
||||
).setTitle("登录").setMessage(message).show()
|
||||
|
||||
@@ -9,6 +9,7 @@ import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.blankj.utilcode.util.ResourceUtils
|
||||
import com.navinfo.collect.library.data.entity.TaskBean
|
||||
import com.navinfo.omqs.Constant
|
||||
import com.navinfo.omqs.bean.LoginUserBean
|
||||
import com.navinfo.omqs.bean.SysUserBean
|
||||
@@ -17,6 +18,7 @@ import com.navinfo.omqs.http.DefaultResponse
|
||||
import com.navinfo.omqs.http.NetResult
|
||||
import com.navinfo.omqs.http.NetworkService
|
||||
import com.navinfo.omqs.tools.FileManager
|
||||
import com.navinfo.omqs.util.DateTimeUtil
|
||||
import com.navinfo.omqs.util.NetUtils
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import io.realm.Realm
|
||||
@@ -37,6 +39,11 @@ enum class LoginStatus {
|
||||
*/
|
||||
LOGIN_STATUS_NET_OFFLINE_MAP,
|
||||
|
||||
/**
|
||||
* 访问任务列表
|
||||
*/
|
||||
LOGIN_STATUS_NET_GET_TASK_LIST,
|
||||
|
||||
/**
|
||||
* 初始化文件夹
|
||||
*/
|
||||
@@ -108,11 +115,12 @@ class LoginViewModel @Inject constructor(
|
||||
val userCodeCache = sharedPreferences?.getString("userCode", null)
|
||||
val userRealName = sharedPreferences?.getString("userRealName", null)
|
||||
//增加缓存记录,不用每次连接网络登录
|
||||
if (userNameCache != null && passwordCache != null && userCodeCache != null&&userRealName!=null) {
|
||||
if (userNameCache != null && passwordCache != null && userCodeCache != null && userRealName != null) {
|
||||
if (userNameCache == userName && passwordCache == password) {
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
createUserFolder(context, userCodeCache,userRealName)
|
||||
loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS)
|
||||
createUserFolder(context, userCodeCache, userRealName)
|
||||
getOfflineCityList(context)
|
||||
// loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS)
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -156,6 +164,14 @@ class LoginViewModel @Inject constructor(
|
||||
} else {
|
||||
userCode = defaultUserResponse.obj?.userCode.toString()
|
||||
userRealName = defaultUserResponse.obj?.userName.toString()
|
||||
folderInit(
|
||||
context = context,
|
||||
userName = userName,
|
||||
password = password,
|
||||
userCode = userCode,
|
||||
userRealName = userRealName
|
||||
)
|
||||
getOfflineCityList(context)
|
||||
}
|
||||
} else {
|
||||
withContext(Dispatchers.Main) {
|
||||
@@ -197,21 +213,13 @@ class LoginViewModel @Inject constructor(
|
||||
else -> {}
|
||||
}
|
||||
|
||||
//文件夹初始化
|
||||
try {
|
||||
loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_INIT)
|
||||
sharedPreferences?.edit()?.putString("userName", userName)?.commit()
|
||||
sharedPreferences?.edit()?.putString("passWord", password)?.commit()
|
||||
sharedPreferences?.edit()?.putString("userCode", userCode)?.commit()
|
||||
sharedPreferences?.edit()?.putString("userRealName", userRealName)?.commit()
|
||||
}
|
||||
|
||||
createUserFolder(context, userCode,userRealName)
|
||||
} catch (e: IOException) {
|
||||
loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_FAILURE)
|
||||
}
|
||||
/**
|
||||
* 获取离线地图
|
||||
*/
|
||||
private suspend fun getOfflineCityList(context: Context) {
|
||||
|
||||
//假装解压文件等
|
||||
delay(1000)
|
||||
loginStatus.postValue(LoginStatus.LOGIN_STATUS_NET_OFFLINE_MAP)
|
||||
when (val result = networkService.getOfflineMapCityList()) {
|
||||
is NetResult.Success -> {
|
||||
@@ -222,6 +230,7 @@ class LoginViewModel @Inject constructor(
|
||||
}
|
||||
roomAppDatabase.getOfflineMapDao().insertOrUpdate(result.data)
|
||||
}
|
||||
getTaskList(context)
|
||||
}
|
||||
|
||||
is NetResult.Error<*> -> {
|
||||
@@ -229,6 +238,7 @@ class LoginViewModel @Inject constructor(
|
||||
Toast.makeText(context, "${result.exception.message}", Toast.LENGTH_SHORT)
|
||||
.show()
|
||||
}
|
||||
getTaskList(context)
|
||||
}
|
||||
|
||||
is NetResult.Failure<*> -> {
|
||||
@@ -236,18 +246,101 @@ class LoginViewModel @Inject constructor(
|
||||
Toast.makeText(context, "${result.code}:${result.msg}", Toast.LENGTH_SHORT)
|
||||
.show()
|
||||
}
|
||||
getTaskList(context)
|
||||
}
|
||||
|
||||
is NetResult.Loading -> {}
|
||||
else -> {}
|
||||
}
|
||||
loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS)
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取任务列表
|
||||
*/
|
||||
private suspend fun getTaskList(context: Context) {
|
||||
loginStatus.postValue(LoginStatus.LOGIN_STATUS_NET_GET_TASK_LIST)
|
||||
when (val result = networkService.getTaskList(Constant.USER_ID)) {
|
||||
is NetResult.Success -> {
|
||||
if (result.data != null) {
|
||||
val realm = Realm.getDefaultInstance()
|
||||
realm.executeTransaction {
|
||||
result.data.obj?.let { list ->
|
||||
for (index in list.indices) {
|
||||
val task = list[index]
|
||||
val item = realm.where(TaskBean::class.java).equalTo(
|
||||
"id", task.id
|
||||
).findFirst()
|
||||
if (item != null) {
|
||||
task.fileSize = item.fileSize
|
||||
task.status = item.status
|
||||
task.currentSize = item.currentSize
|
||||
task.hadLinkDvoList = item.hadLinkDvoList
|
||||
//已上传后不在更新操作时间
|
||||
if (task.syncStatus != FileManager.Companion.FileUploadStatus.DONE) {
|
||||
//赋值时间,用于查询过滤
|
||||
task.operationTime = DateTimeUtil.getNowDate().time
|
||||
}
|
||||
} else {
|
||||
//赋值时间,用于查询过滤
|
||||
task.operationTime = DateTimeUtil.getNowDate().time
|
||||
}
|
||||
realm.copyToRealmOrUpdate(task)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS)
|
||||
}
|
||||
|
||||
is NetResult.Error<*> -> {
|
||||
withContext(Dispatchers.Main) {
|
||||
Toast.makeText(context, "${result.exception.message}", Toast.LENGTH_SHORT)
|
||||
.show()
|
||||
}
|
||||
loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS)
|
||||
}
|
||||
|
||||
is NetResult.Failure<*> -> {
|
||||
withContext(Dispatchers.Main) {
|
||||
Toast.makeText(context, "${result.code}:${result.msg}", Toast.LENGTH_SHORT)
|
||||
.show()
|
||||
}
|
||||
loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS)
|
||||
}
|
||||
|
||||
is NetResult.Loading -> {}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化文件夹
|
||||
*/
|
||||
private fun folderInit(
|
||||
context: Context,
|
||||
userName: String,
|
||||
password: String,
|
||||
userCode: String,
|
||||
userRealName: String
|
||||
) {
|
||||
//文件夹初始化
|
||||
try {
|
||||
loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_INIT)
|
||||
sharedPreferences?.edit()?.putString("userName", userName)?.commit()
|
||||
sharedPreferences?.edit()?.putString("passWord", password)?.commit()
|
||||
sharedPreferences?.edit()?.putString("userCode", userCode)?.commit()
|
||||
sharedPreferences?.edit()?.putString("userRealName", userRealName)?.commit()
|
||||
|
||||
createUserFolder(context, userCode, userRealName)
|
||||
} catch (e: IOException) {
|
||||
loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_FAILURE)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建用户目录
|
||||
*/
|
||||
private fun createUserFolder(context: Context, userId: String,userRealName:String) {
|
||||
private fun createUserFolder(context: Context, userId: String, userRealName: String) {
|
||||
Constant.IS_VIDEO_SPEED = false
|
||||
Constant.USER_ID = userId
|
||||
Constant.USER_REAL_NAME = userRealName
|
||||
@@ -269,6 +362,7 @@ class LoginViewModel @Inject constructor(
|
||||
.directory(userFolder)
|
||||
.name("OMQS.realm")
|
||||
.encryptionKey(password)
|
||||
.allowQueriesOnUiThread(true)
|
||||
// .modules(Realm.getDefaultModule(), MyRealmModule())
|
||||
.schemaVersion(2)
|
||||
.build()
|
||||
|
||||
@@ -59,6 +59,7 @@ import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.flow.collectLatest
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.locationtech.jts.geom.Point
|
||||
import org.oscim.core.GeoPoint
|
||||
import org.oscim.core.MapPosition
|
||||
import org.oscim.layers.marker.MarkerItem
|
||||
@@ -173,7 +174,7 @@ class MainViewModel @Inject constructor(
|
||||
*/
|
||||
private var bSelectPauseTrace = false
|
||||
|
||||
private var linkIdCache = ""
|
||||
var linkIdCache = ""
|
||||
|
||||
private var lastNiLocaion: NiLocation? = null
|
||||
|
||||
@@ -189,6 +190,8 @@ class MainViewModel @Inject constructor(
|
||||
|
||||
private var disTime: Long = 1000
|
||||
|
||||
private var currentMapZoomLevel: Int = 0
|
||||
|
||||
init {
|
||||
|
||||
mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition ->
|
||||
@@ -196,8 +199,13 @@ class MainViewModel @Inject constructor(
|
||||
Map.SCALE_EVENT, Map.MOVE_EVENT, Map.ROTATE_EVENT -> liveDataCenterPoint.value =
|
||||
mapPosition
|
||||
}
|
||||
if(mapController.mMapView.vtmMap.mapPosition.zoomLevel>=16){
|
||||
|
||||
}
|
||||
currentMapZoomLevel = mapController.mMapView.vtmMap.mapPosition.zoomLevel
|
||||
})
|
||||
|
||||
currentMapZoomLevel = mapController.mMapView.vtmMap.mapPosition.zoomLevel
|
||||
|
||||
shareUtil = ShareUtil(mapController.mMapView.context, 1)
|
||||
|
||||
@@ -215,6 +223,8 @@ class MainViewModel @Inject constructor(
|
||||
//线选择状态
|
||||
if (bSelectRoad) {
|
||||
captureLink(point)
|
||||
} else {
|
||||
captureItem(point)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -369,7 +379,7 @@ class MainViewModel @Inject constructor(
|
||||
GeometryToolsKt.getTileYByGeometry(geometry.toString(), tileY)
|
||||
|
||||
//遍历存储tile对应的x与y的值
|
||||
tileX.forEach { x ->
|
||||
tileX.forEach { x ->
|
||||
tileY.forEach { y ->
|
||||
location.tilex = x
|
||||
location.tiley = y
|
||||
@@ -382,10 +392,11 @@ class MainViewModel @Inject constructor(
|
||||
|
||||
}
|
||||
|
||||
location.taskId = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1).toString()
|
||||
location.taskId =
|
||||
sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1).toString()
|
||||
|
||||
//判断如果是连接状态并处于录像模式,标记为有效点
|
||||
if (shareUtil?.connectstate == true&&shareUtil?.takeCameraMode==0) {
|
||||
if (shareUtil?.connectstate == true && shareUtil?.takeCameraMode == 0) {
|
||||
location.media = 1
|
||||
}
|
||||
var disance = 0.0
|
||||
@@ -432,6 +443,23 @@ class MainViewModel @Inject constructor(
|
||||
mapController.layerManagerHandler.showNiLocationLayer()
|
||||
}
|
||||
|
||||
/**
|
||||
* 捕捉要素数据
|
||||
*/
|
||||
private suspend fun captureItem(point: GeoPoint) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
val itemList = realmOperateHelper.queryElement(
|
||||
GeometryTools.createPoint(
|
||||
point.longitude,
|
||||
point.latitude
|
||||
)
|
||||
)
|
||||
|
||||
if(itemList.size == 1){
|
||||
SignUtil.getSignNameText(itemList[0])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 捕获道路和面板
|
||||
|
||||
@@ -6,8 +6,10 @@ import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.View.OnClickListener
|
||||
import android.view.ViewGroup
|
||||
import android.widget.TextView
|
||||
import android.widget.Toast
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.viewModels
|
||||
import androidx.transition.AutoTransition
|
||||
import androidx.transition.Scene
|
||||
import androidx.transition.TransitionManager
|
||||
@@ -15,11 +17,8 @@ import com.navinfo.omqs.R
|
||||
import com.navinfo.omqs.databinding.FragmentConsoleBinding
|
||||
import com.navinfo.omqs.ui.activity.map.MainActivity
|
||||
import com.navinfo.omqs.ui.fragment.BaseFragment
|
||||
import com.navinfo.omqs.ui.fragment.evaluationresult.EvaluationResultFragment
|
||||
import com.navinfo.omqs.ui.fragment.layermanager.LayerManagerFragment
|
||||
import com.navinfo.omqs.ui.fragment.offlinemap.OfflineMapFragment
|
||||
import com.navinfo.omqs.ui.fragment.personalcenter.PersonalCenterFragment
|
||||
import com.navinfo.omqs.ui.fragment.qsrecordlist.QsRecordListFragment
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
|
||||
@AndroidEntryPoint
|
||||
@@ -33,6 +32,8 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
|
||||
private var mFragment: Fragment? = null
|
||||
private val fragmentId = R.id.console_fragment
|
||||
|
||||
private val viewModel by viewModels<ConsoleViewModel>()
|
||||
|
||||
// 创建a场景
|
||||
private val aScene by lazy {
|
||||
Scene.getSceneForLayout(
|
||||
@@ -72,6 +73,7 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
|
||||
|
||||
override fun onTransitionEnd(transition: androidx.transition.Transition) {
|
||||
initOnClickListener()
|
||||
initLiveData()
|
||||
}
|
||||
|
||||
override fun onTransitionCancel(transition: androidx.transition.Transition) {
|
||||
@@ -95,6 +97,7 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
|
||||
|
||||
override fun onTransitionEnd(transition: androidx.transition.Transition) {
|
||||
initOnClickListener()
|
||||
initLiveData()
|
||||
}
|
||||
|
||||
override fun onTransitionCancel(transition: androidx.transition.Transition) {
|
||||
@@ -108,8 +111,26 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
|
||||
|
||||
})
|
||||
initOnClickListener()
|
||||
|
||||
initLiveData()
|
||||
}
|
||||
|
||||
private fun initLiveData(){
|
||||
/**
|
||||
* 任务数量统计
|
||||
*/
|
||||
viewModel.liveDataTaskCount.observe(viewLifecycleOwner) {
|
||||
binding.consoleRoot.findViewById<TextView>(R.id.console_task_count_text).text =
|
||||
"共 ${it} 条"
|
||||
}
|
||||
/**
|
||||
* 评测数据数量统计
|
||||
*/
|
||||
viewModel.liveDataEvaluationResultCount.observe(viewLifecycleOwner) {
|
||||
binding.consoleRoot.findViewById<TextView>(R.id.console_evaluation_count_text).text =
|
||||
"共 ${it} 条"
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置点击事件
|
||||
@@ -193,12 +214,13 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
|
||||
R.id.console_personal_center_bg, R.id.console_personal_center_icon_bg -> {
|
||||
if (sceneFlag) {
|
||||
mFragment = PersonalCenterFragment {
|
||||
if(it){
|
||||
if (it) {
|
||||
activity?.let { a ->
|
||||
a.supportFragmentManager.beginTransaction().remove(this).commit()
|
||||
a.supportFragmentManager.beginTransaction().remove(this)
|
||||
.commit()
|
||||
(a as MainActivity).showIndoorDataLayout()
|
||||
}
|
||||
}else{
|
||||
} else {
|
||||
TransitionManager.go(aScene, aTransition)
|
||||
}
|
||||
|
||||
@@ -208,12 +230,13 @@ class ConsoleFragment : BaseFragment(), OnClickListener {
|
||||
} else {
|
||||
if (mFragment !is PersonalCenterFragment) {
|
||||
mFragment = PersonalCenterFragment {
|
||||
if(it){
|
||||
if (it) {
|
||||
activity?.let { a ->
|
||||
a.supportFragmentManager.beginTransaction().remove(this).commit()
|
||||
a.supportFragmentManager.beginTransaction().remove(this)
|
||||
.commit()
|
||||
(a as MainActivity).showIndoorDataLayout()
|
||||
}
|
||||
}else{
|
||||
} else {
|
||||
TransitionManager.go(aScene, aTransition)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.navinfo.omqs.ui.fragment.console
|
||||
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.navinfo.collect.library.data.entity.QsRecordBean
|
||||
import com.navinfo.collect.library.data.entity.TaskBean
|
||||
import com.navinfo.omqs.tools.FileManager
|
||||
import com.navinfo.omqs.util.DateTimeUtil
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import io.realm.Realm
|
||||
import kotlinx.coroutines.launch
|
||||
import javax.inject.Inject
|
||||
|
||||
@HiltViewModel
|
||||
class ConsoleViewModel @Inject constructor() : ViewModel() {
|
||||
/**
|
||||
* 当前任务量统计
|
||||
*/
|
||||
val liveDataTaskCount = MutableLiveData(0)
|
||||
|
||||
/**
|
||||
* 作业数据统计
|
||||
*/
|
||||
val liveDataEvaluationResultCount = MutableLiveData(0)
|
||||
|
||||
init {
|
||||
viewModelScope.launch {
|
||||
val realm = Realm.getDefaultInstance()
|
||||
val nowTime: Long = DateTimeUtil.getNowDate().time
|
||||
val beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L
|
||||
val syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE
|
||||
val count =
|
||||
realm.where(TaskBean::class.java).notEqualTo("syncStatus", syncUpload).or()
|
||||
.between("operationTime", beginNowTime, nowTime)
|
||||
.equalTo("syncStatus", syncUpload).count()
|
||||
liveDataTaskCount.postValue(count.toInt())
|
||||
val count2 = realm.where(QsRecordBean::class.java).count()
|
||||
liveDataEvaluationResultCount.postValue(count2.toInt())
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -444,10 +444,11 @@ class EvaluationResultViewModel @Inject constructor(
|
||||
*/
|
||||
|
||||
fun initData(id: String) {
|
||||
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
Log.e("jingo", "捕捉到的要素 id = $id")
|
||||
viewModelScope.launch(Dispatchers.Main) {
|
||||
|
||||
val realm = Realm.getDefaultInstance()
|
||||
|
||||
val objects = realm.where(QsRecordBean::class.java).equalTo("id", id).findFirst()
|
||||
Log.e("jingo", "查询数据 id= $id")
|
||||
if (objects != null) {
|
||||
@@ -487,163 +488,163 @@ class EvaluationResultViewModel @Inject constructor(
|
||||
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)
|
||||
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) {
|
||||
fun addChatMsgEntity(filePath: String) {
|
||||
|
||||
if (mSpeakMode == null) {
|
||||
mSpeakMode = SpeakMode(activity)
|
||||
}
|
||||
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)
|
||||
|
||||
//语音识别动画
|
||||
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()
|
||||
var attachmentList: RealmList<AttachmentBean> = RealmList()
|
||||
|
||||
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
|
||||
}
|
||||
//赋值处理
|
||||
if (liveDataQsRecordBean.value?.attachmentBeanList?.isEmpty() == false) {
|
||||
attachmentList = liveDataQsRecordBean.value?.attachmentBeanList!!
|
||||
}
|
||||
|
||||
mSpeakMode!!.speakText("结束录音")
|
||||
val attachmentBean = AttachmentBean()
|
||||
attachmentBean.name = chatMsgEntity.name!!
|
||||
attachmentBean.type = 1
|
||||
attachmentList.add(attachmentBean)
|
||||
liveDataQsRecordBean.value?.attachmentBeanList = attachmentList
|
||||
|
||||
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()
|
||||
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)
|
||||
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() // 创建文件
|
||||
// 创建一个名为 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)
|
||||
// 将 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)
|
||||
}
|
||||
liveDataPictureList.postValue(picList)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -651,15 +652,20 @@ fun savePhoto(bitmap: Bitmap) {
|
||||
* 监听任务选择变化
|
||||
*/
|
||||
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))
|
||||
if (key == Constant.SELECT_TASK_ID) {
|
||||
if (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))
|
||||
}
|
||||
}
|
||||
} else {
|
||||
liveDataFinish.postValue(true)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import android.util.Log
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.Observer
|
||||
import com.navinfo.omqs.R
|
||||
import com.navinfo.omqs.databinding.AdapterOfflineMapCityBinding
|
||||
@@ -14,6 +15,7 @@ import com.navinfo.omqs.tools.FileManager
|
||||
import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus
|
||||
import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter
|
||||
import com.navinfo.omqs.ui.other.BaseViewHolder
|
||||
import com.navinfo.omqs.ui.other.OnLifecycleStateListener
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
@@ -68,7 +70,26 @@ class OfflineMapCityListAdapter(
|
||||
|
||||
changeViews(binding, cityBean)
|
||||
downloadManager.addTask(cityBean)
|
||||
downloadManager.observer(cityBean.id, holder, DownloadObserver(cityBean.id, holder))
|
||||
|
||||
holder.addObserver(object : OnLifecycleStateListener {
|
||||
override fun onState(tag: String, state: Lifecycle.State) {
|
||||
when (state) {
|
||||
Lifecycle.State.STARTED -> {
|
||||
downloadManager.observer(
|
||||
cityBean.id,
|
||||
holder,
|
||||
DownloadObserver(cityBean.id, holder)
|
||||
)
|
||||
}
|
||||
Lifecycle.State.DESTROYED -> {
|
||||
downloadManager.removeObserver(cityBean.id)
|
||||
}
|
||||
else -> {}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
binding.offlineMapDownloadBtn.tag = position
|
||||
binding.offlineMapDownloadBtn.setOnClickListener(downloadBtnClick)
|
||||
binding.offlineMapCityName.text = cityBean.name
|
||||
|
||||
@@ -51,6 +51,23 @@ class OfflineMapCityListFragment : Fragment() {
|
||||
viewModel.cityListLiveData.observe(viewLifecycleOwner) {
|
||||
adapter.refreshData(it)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override fun onStart() {
|
||||
super.onStart()
|
||||
}
|
||||
|
||||
override fun onStop() {
|
||||
super.onStop()
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
viewModel.getCityList()
|
||||
}
|
||||
|
||||
|
||||
@@ -54,6 +54,18 @@ class OfflineMapStateListFragment : Fragment() {
|
||||
}
|
||||
}
|
||||
|
||||
override fun onStart() {
|
||||
super.onStart()
|
||||
}
|
||||
|
||||
override fun onStop() {
|
||||
super.onStop()
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
super.onDestroyView()
|
||||
_binding = null
|
||||
|
||||
@@ -29,12 +29,7 @@ class OfflineMapStateListViewModel @Inject constructor(
|
||||
fun getCityList() {
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
val list = roomDatabase.getOfflineMapDao().getOfflineMapListWithOutNone()
|
||||
if (cityListLiveData.value != null) {
|
||||
if (cityListLiveData.value!!.size != list.size)
|
||||
cityListLiveData.postValue(list)
|
||||
}else{
|
||||
cityListLiveData.postValue(list)
|
||||
}
|
||||
cityListLiveData.postValue(list)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,8 +5,11 @@ import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.activityViewModels
|
||||
import androidx.navigation.findNavController
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import com.navinfo.collect.library.data.entity.RenderEntity
|
||||
import com.navinfo.omqs.R
|
||||
import com.navinfo.omqs.bean.SignBean
|
||||
import com.navinfo.omqs.databinding.FragmentSignInfoBinding
|
||||
import com.navinfo.omqs.ui.activity.map.MainViewModel
|
||||
import com.navinfo.omqs.ui.fragment.BaseFragment
|
||||
@@ -53,7 +56,7 @@ class SignMoreInfoFragment : BaseFragment() {
|
||||
adapter.refreshData(SignUtil.getRoadNameList(it))
|
||||
}
|
||||
//常规点限速
|
||||
4002->{
|
||||
4002 -> {
|
||||
val adapter = ElectronicEyeInfoAdapter()
|
||||
binding.signInfoRecyclerview.adapter = adapter
|
||||
adapter.refreshData(SignUtil.getSpeedLimitMoreInfoText(it))
|
||||
@@ -91,6 +94,33 @@ class SignMoreInfoFragment : BaseFragment() {
|
||||
.commit()
|
||||
}
|
||||
}
|
||||
binding.signInfoTitle.setOnClickListener {
|
||||
activity?.run {
|
||||
val rightController = findNavController(R.id.main_activity_right_fragment)
|
||||
rightController.currentDestination?.let {
|
||||
if (it.id == R.id.RightEmptyFragment) {
|
||||
val bundle = Bundle()
|
||||
val element = viewModel.liveDataSignMoreInfo.value
|
||||
if (element != null) {
|
||||
val signBean = SignBean(
|
||||
iconId = SignUtil.getSignIcon(element),
|
||||
iconText = SignUtil.getSignIconText(element),
|
||||
linkId = element.properties[RenderEntity.Companion.LinkTable.linkPid]
|
||||
?: "",
|
||||
name = SignUtil.getSignNameText(element),
|
||||
bottomRightText = SignUtil.getSignBottomRightText(element),
|
||||
renderEntity = element,
|
||||
isMoreInfo = SignUtil.isMoreInfo(element),
|
||||
index = SignUtil.getRoadInfoIndex(element)
|
||||
)
|
||||
bundle.putParcelable("SignBean", signBean)
|
||||
bundle.putBoolean("AutoSave", false)
|
||||
rightController.navigate(R.id.EvaluationResultFragment, bundle)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
|
||||
@@ -306,7 +306,11 @@ class TaskListAdapter(
|
||||
binding.taskProgressText.text =
|
||||
"$progress%"
|
||||
binding.taskDownloadBtn.setProgress(progress)
|
||||
} else {
|
||||
binding.taskDownloadBtn.setProgress(0)
|
||||
binding.taskProgressText.text = ""
|
||||
}
|
||||
|
||||
when (taskBean.status) {
|
||||
FileDownloadStatus.NONE -> {
|
||||
if (binding.taskProgressText.visibility == View.VISIBLE) binding.taskProgressText.visibility =
|
||||
|
||||
@@ -95,55 +95,6 @@ class TaskViewModel @Inject constructor(
|
||||
fun getTaskList(context: Context) {
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
|
||||
when (val result = networkService.getTaskList(Constant.USER_ID)) {
|
||||
is NetResult.Success -> {
|
||||
if (result.data != null) {
|
||||
val realm = Realm.getDefaultInstance()
|
||||
realm.executeTransaction {
|
||||
result.data.obj?.let { list ->
|
||||
for (index in list.indices) {
|
||||
val task = list[index]
|
||||
val item = realm.where(TaskBean::class.java).equalTo(
|
||||
"id", task.id
|
||||
).findFirst()
|
||||
if (item != null) {
|
||||
task.fileSize = item.fileSize
|
||||
task.status = item.status
|
||||
task.currentSize = item.currentSize
|
||||
task.hadLinkDvoList = item.hadLinkDvoList
|
||||
//已上传后不在更新操作时间
|
||||
if (task.syncStatus != FileManager.Companion.FileUploadStatus.DONE) {
|
||||
//赋值时间,用于查询过滤
|
||||
task.operationTime = DateTimeUtil.getNowDate().time
|
||||
}
|
||||
} else {
|
||||
//赋值时间,用于查询过滤
|
||||
task.operationTime = DateTimeUtil.getNowDate().time
|
||||
}
|
||||
realm.copyToRealmOrUpdate(task)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
is NetResult.Error<*> -> {
|
||||
withContext(Dispatchers.Main) {
|
||||
Toast.makeText(context, "${result.exception.message}", Toast.LENGTH_SHORT)
|
||||
.show()
|
||||
}
|
||||
}
|
||||
|
||||
is NetResult.Failure<*> -> {
|
||||
withContext(Dispatchers.Main) {
|
||||
Toast.makeText(context, "${result.code}:${result.msg}", Toast.LENGTH_SHORT)
|
||||
.show()
|
||||
}
|
||||
}
|
||||
|
||||
is NetResult.Loading -> {}
|
||||
}
|
||||
getLocalTaskList()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.navinfo.omqs.ui.other
|
||||
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.LifecycleOwner
|
||||
|
||||
@@ -80,6 +80,8 @@ class SignUtil {
|
||||
2008 -> "种别"
|
||||
//道路方向
|
||||
2010 -> "方向"
|
||||
//车道边界类型
|
||||
2013 -> "车道边界类型"
|
||||
//常规线限速
|
||||
2019 -> "线限速"
|
||||
//车道数
|
||||
@@ -404,7 +406,16 @@ class SignUtil {
|
||||
return stringBuffer.toString()
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取车道边界线详细信息
|
||||
*/
|
||||
fun getLaneBoundaryInfo(data:RenderEntity){
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取道路名列表
|
||||
*/
|
||||
fun getRoadNameList(data: RenderEntity): MutableList<RoadNameBean> {
|
||||
val list = mutableListOf<RoadNameBean>()
|
||||
if (data.code == 2011) {
|
||||
|
||||
Reference in New Issue
Block a user