Merge branch 'master' of https://gitlab.navinfo.com/CollectVehicle/OneMapQS
Conflicts: app/src/main/java/com/navinfo/omqs/Constant.kt app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt
This commit is contained in:
35
app/src/main/assets/omdb.config
Normal file
35
app/src/main/assets/omdb.config
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"tables" : [
|
||||
{
|
||||
"table": "OMDB_RD_LINK",
|
||||
"code": 2001,
|
||||
"name": "道路线"
|
||||
},
|
||||
{
|
||||
"table": "OMDB_RD_LINK_KIND",
|
||||
"code": 2008,
|
||||
"name": "道路种别"
|
||||
},
|
||||
{
|
||||
"table": "OMDB_RD_LINK_DIRECT",
|
||||
"code": 2001,
|
||||
"name": "道路方向"
|
||||
},
|
||||
{
|
||||
"table": "OMDB_SPEEDLIMIT_COND",
|
||||
"code": 2001,
|
||||
"name": "条件点限速"
|
||||
},
|
||||
{
|
||||
"table": "OMDB_SPEEDLIMIT_VAR",
|
||||
"code": 2001,
|
||||
"name": "可变点限速"
|
||||
},
|
||||
{
|
||||
"table": "OMDB_SPEEDLIMIT",
|
||||
"code": 2001,
|
||||
"name": "常规点限速"
|
||||
}
|
||||
|
||||
]
|
||||
}
|
||||
@@ -1,11 +1,8 @@
|
||||
package com.navinfo.omqs
|
||||
|
||||
import androidx.core.util.rangeTo
|
||||
import io.realm.Realm
|
||||
import java.util.*
|
||||
|
||||
class Constant {
|
||||
|
||||
companion object {
|
||||
/**
|
||||
* sd卡根目录
|
||||
@@ -35,11 +32,21 @@ class Constant {
|
||||
*/
|
||||
lateinit var USER_DATA_PATH: String
|
||||
|
||||
/**
|
||||
* 当前用户ID
|
||||
*/
|
||||
lateinit var CURRENT_USER_ID: String
|
||||
|
||||
/**
|
||||
* 离线地图目录
|
||||
*/
|
||||
lateinit var OFFLINE_MAP_PATH: String
|
||||
|
||||
/**
|
||||
* 下载目录
|
||||
*/
|
||||
lateinit var DOWNLOAD_PATH: String
|
||||
|
||||
/**
|
||||
* 服务器地址
|
||||
*/
|
||||
@@ -74,6 +81,7 @@ class Constant {
|
||||
//选择拍照或者录像
|
||||
const val SELECT_TAKEPHOTO_OR_RECORD = "select_takephoto_or_record"
|
||||
|
||||
const val OMDB_CONFIG = "omdb.config"
|
||||
}
|
||||
|
||||
}
|
||||
@@ -11,11 +11,13 @@ import com.blankj.utilcode.util.ZipUtils
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.reflect.TypeToken
|
||||
import com.navinfo.collect.library.data.entity.RenderEntity
|
||||
import com.navinfo.omqs.Constant
|
||||
import com.navinfo.omqs.bean.ImportConfig
|
||||
import com.navinfo.omqs.hilt.ImportOMDBHiltFactory
|
||||
import com.navinfo.omqs.hilt.OMDBDataBaseHiltFactory
|
||||
import dagger.assisted.Assisted
|
||||
import dagger.assisted.AssistedInject
|
||||
import io.realm.Realm
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.flow
|
||||
@@ -28,13 +30,13 @@ import kotlin.streams.toList
|
||||
/**
|
||||
* 导入omdb数据的帮助类
|
||||
* */
|
||||
class ImportOMDBHelper @AssistedInject constructor(@Assisted("context") val context: Context,@Assisted("omdbFile") val omdbFile: File,@Assisted("configFile") val configFile: File) {
|
||||
class ImportOMDBHelper @AssistedInject constructor(@Assisted("context") val context: Context,@Assisted("omdbFile") val omdbFile: File) {
|
||||
@Inject
|
||||
lateinit var omdbHiltFactory: OMDBDataBaseHiltFactory
|
||||
@Inject
|
||||
lateinit var gson: Gson
|
||||
private val database by lazy { omdbHiltFactory.obtainOmdbDataBaseHelper(context, omdbFile.absolutePath, 1).writableDatabase }
|
||||
|
||||
private val configFile: File = File("${Constant.DATA_PATH}/${Constant.CURRENT_USER_ID}", Constant.OMDB_CONFIG)
|
||||
|
||||
/**
|
||||
* 读取config的配置文件
|
||||
@@ -99,10 +101,10 @@ class ImportOMDBHelper @AssistedInject constructor(@Assisted("context") val cont
|
||||
* @param omdbZipFile omdb数据抽取生成的Zip文件
|
||||
* @param configFile 对应的配置文件
|
||||
* */
|
||||
suspend fun importOmdbZipFile(omdbZipFile: File): Flow<List<Map<String, Any>>> = withContext(Dispatchers.IO) {
|
||||
suspend fun importOmdbZipFile(omdbZipFile: File): Flow<String> = withContext(Dispatchers.IO) {
|
||||
val importConfig = openConfigFile()
|
||||
val unZipFolder = File(omdbZipFile.parentFile, "result")
|
||||
flow<List<Map<String, Any>>> {
|
||||
flow<String> {
|
||||
if (unZipFolder.exists()) {
|
||||
unZipFolder.deleteRecursively()
|
||||
}
|
||||
@@ -110,26 +112,45 @@ class ImportOMDBHelper @AssistedInject constructor(@Assisted("context") val cont
|
||||
// 开始解压zip文件
|
||||
val unZipFiles = ZipUtils.unzipFile(omdbZipFile, unZipFolder)
|
||||
// 遍历解压后的文件,读取该数据返回
|
||||
for (txtFile in unZipFiles) {
|
||||
val listResult: MutableList<Map<String, Any>> = mutableListOf()
|
||||
// 根据文件名称获取对应的配置
|
||||
val currentConfig=importConfig.tables.find {
|
||||
txtFile.name.substring(0, txtFile.name.lastIndexOf("."))==it.table
|
||||
for ((index, currentConfig) in importConfig.tables.withIndex()) {
|
||||
val txtFile = unZipFiles.find {
|
||||
it.name == currentConfig.table
|
||||
}
|
||||
val list = FileIOUtils.readFile2List(txtFile, "UTF-8")
|
||||
// 将list数据转换为map
|
||||
for (line in list) {
|
||||
val map = gson.fromJson<Map<String, Any>>(line, object : TypeToken<MutableMap<String, Any>>() {}.type)
|
||||
.toMutableMap()
|
||||
currentConfig?.let {
|
||||
map["QItable"] = currentConfig.table
|
||||
map["QIname"] = currentConfig.name
|
||||
map["QIcode"] = currentConfig.code
|
||||
listResult.add(map)
|
||||
|
||||
val listResult: MutableList<Map<String, Any>> = mutableListOf()
|
||||
currentConfig?.let {
|
||||
val list = FileIOUtils.readFile2List(txtFile, "UTF-8")
|
||||
if (list!=null) {
|
||||
// 将list数据转换为map
|
||||
for (line in list) {
|
||||
val map = gson.fromJson<Map<String, Any>>(line, object : TypeToken<MutableMap<String, Any>>() {}.type)
|
||||
.toMutableMap()
|
||||
map["QItable"] = currentConfig.table
|
||||
map["QIname"] = currentConfig.name
|
||||
map["QIcode"] = currentConfig.code
|
||||
listResult.add(map)
|
||||
}
|
||||
}
|
||||
}
|
||||
// 将listResult数据插入到Realm数据库中
|
||||
Realm.getDefaultInstance().beginTransaction()
|
||||
for (map in listResult) { // 每一个map就是Realm的一条数据
|
||||
// 先查询这个mesh下有没有数据,如果有则跳过即可
|
||||
// val meshEntity = Realm.getDefaultInstance().where(RenderEntity::class.java).equalTo("properties['mesh']", map["mesh"].toString()).findFirst()
|
||||
val renderEntity = RenderEntity()
|
||||
renderEntity.code = map["QIcode"].toString().toInt()
|
||||
renderEntity.name = map["QIname"].toString()
|
||||
renderEntity.table = map["QItable"].toString()
|
||||
// 其他数据插入到Properties中
|
||||
renderEntity.geometry = map["geometry"].toString()
|
||||
for (entry in map) {
|
||||
renderEntity.properties[entry.key] = entry.value.toString()
|
||||
}
|
||||
Realm.getDefaultInstance().insert(renderEntity)
|
||||
}
|
||||
Realm.getDefaultInstance().commitTransaction()
|
||||
// 1个文件发送一次flow流
|
||||
emit(listResult)
|
||||
emit("${index+1}/${importConfig.tables.size}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,5 +8,5 @@ import java.io.File
|
||||
|
||||
@AssistedFactory
|
||||
interface ImportOMDBHiltFactory {
|
||||
fun obtainImportOMDBHelper(@Assisted("context")context: Context, @Assisted("omdbFile") omdbFile: File, @Assisted("configFile") dbVersion: File): ImportOMDBHelper
|
||||
fun obtainImportOMDBHelper(@Assisted("context")context: Context, @Assisted("omdbFile") omdbFile: File): ImportOMDBHelper
|
||||
}
|
||||
@@ -104,13 +104,13 @@ class TaskDownloadScope(
|
||||
var randomAccessFile: RandomAccessFile? = null
|
||||
try {
|
||||
//创建离线地图 下载文件夹,.map文件夹的下一级
|
||||
val fileDir = File("${Constant.OFFLINE_MAP_PATH}download")
|
||||
val fileDir = File("${Constant.DOWNLOAD_PATH}download")
|
||||
if (!fileDir.exists()) {
|
||||
fileDir.mkdirs()
|
||||
}
|
||||
|
||||
val fileTemp =
|
||||
File("${Constant.OFFLINE_MAP_PATH}download/${taskBean.id}_${taskBean.dataVersion}")
|
||||
File("${Constant.DOWNLOAD_PATH}${taskBean.id}_${taskBean.dataVersion}")
|
||||
val startPosition = taskBean.currentSize
|
||||
//验证断点有效性
|
||||
if (startPosition < 0) throw IOException("jingo Start position less than zero")
|
||||
@@ -119,8 +119,13 @@ class TaskDownloadScope(
|
||||
url = taskBean.getDownLoadUrl()
|
||||
)
|
||||
val responseBody = response.body()
|
||||
|
||||
change(FileDownloadStatus.LOADING)
|
||||
responseBody ?: throw IOException("jingo ResponseBody is null")
|
||||
|
||||
if (startPosition == 0L) {
|
||||
taskBean.fileSize = responseBody.contentLength()
|
||||
}
|
||||
//写入文件
|
||||
randomAccessFile = RandomAccessFile(fileTemp, "rwd")
|
||||
randomAccessFile.seek(startPosition)
|
||||
@@ -144,7 +149,7 @@ class TaskDownloadScope(
|
||||
Log.e("jingo", "文件下载完成 ${taskBean.currentSize} == ${taskBean.fileSize}")
|
||||
if (taskBean.currentSize == taskBean.fileSize) {
|
||||
val res =
|
||||
fileTemp.renameTo(File("${Constant.OFFLINE_MAP_PATH}${taskBean.evaluationTaskName}.zip"))
|
||||
fileTemp.renameTo(File("${Constant.DOWNLOAD_PATH}${taskBean.evaluationTaskName}.zip"))
|
||||
Log.e("jingo", "文件下载完成 修改文件 $res")
|
||||
change(FileDownloadStatus.DONE)
|
||||
} else {
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.navinfo.omqs.tools
|
||||
import android.content.Context
|
||||
import com.navinfo.omqs.Constant
|
||||
import com.navinfo.omqs.bean.OfflineMapCityBean
|
||||
import com.navinfo.omqs.bean.TaskBean
|
||||
import java.io.File
|
||||
|
||||
class FileManager {
|
||||
@@ -20,13 +21,14 @@ class FileManager {
|
||||
}
|
||||
|
||||
//初始化数据文件夹
|
||||
fun initRootDir(context:Context){
|
||||
fun initRootDir(context: Context) {
|
||||
// 在SD卡创建项目目录
|
||||
val sdCardPath = context.getExternalFilesDir(null)
|
||||
sdCardPath?.let {
|
||||
Constant.ROOT_PATH = sdCardPath.absolutePath
|
||||
Constant.MAP_PATH = Constant.ROOT_PATH + "/map/"
|
||||
Constant.OFFLINE_MAP_PATH = Constant.MAP_PATH + "offline/"
|
||||
Constant.DOWNLOAD_PATH = Constant.ROOT_PATH + "/download/"
|
||||
val file = File(Constant.MAP_PATH)
|
||||
if (!file.exists()) {
|
||||
file.mkdirs()
|
||||
@@ -37,7 +39,7 @@ class FileManager {
|
||||
with(File(Constant.DATA_PATH)) {
|
||||
if (!this.exists()) this.mkdirs()
|
||||
}
|
||||
}else{
|
||||
} else {
|
||||
Constant.DATA_PATH = Constant.ROOT_PATH + "/data/"
|
||||
}
|
||||
}
|
||||
@@ -102,5 +104,65 @@ class FileManager {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查离线地图文件
|
||||
*/
|
||||
suspend fun checkOMDBFileInfo(taskBean: TaskBean) {
|
||||
//访问离线地图文件夹
|
||||
val fileDir = File("${Constant.DOWNLOAD_PATH}")
|
||||
//如果连本地文件夹还没有,就不用修改任何数据了
|
||||
if (!fileDir.exists()) {
|
||||
return
|
||||
}
|
||||
//访问离线地图临时下载文件夹
|
||||
val fileTempDir = File(Constant.DOWNLOAD_PATH)
|
||||
//是否有一份.map文件了
|
||||
var mapFile: File? = null
|
||||
//文件夹里文件挨个访问
|
||||
for (item in fileDir.listFiles()) {
|
||||
//先找到对应的省市文件,例如:540000_西藏自治区_20230401195018.map",以id开头
|
||||
if (item.isFile && item.name.startsWith("${taskBean.id}_")) {
|
||||
//如果本地文件与从网络获取到版本号一致,表示这个文件已经下载完毕,不用处理了
|
||||
if (item.name == "${taskBean.id}_${taskBean.dataVersion}") {
|
||||
taskBean.status = FileDownloadStatus.DONE
|
||||
return
|
||||
}
|
||||
//文件存在,版本号不对应,留给下面流程处理
|
||||
mapFile = item
|
||||
break
|
||||
}
|
||||
}
|
||||
//临时下载文件夹
|
||||
if (fileTempDir.exists()) {
|
||||
for (item in fileTempDir.listFiles()) {
|
||||
//先找到对应的省市文件,例如:540000_20230401195018",以id开头
|
||||
if (item.isFile && item.name.startsWith("${taskBean.id}_")) {
|
||||
//如果本地文件与从网络获取到版本号一致,表示这个文件已经在下载列表中
|
||||
if (item.name == "${taskBean.id}_${taskBean.dataVersion}") {
|
||||
//如果这个临时文件的大小和下载大小是一致的,说明已经下载完了,但是在下载环节没有更名移动成功,需要重命名和移动文件夹
|
||||
if (item.length() == taskBean.fileSize) {
|
||||
//移动更名文件后删除旧数据,修改状态
|
||||
if (item.renameTo(File("${Constant.OFFLINE_MAP_PATH}${taskBean.evaluationTaskName}.zip"))) {
|
||||
//删除旧版本数据
|
||||
mapFile?.delete()
|
||||
taskBean.status = FileDownloadStatus.DONE
|
||||
return
|
||||
}
|
||||
} else { // 临时文件大小和目标不一致,说明下载了一半
|
||||
taskBean.status = FileDownloadStatus.PAUSE
|
||||
taskBean.currentSize = item.length()
|
||||
return
|
||||
}
|
||||
} else { //虽然省市id开头一致,但是版本号不一致,说明之前版本下载了一部分,现在要更新了,原来下载的文件直接删除
|
||||
taskBean.status = FileDownloadStatus.UPDATE
|
||||
item.delete()
|
||||
return
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@ import android.widget.Toast
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.blankj.utilcode.util.ResourceUtils
|
||||
import com.navinfo.omqs.Constant
|
||||
import com.navinfo.omqs.bean.LoginUserBean
|
||||
import com.navinfo.omqs.db.RoomAppDatabase
|
||||
@@ -158,19 +159,26 @@ class LoginViewModel @Inject constructor(
|
||||
Constant.VERSION_ID = userId
|
||||
Constant.USER_DATA_PATH = Constant.DATA_PATH + Constant.USER_ID + "/" + Constant.VERSION_ID
|
||||
// 在SD卡创建用户目录,解压资源等
|
||||
val userFolder = File("${Constant.DATA_PATH}/${userId}")
|
||||
Constant.CURRENT_USER_ID = userId
|
||||
// 初始化Realm
|
||||
Realm.init(context.applicationContext)
|
||||
val password = "encryp".encodeToByteArray().copyInto(ByteArray(64))
|
||||
// 656e6372797000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
Log.d("OMQSApplication", "密码是: ${byteArrayToHexString(password)}")
|
||||
val config = RealmConfiguration.Builder()
|
||||
.directory(File("${Constant.DATA_PATH}/${userId}"))
|
||||
.directory(userFolder)
|
||||
.name("OMQS.realm")
|
||||
.encryptionKey(password)
|
||||
// .modules(Realm.getDefaultModule(), MyRealmModule())
|
||||
.schemaVersion(1)
|
||||
.build()
|
||||
Realm.setDefaultConfiguration(config)
|
||||
// 拷贝配置文件到用户目录下
|
||||
val omdbConfigFile = File(userFolder.absolutePath, Constant.OMDB_CONFIG);
|
||||
if (!omdbConfigFile.exists()) {
|
||||
ResourceUtils.copyFileFromAssets(Constant.OMDB_CONFIG, omdbConfigFile.absolutePath)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -38,7 +38,7 @@ class MainViewModel @Inject constructor(
|
||||
private var niLocationList: MutableList<NiLocation> = ArrayList<NiLocation>()
|
||||
|
||||
init {
|
||||
mapController.layerManagerHandler.setOnQsRecordItemClickListener(object :
|
||||
mapController.markerHandle.setOnQsRecordItemClickListener(object :
|
||||
OnQsRecordItemClickListener {
|
||||
override fun onQsRecordList(list: MutableList<String>) {
|
||||
liveDataQsRecordIdList.value = list
|
||||
|
||||
@@ -212,7 +212,7 @@ class EvaluationResultViewModel @Inject constructor(
|
||||
it.copyToRealmOrUpdate(liveDataQsRecordBean.value)
|
||||
}
|
||||
// realm.close()
|
||||
mapController.layerManagerHandler.addOrUpdateQsRecordMark(liveDataQsRecordBean.value!!)
|
||||
mapController.markerHandle.addOrUpdateQsRecordMark(liveDataQsRecordBean.value!!)
|
||||
liveDataFinish.postValue(true)
|
||||
}
|
||||
}
|
||||
@@ -228,7 +228,7 @@ class EvaluationResultViewModel @Inject constructor(
|
||||
objects?.deleteFromRealm()
|
||||
}
|
||||
// realm.close()
|
||||
mapController.layerManagerHandler.removeQsRecordMark(liveDataQsRecordBean.value!!)
|
||||
mapController.markerHandle.removeQsRecordMark(liveDataQsRecordBean.value!!)
|
||||
liveDataFinish.postValue(true)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,15 +77,14 @@ class PersonalCenterFragment : BaseFragment(), FSAFActivityCallbacks {
|
||||
val file = UriUtils.uri2File(uri)
|
||||
// 开始导入数据
|
||||
// 656e6372797000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
val job = CoroutineUtils.launchWithLoading(
|
||||
CoroutineUtils.launchWithLoading(
|
||||
requireContext(),
|
||||
loadingMessage = "生成数据..."
|
||||
) {
|
||||
val importOMDBHelper: ImportOMDBHelper =
|
||||
importOMDBHiltFactory.obtainImportOMDBHelper(
|
||||
requireContext(),
|
||||
file,
|
||||
File(file.parentFile, "config.json")
|
||||
file
|
||||
)
|
||||
viewModel.obtainOMDBZipData(importOMDBHelper)
|
||||
}
|
||||
@@ -99,19 +98,19 @@ class PersonalCenterFragment : BaseFragment(), FSAFActivityCallbacks {
|
||||
|
||||
override fun onResult(uri: Uri) {
|
||||
val file = UriUtils.uri2File(uri)
|
||||
// 开始导入数据
|
||||
CoroutineUtils.launchWithLoading(
|
||||
requireContext(),
|
||||
loadingMessage = "导入数据..."
|
||||
) {
|
||||
val importOMDBHelper: ImportOMDBHelper =
|
||||
importOMDBHiltFactory.obtainImportOMDBHelper(
|
||||
requireContext(),
|
||||
file,
|
||||
File(file.parentFile, "config.json")
|
||||
)
|
||||
val importOMDBHelper: ImportOMDBHelper =
|
||||
importOMDBHiltFactory.obtainImportOMDBHelper(
|
||||
requireContext(),
|
||||
file
|
||||
)
|
||||
viewModel.importOMDBData(importOMDBHelper)
|
||||
}
|
||||
// // 开始导入数据
|
||||
// CoroutineUtils.launchWithLoading(
|
||||
// requireContext(),
|
||||
// loadingMessage = "导入数据..."
|
||||
// ) {
|
||||
//
|
||||
// }
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -136,39 +136,15 @@ class PersonalCenterViewModel @Inject constructor(
|
||||
/**
|
||||
* 导入OMDB数据
|
||||
* */
|
||||
suspend fun importOMDBData(importOMDBHelper: ImportOMDBHelper) {
|
||||
Log.d("OMQSApplication", "开始导入数据")
|
||||
// Realm.getDefaultInstance().beginTransaction()
|
||||
importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile).collect {
|
||||
Realm.getDefaultInstance().beginTransaction()
|
||||
for (map in it) { // 每一个map就是Realm的一条数据
|
||||
val renderEntity = RenderEntity()
|
||||
renderEntity.code = map["QIcode"].toString().toInt()
|
||||
renderEntity.name = map["QIname"].toString()
|
||||
renderEntity.table = map["QItable"].toString()
|
||||
// 其他数据插入到Properties中
|
||||
renderEntity.geometry = map["GEOMETRY"].toString()
|
||||
for (entry in map) {
|
||||
renderEntity.properties[entry.key] = entry.value.toString()
|
||||
}
|
||||
Realm.getDefaultInstance().insert(renderEntity)
|
||||
fun importOMDBData(importOMDBHelper: ImportOMDBHelper) {
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
Log.d("OMQSApplication", "开始导入数据")
|
||||
importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile).collect {
|
||||
Log.d("importOMDBData", it)
|
||||
}
|
||||
Realm.getDefaultInstance().commitTransaction()
|
||||
Log.d("OMQSApplication", "导入数据完成")
|
||||
}
|
||||
// Realm.getDefaultInstance().commitTransaction()
|
||||
|
||||
// val gson = Gson()
|
||||
// // 数据导入结束后,开始生成渲染表所需的json文件,并生成压缩包
|
||||
// for (table in importOMDBHelper.openConfigFile().tables/*listOf<String>("HAD_LINK")*/) {
|
||||
// val omdbList = Realm.getDefaultInstance().where(OMDBEntity::class.java).equalTo("table", table.table).findAll()
|
||||
// val outputFile = File(importOMDBHelper.omdbFile, "${table.table}.txt")
|
||||
// // 将读取到的数据转换为json数据文件
|
||||
// for (omdb in omdbList) {
|
||||
// FileIOUtils.writeFileFromString(outputFile, gson.toJson(omdb))
|
||||
// }
|
||||
// }
|
||||
|
||||
Log.d("OMQSApplication", "导入数据完成")
|
||||
}
|
||||
|
||||
fun importScProblemData(uri: Uri) {
|
||||
|
||||
@@ -10,7 +10,7 @@ import com.navinfo.omqs.R
|
||||
import com.navinfo.omqs.bean.TaskBean
|
||||
import com.navinfo.omqs.databinding.AdapterTaskListBinding
|
||||
import com.navinfo.omqs.http.taskdownload.TaskDownloadManager
|
||||
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
|
||||
|
||||
@@ -23,7 +23,7 @@ import com.navinfo.omqs.ui.other.BaseViewHolder
|
||||
*使用 LifecycleRegistry 给 ViewHolder 分发生命周期(这里使用了这个)
|
||||
*/
|
||||
class TaskListAdapter(
|
||||
private val downloadManager: TaskDownloadManager, private val context: Context
|
||||
private val downloadManager: TaskDownloadManager
|
||||
) : BaseRecyclerViewAdapter<TaskBean>() {
|
||||
|
||||
|
||||
@@ -31,11 +31,11 @@ class TaskListAdapter(
|
||||
if (it.tag != null) {
|
||||
val taskBean = data[it.tag as Int]
|
||||
when (taskBean.status) {
|
||||
FileManager.Companion.FileDownloadStatus.NONE, FileManager.Companion.FileDownloadStatus.UPDATE, FileManager.Companion.FileDownloadStatus.PAUSE, FileManager.Companion.FileDownloadStatus.ERROR -> {
|
||||
FileDownloadStatus.NONE, FileDownloadStatus.UPDATE, FileDownloadStatus.PAUSE, FileDownloadStatus.ERROR -> {
|
||||
Log.e("jingo", "开始下载 ${taskBean.status}")
|
||||
downloadManager.start(taskBean.id)
|
||||
}
|
||||
FileManager.Companion.FileDownloadStatus.LOADING, FileManager.Companion.FileDownloadStatus.WAITING -> {
|
||||
FileDownloadStatus.LOADING, FileDownloadStatus.WAITING -> {
|
||||
Log.e("jingo", "暂停 ${taskBean.status}")
|
||||
downloadManager.pause(taskBean.id)
|
||||
}
|
||||
@@ -70,6 +70,8 @@ class TaskListAdapter(
|
||||
binding.taskDownloadBtn.tag = position
|
||||
binding.taskDownloadBtn.setOnClickListener(downloadBtnClick)
|
||||
binding.taskName.text = taskBean.evaluationTaskName
|
||||
binding.taskCityName.text = taskBean.cityName
|
||||
binding.taskDataVersion.text = "版本号:${taskBean.dataVersion}"
|
||||
// binding.offlineMapCitySize.text = cityBean.getFileSizeText()
|
||||
}
|
||||
|
||||
@@ -82,41 +84,43 @@ class TaskListAdapter(
|
||||
}
|
||||
|
||||
|
||||
private fun changeViews(binding: AdapterTaskListBinding, cityBean: TaskBean) {
|
||||
binding.taskProgress.progress =
|
||||
(cityBean.currentSize * 100 / cityBean.fileSize).toInt()
|
||||
when (cityBean.status) {
|
||||
FileManager.Companion.FileDownloadStatus.NONE -> {
|
||||
private fun changeViews(binding: AdapterTaskListBinding, taskBean: TaskBean) {
|
||||
if (taskBean.fileSize > 0L) {
|
||||
binding.taskProgress.progress =
|
||||
(taskBean.currentSize * 100 / taskBean.fileSize).toInt()
|
||||
}
|
||||
when (taskBean.status) {
|
||||
FileDownloadStatus.NONE -> {
|
||||
if (binding.taskProgress.visibility == View.VISIBLE) binding.taskProgress.visibility =
|
||||
View.INVISIBLE
|
||||
binding.taskDownloadBtn.text = "下载"
|
||||
}
|
||||
FileManager.Companion.FileDownloadStatus.WAITING -> {
|
||||
FileDownloadStatus.WAITING -> {
|
||||
if (binding.taskProgress.visibility != View.VISIBLE) binding.taskProgress.visibility =
|
||||
View.VISIBLE
|
||||
binding.taskDownloadBtn.text = "等待中"
|
||||
}
|
||||
FileManager.Companion.FileDownloadStatus.LOADING -> {
|
||||
FileDownloadStatus.LOADING -> {
|
||||
if (binding.taskProgress.visibility != View.VISIBLE) binding.taskProgress.visibility =
|
||||
View.VISIBLE
|
||||
binding.taskDownloadBtn.text = "暂停"
|
||||
}
|
||||
FileManager.Companion.FileDownloadStatus.PAUSE -> {
|
||||
FileDownloadStatus.PAUSE -> {
|
||||
if (binding.taskProgress.visibility != View.VISIBLE) binding.taskProgress.visibility =
|
||||
View.VISIBLE
|
||||
binding.taskDownloadBtn.text = "继续"
|
||||
}
|
||||
FileManager.Companion.FileDownloadStatus.ERROR -> {
|
||||
FileDownloadStatus.ERROR -> {
|
||||
if (binding.taskProgress.visibility != View.VISIBLE) binding.taskProgress.visibility =
|
||||
View.VISIBLE
|
||||
binding.taskDownloadBtn.text = "重试"
|
||||
}
|
||||
FileManager.Companion.FileDownloadStatus.DONE -> {
|
||||
FileDownloadStatus.DONE -> {
|
||||
if (binding.taskProgress.visibility == View.VISIBLE) binding.taskProgress.visibility =
|
||||
View.INVISIBLE
|
||||
binding.taskDownloadBtn.text = "已完成"
|
||||
}
|
||||
FileManager.Companion.FileDownloadStatus.UPDATE -> {
|
||||
FileDownloadStatus.UPDATE -> {
|
||||
if (binding.taskProgress.visibility == View.VISIBLE) binding.taskProgress.visibility =
|
||||
View.INVISIBLE
|
||||
binding.taskDownloadBtn.text = "更新"
|
||||
|
||||
@@ -5,6 +5,7 @@ import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.viewModels
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import com.navinfo.omqs.databinding.FragmentTaskListBinding
|
||||
import com.navinfo.omqs.http.taskdownload.TaskDownloadManager
|
||||
@@ -22,7 +23,6 @@ class TaskListFragment : BaseFragment(){
|
||||
private val adapter: TaskListAdapter by lazy {
|
||||
TaskListAdapter(
|
||||
downloadManager,
|
||||
requireContext()
|
||||
)
|
||||
}
|
||||
|
||||
@@ -46,6 +46,9 @@ class TaskListFragment : BaseFragment(){
|
||||
adapter.refreshData(it)
|
||||
}
|
||||
viewModel.getTaskList(requireContext())
|
||||
binding.taskBack.setOnClickListener{
|
||||
findNavController().navigateUp()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
|
||||
@@ -52,8 +52,11 @@ class TaskListViewModel @Inject constructor(
|
||||
else -> {}
|
||||
}
|
||||
val objects = realm.where(TaskBean::class.java).findAll()
|
||||
liveDataTaskList.postValue(realm.copyFromRealm(objects))
|
||||
// realm.close()
|
||||
val taskList = realm.copyFromRealm(objects)
|
||||
for(item in taskList){
|
||||
FileManager.checkOMDBFileInfo(item)
|
||||
}
|
||||
liveDataTaskList.postValue(taskList)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
6
app/src/main/res/drawable-v24/baseline_camera_alt_24.xml
Normal file
6
app/src/main/res/drawable-v24/baseline_camera_alt_24.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<vector android:height="24dp" android:tint="#1717E0"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M12,12m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0"/>
|
||||
<path android:fillColor="@android:color/white" android:pathData="M9,2L7.17,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2h-3.17L15,2L9,2zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5z"/>
|
||||
</vector>
|
||||
@@ -1,4 +1,4 @@
|
||||
<vector android:height="24dp" android:tint="#18FD00"
|
||||
<vector android:height="24dp" android:tint="#1717E0"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M12,15c1.66,0 2.99,-1.34 2.99,-3L15,6c0,-1.66 -1.34,-3 -3,-3S9,4.34 9,6v6c0,1.66 1.34,3 3,3zM17.3,12c0,3 -2.54,5.1 -5.3,5.1S6.7,15 6.7,12L5,12c0,3.42 2.72,6.23 6,6.72L11,22h2v-3.28c3.28,-0.48 6,-3.3 6,-6.72h-1.7z"/>
|
||||
@@ -6,26 +6,48 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@color/ivory"
|
||||
android:paddingLeft="10dp"
|
||||
android:paddingRight="10dp"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingRight="10dp"
|
||||
tools:context="com.navinfo.omqs.ui.fragment.tasklist.TaskListAdapter">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/task_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="省市名称"
|
||||
android:layout_toLeftOf="@id/task_download_btn"
|
||||
android:text="任务名称"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="@dimen/default_font_size" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/task_city_name"
|
||||
style="@style/map_size_font_style"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/task_name"
|
||||
android:layout_marginTop="5dp"
|
||||
android:text="省市名称"
|
||||
android:textSize="@dimen/card_title_font_3size" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/task_data_version"
|
||||
style="@style/map_size_font_style"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toRightOf="@id/task_city_name"
|
||||
android:layout_alignTop="@id/task_city_name"
|
||||
android:layout_marginLeft="5dp"
|
||||
android:text="版本号"
|
||||
android:textSize="@dimen/card_title_font_3size" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/task_size"
|
||||
style="@style/map_size_font_style"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/task_name"
|
||||
android:drawableLeft="@mipmap/point_blue"
|
||||
android:layout_below="@id/task_city_name"
|
||||
android:layout_marginTop="5dp"
|
||||
android:drawableLeft="@mipmap/point_blue"
|
||||
android:text="文件大小"
|
||||
android:textSize="@dimen/card_title_font_3size" />
|
||||
|
||||
@@ -34,9 +56,9 @@
|
||||
android:id="@+id/task_download_btn"
|
||||
style="@style/map_download_style_btn"
|
||||
android:layout_width="60dp"
|
||||
android:layout_alignTop="@id/task_name"
|
||||
android:layout_alignBottom="@id/task_size"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:gravity="center"
|
||||
android:shadowColor="@android:color/transparent"
|
||||
android:text="下载"
|
||||
android:textColor="@color/btn_blue_solid"
|
||||
@@ -60,8 +82,8 @@
|
||||
style="?android:attr/progressBarStyleHorizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="16dp"
|
||||
android:layout_below="@id/task_download_btn"
|
||||
android:progressDrawable="@drawable/progress_bg"
|
||||
android:layout_below="@id/task_size"
|
||||
android:paddingTop="10dp"
|
||||
android:progressDrawable="@drawable/progress_bg"
|
||||
android:visibility="invisible" />
|
||||
</RelativeLayout>
|
||||
@@ -4,10 +4,11 @@
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<data>
|
||||
|
||||
<variable
|
||||
name="fragment"
|
||||
type="com.navinfo.omqs.ui.fragment.evaluationresult.EvaluationResultFragment"
|
||||
/>
|
||||
type="com.navinfo.omqs.ui.fragment.evaluationresult.EvaluationResultFragment" />
|
||||
|
||||
<variable
|
||||
name="viewModel"
|
||||
type="com.navinfo.omqs.ui.fragment.evaluationresult.EvaluationResultViewModel" />
|
||||
@@ -42,7 +43,7 @@
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="10dp"
|
||||
android:padding="10dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/evaluation_camera"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
app:layout_constraintRight_toRightOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/evaluation_appbar_layout">
|
||||
@@ -59,77 +60,98 @@
|
||||
|
||||
<TextView
|
||||
android:id="@+id/evaluation_class_type"
|
||||
android:text="@{viewModel.liveDataQsRecordBean.classType}"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="5dp"
|
||||
android:background="@drawable/fm_card_map_down_status_bg"
|
||||
android:onClick="@{fragment.onClick}"
|
||||
android:background="@drawable/fm_card_map_down_status_bg" />
|
||||
android:text="@{viewModel.liveDataQsRecordBean.classType}" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/evaluation_problem_type"
|
||||
android:text="@{viewModel.liveDataQsRecordBean.problemType}"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="5dp"
|
||||
android:background="@drawable/fm_card_map_down_status_bg"
|
||||
android:onClick="@{fragment.onClick}"
|
||||
android:background="@drawable/fm_card_map_down_status_bg" />
|
||||
android:text="@{viewModel.liveDataQsRecordBean.problemType}" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/evaluation_phenomenon"
|
||||
android:text="@{viewModel.liveDataQsRecordBean.phenomenon}"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="5dp"
|
||||
android:background="@drawable/fm_card_map_down_status_bg"
|
||||
android:onClick="@{fragment.onClick}"
|
||||
android:background="@drawable/fm_card_map_down_status_bg" />
|
||||
android:text="@{viewModel.liveDataQsRecordBean.phenomenon}" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/evaluation_link"
|
||||
android:text="@{viewModel.liveDataQsRecordBean.problemLink}"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="5dp"
|
||||
android:background="@drawable/fm_card_map_down_status_bg"
|
||||
android:onClick="@{fragment.onClick}"
|
||||
android:background="@drawable/fm_card_map_down_status_bg" />
|
||||
android:text="@{viewModel.liveDataQsRecordBean.problemLink}" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/evaluation_cause"
|
||||
android:text="@{viewModel.liveDataQsRecordBean.cause}"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="5dp"
|
||||
android:background="@drawable/fm_card_map_down_status_bg"
|
||||
android:onClick="@{fragment.onClick}"
|
||||
android:background="@drawable/fm_card_map_down_status_bg" />
|
||||
android:text="@{viewModel.liveDataQsRecordBean.cause}" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="备注信息" />
|
||||
|
||||
<com.navinfo.omqs.ui.widget.MyEditeText
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="请输入备注信息"
|
||||
android:gravity="start"
|
||||
android:maxLines="3"
|
||||
android:lines="3"
|
||||
android:text="@={viewModel.liveDataQsRecordBean.description}"
|
||||
android:inputType="textMultiLine"
|
||||
android:background="@drawable/fm_card_map_down_status_bg"
|
||||
/>
|
||||
<!-- <com.google.android.material.tabs.TabLayout-->
|
||||
<!-- android:id="@+id/evaluation_class_tab_layout"-->
|
||||
<!-- android:layout_width="match_parent"-->
|
||||
<!-- android:layout_height="wrap_content"-->
|
||||
<!-- android:layout_marginTop="5dp" />-->
|
||||
android:gravity="start"
|
||||
android:hint="请输入备注信息"
|
||||
android:inputType="textMultiLine"
|
||||
android:lines="3"
|
||||
android:maxLines="3"
|
||||
android:text="@={viewModel.liveDataQsRecordBean.description}" />
|
||||
|
||||
<!-- <androidx.viewpager2.widget.ViewPager2-->
|
||||
<!-- android:id="@+id/evaluation_viewpager"-->
|
||||
<!-- android:layout_width="match_parent"-->
|
||||
<!-- android:layout_height="match_parent"-->
|
||||
<!-- android:layout_marginTop="5dp" />-->
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:layout_margin="5dp"
|
||||
android:background="@color/gray_121" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/evaluation_voice_recyclerview"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="80dp" />
|
||||
</LinearLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/evaluation_camera"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="5dp"
|
||||
android:src="@drawable/baseline_camera_alt_24"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintHorizontal_weight="1"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
app:layout_constraintRight_toLeftOf="@id/evaluation_voice" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/evaluation_voice"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="5dp"
|
||||
android:src="@drawable/baseline_keyboard_voice_24"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintHorizontal_weight="1"
|
||||
app:layout_constraintLeft_toRightOf="@id/evaluation_camera"
|
||||
app:layout_constraintRight_toRightOf="parent" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</layout>
|
||||
@@ -7,6 +7,28 @@
|
||||
android:background="@color/white"
|
||||
tools:context=".ui.fragment.tasklist.TaskListFragment">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/task_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="50dp"
|
||||
android:text="任务列表"
|
||||
android:gravity="center"
|
||||
android:textSize="18sp"
|
||||
android:textColor="@color/white"
|
||||
android:background="@color/default_blue"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
<ImageView
|
||||
android:id="@+id/task_back"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="0dp"
|
||||
android:src="@drawable/btn_back_xml"
|
||||
android:paddingLeft="15dp"
|
||||
android:paddingRight="10dp"
|
||||
app:layout_constraintLeft_toLeftOf="@id/task_title"
|
||||
app:layout_constraintTop_toTopOf="@id/task_title"
|
||||
app:layout_constraintBottom_toBottomOf="@id/task_title"
|
||||
/>
|
||||
<EditText
|
||||
android:id="@+id/task_search"
|
||||
style="@style/input_blue_type"
|
||||
@@ -14,7 +36,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="搜索"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
app:layout_constraintTop_toBottomOf="@id/task_title" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/task_recyclerview"
|
||||
|
||||
Reference in New Issue
Block a user