From 39a3835de438eb4ae923254b8f4ff76b84a82244 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Fri, 30 Jun 2023 17:00:02 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E5=A4=84=E7=90=86=EF=BC=8C=E4=BF=9D=E7=95=99?= =?UTF-8?q?=E5=B7=B2=E4=B8=8A=E4=BC=A0=E6=9C=80=E8=BF=913=E4=B8=AA?= =?UTF-8?q?=E6=9C=88=E6=95=B0=E6=8D=AE=E5=8F=8A=E6=9C=AA=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/taskdownload/TaskDownloadScope.kt | 3 ++ .../omqs/http/taskupload/TaskUploadScope.kt | 3 ++ .../ui/fragment/tasklist/TaskViewModel.kt | 46 ++++++------------- .../collect/library/data/entity/TaskBean.kt | 5 ++ vtm | 2 +- 5 files changed, 26 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt index e373cea0..53e1d6da 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt @@ -9,6 +9,7 @@ import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.omqs.db.ImportOMDBHelper import com.navinfo.omqs.tools.FileManager import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus +import com.navinfo.omqs.util.DateTimeUtil import io.realm.Realm import kotlinx.coroutines.* import java.io.File @@ -94,6 +95,8 @@ class TaskDownloadScope( if (taskBean.status != status || status == FileDownloadStatus.LOADING || status == FileDownloadStatus.IMPORTING) { taskBean.status = status taskBean.message = message + //赋值时间,用于查询过滤 + taskBean.operationTime = DateTimeUtil.getNowDate().time downloadData.postValue(taskBean) if (status != FileDownloadStatus.LOADING && status != FileDownloadStatus.IMPORTING) { val realm = Realm.getDefaultInstance() diff --git a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt index 78101d7a..96369fc0 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt @@ -13,6 +13,7 @@ import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.omqs.bean.SysUserBean import com.navinfo.omqs.http.DefaultResponse import com.navinfo.omqs.tools.FileManager.Companion.FileUploadStatus +import com.navinfo.omqs.util.DateTimeUtil import io.realm.Realm import kotlinx.coroutines.* import java.util.* @@ -72,6 +73,8 @@ class TaskUploadScope( if (taskBean.syncStatus != status) { taskBean.syncStatus = status taskBean.errMsg = message + //赋值时间,用于查询过滤 + taskBean.operationTime = DateTimeUtil.getNowDate().time uploadData.postValue(taskBean) //同步中不进行状态记录,只做界面变更显示 if(status!=FileUploadStatus.UPLOADING){ 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 e3c4e290..de7053da 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 @@ -16,6 +16,7 @@ import com.navinfo.omqs.Constant 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 dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Realm import kotlinx.coroutines.* @@ -74,21 +75,15 @@ class TaskViewModel @Inject constructor( task.fileSize = item.fileSize task.status = item.status task.currentSize = item.currentSize -// task.color = item.color + //已上传后不在更新操作时间 + if(task.syncStatus!= FileManager.Companion.FileUploadStatus.DONE){ + //赋值时间,用于查询过滤 + task.operationTime = DateTimeUtil.getNowDate().time + } + }else{ + //赋值时间,用于查询过滤 + task.operationTime = DateTimeUtil.getNowDate().time } -// else { -// if (index < 6) -// task.color = colors[index] -// else { -// val random = Random() -// task.color = Color.argb( -// 255, -// random.nextInt(256), -// random.nextInt(256), -// random.nextInt(256) -// ) -// } -// } realm.copyToRealmOrUpdate(task) } } @@ -114,29 +109,16 @@ class TaskViewModel @Inject constructor( is NetResult.Loading -> {} } val realm = Realm.getDefaultInstance() - val objects = realm.where(TaskBean::class.java).findAll() + //过滤掉已上传的超过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) for (item in taskList) { FileManager.checkOMDBFileInfo(item) } -// niMapController.lineHandler.omdbTaskLinkLayer.setLineColor( -// Color.rgb(0, 255, 0).toColor() -// ) -// taskList.forEach { -// niMapController.lineHandler.omdbTaskLinkLayer.addLineList(it.hadLinkDvoList) -// } -// niMapController.lineHandler.omdbTaskLinkLayer.update() liveDataTaskList.postValue(taskList) -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { -// mapController.lineHandler.omdbTaskLinkLayer.removeAll() -// if(taskList.isNotEmpty()){ -// mapController.lineHandler.omdbTaskLinkLayer.addLineList(item.hadLinkDvoList) -// } -// for (item in taskList) { -// mapController.lineHandler.omdbTaskLinkLayer.setLineColor(Color.valueOf(item.color)) -// -// } -// } } } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/TaskBean.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/TaskBean.kt index 75021bd4..ea6c437e 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/TaskBean.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/TaskBean.kt @@ -55,6 +55,11 @@ open class TaskBean @JvmOverloads constructor( */ var status: Int = 0, + /** + * 操作时间 + */ + var operationTime: Long = 0L, + /** * 上传状态 */ diff --git a/vtm b/vtm index 1ee201a4..dd13e533 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit 1ee201a41f78f169873848209a3f3bdac36f185a +Subproject commit dd13e533c38b5738ab404c2737d7ccadeff01323 From 5e32c7ac8e281a6b2ecc4ad65308bc30c1cb35ba Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Fri, 30 Jun 2023 17:45:33 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../personalcenter/PersonalCenterFragment.kt | 1 - app/src/main/res/drawable-xhdpi/icon_version.png | Bin 0 -> 431 bytes app/src/main/res/drawable-xxhdpi/icon_version.png | Bin 0 -> 431 bytes app/src/main/res/menu/personal_center_menu.xml | 4 ++++ 4 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable-xhdpi/icon_version.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_version.png diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt index 8e96c2c5..51d28ec0 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt @@ -143,7 +143,6 @@ class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) : viewModel.liveDataMessage.observe(viewLifecycleOwner) { ToastUtils.showShort(it) } - fileChooser.setCallbacks(this@PersonalCenterFragment) } diff --git a/app/src/main/res/drawable-xhdpi/icon_version.png b/app/src/main/res/drawable-xhdpi/icon_version.png new file mode 100644 index 0000000000000000000000000000000000000000..b0d19aaa19f5e5ae9a45db013eb7824d73ce935a GIT binary patch literal 431 zcmV;g0Z{&lP)LH&ORyaUfQvKqk+@BlmkufT7j_z*DX zF65cBcS-~%t5SegE6g+h3%E@gas-0LH&ORyaUfQvKqk+@BlmkufT7j_z*DX zF65cBcS-~%t5SegE6g+h3%E@gas-0 + From e3a78aeb770526d02f3a22f276f74b143694a7a6 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Tue, 4 Jul 2023 10:08:47 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=97=A0mark=E6=A0=A1=E9=AA=8C=E5=8F=8A=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/http/taskupload/TaskUploadScope.kt | 5 - .../com/navinfo/omqs/tools/FileManager.kt | 1 + .../navinfo/omqs/ui/fragment/BaseFragment.kt | 21 ++ .../ui/fragment/tasklist/TaskListAdapter.kt | 135 ++++++-- .../ui/fragment/tasklist/TaskListFragment.kt | 40 ++- .../ui/fragment/tasklist/TaskViewModel.kt | 111 ++++++- .../navinfo/omqs/ui/widget/LeftDeleteView.kt | 291 ++++++++++++++++++ app/src/main/res/layout/adapter_task_list.xml | 216 +++++++------ app/src/main/res/layout/dialog_default.xml | 5 +- app/src/main/res/values/attrs.xml | 6 + .../collect/library/data/entity/TaskBean.kt | 1 - 11 files changed, 697 insertions(+), 135 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/ui/widget/LeftDeleteView.kt diff --git a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt index 96369fc0..dd1189c2 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt @@ -137,11 +137,6 @@ class TaskUploadScope( problemType = 2 } var evaluationWay = 2 -/* if(it.evaluationWay=="生产测评"){ - evaluationWay = "1" - }else if(it.evaluationWay=="现场测评"){ - evaluationWay = "2" - }*/ val evaluationInfo = EvaluationInfo( evaluationTaskId = taskBean.id.toString(), linkPid = hadLinkDvoBean.linkPid,//"84207223282277331" diff --git a/app/src/main/java/com/navinfo/omqs/tools/FileManager.kt b/app/src/main/java/com/navinfo/omqs/tools/FileManager.kt index 50fc5f82..9f4e0e3a 100644 --- a/app/src/main/java/com/navinfo/omqs/tools/FileManager.kt +++ b/app/src/main/java/com/navinfo/omqs/tools/FileManager.kt @@ -28,6 +28,7 @@ class FileManager { const val ERROR = 2 //错误 const val WAITING = 3 //等待中 const val UPLOADING = 4 //同步中 + const val NOUPLOAD = 5 //无能上传 } //初始化数据文件夹 diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt index 93395a0b..06c529ce 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt @@ -2,9 +2,13 @@ package com.navinfo.omqs.ui.fragment import android.os.Bundle import androidx.activity.OnBackPressedCallback +import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment +import com.google.android.material.R +import com.google.android.material.dialog.MaterialAlertDialogBuilder abstract class BaseFragment : Fragment() { + private var loadingDialog: AlertDialog? = null // override fun onCreateView( // inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? // ): View { @@ -49,4 +53,21 @@ abstract class BaseFragment : Fragment() { return true } + + /** + * 显示loading dialog + */ + fun showLoadingDialog(message: String) { + loadingDialog?.dismiss() + loadingDialog = MaterialAlertDialogBuilder( + this.requireContext(), R.style.MaterialAlertDialog_Material3_Animation).setMessage(message).setCancelable(false).show() + } + + /** + * 隐藏loading dialog + * */ + fun hideLoadingDialog() { + loadingDialog?.dismiss() + loadingDialog = null + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt index b1dbfd5c..2a82c060 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt @@ -1,5 +1,7 @@ package com.navinfo.omqs.ui.fragment.tasklist +import android.annotation.SuppressLint +import android.app.Dialog import android.graphics.Color import android.util.Log import android.view.LayoutInflater @@ -7,15 +9,25 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.lifecycle.Observer +import androidx.recyclerview.widget.RecyclerView +import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.omqs.R import com.navinfo.omqs.databinding.AdapterTaskListBinding import com.navinfo.omqs.http.taskdownload.TaskDownloadManager import com.navinfo.omqs.http.taskupload.TaskUploadManager +import com.navinfo.omqs.tools.FileManager import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus import com.navinfo.omqs.tools.FileManager.Companion.FileUploadStatus +import com.navinfo.omqs.ui.dialog.FirstDialog import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseViewHolder +import com.navinfo.omqs.ui.widget.LeftDeleteView +import io.realm.Realm +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext /** * 离线地图城市列表 RecyclerView 适配器 @@ -28,10 +40,17 @@ import com.navinfo.omqs.ui.other.BaseViewHolder class TaskListAdapter( private val downloadManager: TaskDownloadManager, private val uploadManager: TaskUploadManager, - private var itemListener: ((Int, TaskBean) -> Unit?)? = null + private val recyclerView: RecyclerView, + private var itemListener: ((Int, Int, TaskBean) -> Unit?)? = null, ) : BaseRecyclerViewAdapter() { private var selectPosition = -1 + private var leftDeleteView: LeftDeleteView? = null + + private val mRecyclerView = recyclerView + + private var isShowDeleteView = false + private val downloadBtnClick = View.OnClickListener() { if (it.tag != null) { @@ -50,29 +69,55 @@ class TaskListAdapter( } } } else { - Toast.makeText(downloadManager.context, "数据错误,无Link信息,无法执行下载!", Toast.LENGTH_LONG).show() + Toast.makeText( + downloadManager.context, + "数据错误,无Link信息,无法执行下载!", + Toast.LENGTH_LONG + ).show() } } } private val uploadBtnClick = View.OnClickListener() { if (it.tag != null) { + val taskBean = data[it.tag as Int] + if (taskBean.hadLinkDvoList.isNotEmpty()) { - when (taskBean.syncStatus) { - FileUploadStatus.NONE, FileUploadStatus.UPLOADING, FileUploadStatus.ERROR, FileUploadStatus.WAITING -> { - uploadManager.start(taskBean.id) - } - } - }else{ - Toast.makeText(uploadManager.context, "数据错误,无Link信息,无法执行同步!", Toast.LENGTH_LONG).show() + + itemListener?.invoke(it.tag as Int, ItemClickStatus.UPLOAD_LAYOUT_CLICK, taskBean) + + } else { + Toast.makeText( + uploadManager.context, + "数据错误,无Link信息,无法执行同步!", + Toast.LENGTH_LONG + ).show() + } + } + } + + /** + * 重置item状态 + * @param point + */ + fun uploadTask(taskBean: TaskBean) { + when (taskBean.syncStatus) { + FileManager.Companion.FileUploadStatus.NONE, FileManager.Companion.FileUploadStatus.UPLOADING, FileManager.Companion.FileUploadStatus.ERROR, FileManager.Companion.FileUploadStatus.WAITING -> { + uploadManager.start(taskBean.id) } } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { + val viewBinding = AdapterTaskListBinding.inflate(LayoutInflater.from(parent.context), parent, false) + + val deleteView = viewBinding.root + + deleteView.setRecyclerView(mRecyclerView) + return BaseViewHolder(viewBinding) } @@ -82,10 +127,25 @@ class TaskListAdapter( downloadManager.removeObserver(holder.tag.toInt()) } - override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { + override fun onBindViewHolder( + holder: BaseViewHolder, + @SuppressLint("RecyclerView") position: Int + ) { val binding: AdapterTaskListBinding = holder.viewBinding as AdapterTaskListBinding val taskBean = data[position] + binding.root.mStatusChangeLister = { + isShowDeleteView = it + if (it) { + //重置以后滑动布局 + restoreItemView() + // 如果编辑菜单在显示 + leftDeleteView = binding.root + selectPosition = position + } else { + selectPosition = -1 + } + } //tag 方便onclick里拿到数据 holder.tag = taskBean.id.toString() changeViews(binding, taskBean) @@ -122,18 +182,40 @@ class TaskListAdapter( binding.taskCityName.text = taskBean.cityName binding.taskDataVersion.text = "版本号:${taskBean.dataVersion}" binding.root.isSelected = selectPosition == position - binding.root.setOnClickListener { - val pos = holder.adapterPosition - if (selectPosition != pos) { - val lastPos = selectPosition - selectPosition = pos - if (lastPos > -1) { - notifyItemChanged(lastPos) - } - binding.root.isSelected = true - itemListener?.invoke(position, taskBean) - } + binding.taskItemLayout.setOnClickListener { + if (isShowDeleteView) { + leftDeleteView?.resetDeleteStatus() + } else { + val pos = holder.adapterPosition + if (selectPosition != pos) { + val lastPos = selectPosition + selectPosition = pos + if (lastPos > -1) { + notifyItemChanged(lastPos) + } + binding.root.isSelected = true + itemListener?.invoke(position, ItemClickStatus.ITEM_LAYOUT_CLICK, taskBean) + } + } + } + + binding.taskDeleteLayout.setOnClickListener { + //重置状态 + leftDeleteView?.resetDeleteStatus() + itemListener?.invoke(position, ItemClickStatus.DELETE_LAYOUT_CLICK, taskBean) + } + } + + + /** + * 重置item状态 + * @param point + */ + fun restoreItemView() { + leftDeleteView?.let { + if (isShowDeleteView) + it.resetDeleteStatus() } } @@ -271,7 +353,8 @@ class TaskListAdapter( } val errMsg = taskBean.errMsg if (errMsg != null && errMsg.isNotEmpty()) { - Toast.makeText(binding.taskProgressText.context, errMsg, Toast.LENGTH_LONG).show() + Toast.makeText(binding.taskProgressText.context, errMsg, Toast.LENGTH_LONG) + .show() } } @@ -282,6 +365,14 @@ class TaskListAdapter( } } } + + companion object { + object ItemClickStatus { + const val ITEM_LAYOUT_CLICK = 0 //条目点击 + const val DELETE_LAYOUT_CLICK = 1 //删除点击 + const val UPLOAD_LAYOUT_CLICK = 2 //上传点击 + } + } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt index 7670904d..58ad3124 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt @@ -1,5 +1,7 @@ package com.navinfo.omqs.ui.fragment.tasklist +import android.app.Dialog +import android.os.Build import android.os.Bundle import android.text.Editable import android.text.TextWatcher @@ -7,15 +9,26 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast +import androidx.annotation.RequiresApi import androidx.recyclerview.widget.LinearLayoutManager +import com.navinfo.collect.library.data.entity.QsRecordBean +import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.omqs.databinding.FragmentTaskListBinding import com.navinfo.omqs.http.taskdownload.TaskDownloadManager import com.navinfo.omqs.http.taskupload.TaskUploadManager +import com.navinfo.omqs.tools.FileManager +import com.navinfo.omqs.ui.dialog.FirstDialog import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.other.shareViewModels import dagger.hilt.android.AndroidEntryPoint +import io.realm.Realm +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import javax.inject.Inject +@RequiresApi(Build.VERSION_CODES.M) @AndroidEntryPoint class TaskListFragment : BaseFragment() { @@ -31,14 +44,25 @@ class TaskListFragment : BaseFragment() { */ private val viewModel by shareViewModels("Task") private val binding get() = _binding!! + private val adapter: TaskListAdapter by lazy { TaskListAdapter( - downloadManager, uploadManager - ) { _, taskBean -> + downloadManager, uploadManager,binding.taskListRecyclerview + ) { _, status, taskBean -> if(taskBean.hadLinkDvoList.isEmpty()){ Toast.makeText(context, "数据错误,无Link数据!", Toast.LENGTH_SHORT).show() } - viewModel.setSelectTaskBean(taskBean) + if(status==TaskListAdapter.Companion.ItemClickStatus.ITEM_LAYOUT_CLICK){ + viewModel.setSelectTaskBean(taskBean as TaskBean) + }else if(status==TaskListAdapter.Companion.ItemClickStatus.DELETE_LAYOUT_CLICK){ + context?.let { viewModel.removeTask(it, taskBean as TaskBean) } + }else if(status==TaskListAdapter.Companion.ItemClickStatus.UPLOAD_LAYOUT_CLICK){ + showLoadingDialog("正在校验") + Toast.makeText(context, "正在校验", Toast.LENGTH_SHORT).show() + viewModel.checkUploadTask(binding.root.context,taskBean) + } else { + + } } } @@ -64,6 +88,16 @@ class TaskListFragment : BaseFragment() { adapter.refreshData(it) } + //监听并调用上传 + viewModel.liveDataTaskUpload.observe(viewLifecycleOwner){ + for ((key, value) in it) { + if(value){ + adapter.uploadTask(key) + } + } + hideLoadingDialog() + } + binding.taskListSearch.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } 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 de7053da..74ddacf6 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,5 +1,6 @@ package com.navinfo.omqs.ui.fragment.tasklist +import android.app.Dialog import android.content.Context import android.graphics.Color import android.os.Build @@ -9,6 +10,7 @@ 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.QsRecordBean import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.utils.GeometryTools @@ -16,12 +18,12 @@ import com.navinfo.omqs.Constant import com.navinfo.omqs.http.NetResult import com.navinfo.omqs.http.NetworkService import com.navinfo.omqs.tools.FileManager +import com.navinfo.omqs.ui.dialog.FirstDialog import com.navinfo.omqs.util.DateTimeUtil import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Realm import kotlinx.coroutines.* import javax.inject.Inject -import kotlin.math.max @HiltViewModel @@ -38,6 +40,12 @@ class TaskViewModel @Inject constructor( * 用来更新当前任务 */ val liveDataTaskLinks = MutableLiveData>() + + /** + * 用来更新数据是否可以上传 + */ + val liveDataTaskUpload = MutableLiveData>() + private val colors = arrayOf(Color.RED, Color.YELLOW, Color.BLUE, Color.MAGENTA, Color.GREEN, Color.CYAN) @@ -76,11 +84,11 @@ class TaskViewModel @Inject constructor( task.status = item.status task.currentSize = item.currentSize //已上传后不在更新操作时间 - if(task.syncStatus!= FileManager.Companion.FileUploadStatus.DONE){ + if (task.syncStatus != FileManager.Companion.FileUploadStatus.DONE) { //赋值时间,用于查询过滤 task.operationTime = DateTimeUtil.getNowDate().time } - }else{ + } else { //赋值时间,用于查询过滤 task.operationTime = DateTimeUtil.getNowDate().time } @@ -110,10 +118,13 @@ class TaskViewModel @Inject constructor( } 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() + 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) for (item in taskList) { FileManager.checkOMDBFileInfo(item) @@ -244,4 +255,90 @@ class TaskViewModel @Inject constructor( liveDataTaskLinks.postValue(list) } } + + 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() + } + //遍历删除对应的数据 + 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() + } + } + + fun checkUploadTask(context: Context, taskBean: TaskBean) { + viewModelScope.launch(Dispatchers.IO) { + val realm = Realm.getDefaultInstance() + taskBean.hadLinkDvoList.forEach { hadLinkDvoBean -> + val objects = realm.where(QsRecordBean::class.java) + .equalTo("linkId", hadLinkDvoBean.linkPid).findAll() + val map: MutableMap = HashMap() + if (objects.isEmpty() && hadLinkDvoBean.reason.isEmpty()) { + withContext(Dispatchers.Main) { + liveDataTaskUpload.postValue(map) + val mDialog = FirstDialog(context) + 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.show() + } + return@launch + } + map[taskBean] = true + liveDataTaskUpload.postValue(map) + } + } + } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/widget/LeftDeleteView.kt b/app/src/main/java/com/navinfo/omqs/ui/widget/LeftDeleteView.kt new file mode 100644 index 00000000..2ab8e312 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/widget/LeftDeleteView.kt @@ -0,0 +1,291 @@ +package com.navinfo.omqs.ui.widget + +import android.animation.ValueAnimator +import android.animation.ValueAnimator.AnimatorUpdateListener +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Color +import android.util.AttributeSet +import android.view.* +import android.widget.LinearLayout +import androidx.recyclerview.widget.RecyclerView +import com.navinfo.omqs.R +import kotlin.math.abs + +/** + * Description:左滑删除按钮 + * + * Time:2021/7/1-20:37 + * Author:我叫PlusPlus + */ +class LeftDeleteView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 +) : LinearLayout(context, attrs, defStyleAttr) { + /** + * 上下文 + */ + private val mContext = context + /** + * 最小触摸距离 + */ + private var mMinTouchDistance : Int = 0 + /** + * 右边可滑动距离 + */ + private var mRightCanDistance :Int = 0 + /** + * 按下时 x + */ + private var mInitX : Float = 0f + /** + * 按下y + */ + private var mInitY : Float = 0f + /** + * 属性动画 + */ + private var mValueAnimator: ValueAnimator? = null + /** + * 动画时长 + */ + private var mAnimDuring = 300 + /** + * RecyclerView + */ + private var mRecyclerView: RecyclerView? = null + /** + * 是否重新计算 + */ + private var needResetCompute = true + /** + * 状态监听 + */ + var mStatusChangeLister : ((Boolean)-> Unit) ? = null + + init { + //通过自定义属性获取删除按钮的宽度 + val array = mContext.obtainStyledAttributes(attrs, R.styleable.LeftDeleteView) + val delWidth = array.getFloat(R.styleable.LeftDeleteView_deleteBtnWidth, 0f) + array.recycle() + mMinTouchDistance = ViewConfiguration.get(mContext).scaledTouchSlop + //将dp转成PX + val var2: Float = mContext.resources.displayMetrics.density + //计算向右可以滑动的距离,单位PX + mRightCanDistance = (delWidth * var2 + 0.5f).toInt() + setBackgroundColor(Color.TRANSPARENT) + orientation = HORIZONTAL + } + + /** + * 设置RecyclerView + */ + fun setRecyclerView(recyclerView: RecyclerView) { + mRecyclerView = recyclerView + } + + + /** + * 处理触摸事件 + */ + override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { + val actionMasked = ev.actionMasked + when (actionMasked) { + MotionEvent.ACTION_DOWN -> { + mInitX = ev.rawX + scrollX + mInitY = ev.rawY + clearAnim() + } + MotionEvent.ACTION_MOVE -> { + if (mInitX - ev.rawX < 0) { + // mRecyclerView拦截 + mRecyclerView?.let { + if (needResetCompute) { + it.requestDisallowInterceptTouchEvent(false) + needResetCompute = false + } + } + return false + } + // y轴方向上达到滑动最小距离, x 轴未达到 + if (abs(ev.rawY - mInitY) >= mMinTouchDistance + && abs(ev.rawY - mInitY) > abs(mInitX - ev.rawX - scrollX)) { + // mRecyclerView拦截 + mRecyclerView?.let { + if (needResetCompute) { + it.requestDisallowInterceptTouchEvent(false) + needResetCompute = false + } + } + return false + } + // x轴方向达到了最小滑动距离,y轴未达到 + if (abs(mInitX - ev.rawX - scrollX) >= mMinTouchDistance + && abs(ev.rawY - mInitY) <= abs(mInitX - ev.rawX - scrollX)) { + // mRecyclerView拦截 + mRecyclerView?.let { + if (needResetCompute) { + it.requestDisallowInterceptTouchEvent(false) + needResetCompute = false + } + } + return true + } + } + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { + mRecyclerView?.let { + it.requestDisallowInterceptTouchEvent(false) + needResetCompute = true + } + } + else -> { + } + } + return super.onInterceptTouchEvent(ev) + } + + /** + * 处理触摸事件 + * 需要注意:何时处理左滑,何时不处理 + */ + @SuppressLint("ClickableViewAccessibility") + override fun onTouchEvent(ev: MotionEvent): Boolean { + when (ev.actionMasked) { + MotionEvent.ACTION_DOWN -> { + mInitX = ev.rawX + scrollX + mInitY = ev.rawY + clearAnim() + } + MotionEvent.ACTION_MOVE -> { + if (mInitX - ev.rawX < 0) { + // 让父级容器拦截 + mRecyclerView?.let { + if (needResetCompute) { + it.requestDisallowInterceptTouchEvent(false) + needResetCompute = false + } + } + } + // y轴方向上达到滑动最小距离, x 轴未达到 + if (abs(ev.rawY - mInitY) >= mMinTouchDistance + && abs(ev.rawY - mInitY) > abs(mInitX - ev.rawX - scrollX)) { + // mRecyclerView拦截 + mRecyclerView?.let { + if (needResetCompute) { + it.requestDisallowInterceptTouchEvent(false) + needResetCompute = false + } + } + } + // x轴方向达到了最小滑动距离,y轴未达到 + if (abs(mInitX - ev.rawX - scrollX) >= mMinTouchDistance + && abs(ev.rawY - mInitY) <= abs(mInitX - ev.rawX - scrollX)) { + // mRecyclerView拦截 + mRecyclerView?.let { + if (needResetCompute) { + it.requestDisallowInterceptTouchEvent(false) + needResetCompute = false + } + } + } + //手指移动距离超过最小距离 + var translationX = mInitX - ev.rawX + //滑动距离已经大于右边可伸缩的距离后, 重新设置 + if (translationX > mRightCanDistance) { + mInitX = ev.rawX + mRightCanDistance + } + //互动距离小于0,那么重新设置初始位置 + if (translationX < 0) { + mInitX = ev.rawX + } + translationX = if (translationX > mRightCanDistance) mRightCanDistance.toFloat() else translationX + translationX = if (translationX < 0) 0f else translationX + // 向左滑动 + if (translationX <= mRightCanDistance && translationX >= 0) { + scrollTo(translationX.toInt(), 0) + return true + } + } + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { + mRecyclerView?.let { + it.requestDisallowInterceptTouchEvent(false) + needResetCompute = true + } + upFingerAnim() + return true + } + else -> { + } + } + return true + } + + + /** + * 清理动画 + */ + private fun clearAnim() { + mValueAnimator?.let { + it.end() + it.cancel() + mValueAnimator = null + } + } + + /** + * 手指抬起开始执行动画 + */ + private fun upFingerAnim() { + val scrollX = scrollX + if (scrollX == mRightCanDistance || scrollX == 0) { + //回调显示状态 + mStatusChangeLister?.invoke(scrollX == mRightCanDistance) + return + } + clearAnim() + // 如果显出一半松开手指,那么自动完全显示。否则完全隐藏 + if (scrollX >= mRightCanDistance / 2) { + mValueAnimator = ValueAnimator.ofInt(scrollX, mRightCanDistance) + //进行滑动 + mValueAnimator?.addUpdateListener { animation -> + val value = animation.animatedValue as Int + scrollTo(value, 0) + } + mValueAnimator?.duration = mAnimDuring.toLong() + mValueAnimator?.start() + //回调显示的状态 + mStatusChangeLister?.invoke(true) + } else { + mValueAnimator = ValueAnimator.ofInt(scrollX, 0) + //进行滑动 + mValueAnimator?.addUpdateListener { animation -> + val value = animation.animatedValue as Int + scrollTo(value, 0) + } + mValueAnimator?.duration = mAnimDuring.toLong() + mValueAnimator?.start() + //回调关闭的状态 + mStatusChangeLister?.invoke(false) + } + } + + /** + * 重置按钮删除状态 + */ + fun resetDeleteStatus() { + val scrollX = scrollX + if (scrollX == 0) { + return + } + clearAnim() + mValueAnimator = ValueAnimator.ofInt(scrollX, 0) + //进行滑动 + mValueAnimator?.addUpdateListener(AnimatorUpdateListener { animation -> + val value = animation.animatedValue as Int + scrollTo(value, 0) + }) + mValueAnimator?.duration = mAnimDuring.toLong() + mValueAnimator?.start() + //回调关闭的状态 + mStatusChangeLister?.invoke(false) + } +} diff --git a/app/src/main/res/layout/adapter_task_list.xml b/app/src/main/res/layout/adapter_task_list.xml index 0f61f0f1..7754350a 100644 --- a/app/src/main/res/layout/adapter_task_list.xml +++ b/app/src/main/res/layout/adapter_task_list.xml @@ -1,107 +1,135 @@ - + tools:context="com.navinfo.omqs.ui.fragment.tasklist.TaskListAdapter" + app:deleteBtnWidth="64" + android:layout_height="wrap_content" + android:layout_width="match_parent"> - - - + android:layout_height="match_parent"> + + + + - + - + - + - + - + + + + + + + + + + + + - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_default.xml b/app/src/main/res/layout/dialog_default.xml index cb5cea89..3ad72c33 100644 --- a/app/src/main/res/layout/dialog_default.xml +++ b/app/src/main/res/layout/dialog_default.xml @@ -31,8 +31,7 @@ android:paddingRight="@dimen/eight" android:paddingTop="@dimen/eight" android:text="title" - android:textColor="@color/black" - android:textSize="@dimen/card_title_font_2size" /> + android:textColor="@color/black" /> + android:textSize="@dimen/card_title_font_2size" /> diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index e98b7923..5575ace8 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -9,4 +9,10 @@ + + //自定义删除按钮的宽度 + + + + \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/TaskBean.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/TaskBean.kt index ea6c437e..1ed80f48 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/TaskBean.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/TaskBean.kt @@ -74,5 +74,4 @@ open class TaskBean @JvmOverloads constructor( fun getDownLoadUrl(): String { return "${Constant.SERVER_ADDRESS}devcp/downFile?fileStr=$id" } - } \ No newline at end of file