diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index a885a6ea..3e194ff9 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -92,6 +92,8 @@ class Constant { val OMDB_LAYER_VISIBLE_LIST: MutableList = mutableListOf() // 记录OMDB数据显示的图层名称列表 const val EVENT_LAYER_MANAGER_CHANGE = "EVENT_LAYER_MANAGER_CHANGE" // 图层管理中的配置修改 + + const val SELECT_TASK_ID = "select_task_id" //选中的任务ID } diff --git a/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt b/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt index c72b6022..f1c356d5 100644 --- a/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt +++ b/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt @@ -1,6 +1,8 @@ package com.navinfo.omqs.hilt import android.app.Application +import android.content.Context +import android.content.SharedPreferences import android.util.Log import androidx.room.Room import com.google.gson.Gson @@ -25,7 +27,6 @@ import io.realm.Realm import kotlinx.coroutines.* import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor -import retrofit2.Call import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import java.util.concurrent.TimeUnit @@ -38,6 +39,7 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) class GlobalModule { + @Singleton @Provides fun provideApplication(@ApplicationContext application: Application): OMQSApplication { @@ -166,4 +168,10 @@ class GlobalModule { fun provideRealmDefaultInstance(): Realm { return Realm.getDefaultInstance() } + + @Singleton + @Provides + fun provideSharedPreferences(context: Application): SharedPreferences { + return context.getSharedPreferences("Shared" + Constant.USER_ID, Context.MODE_PRIVATE) + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index acf33336..470c9128 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -462,6 +462,24 @@ class MainActivity : BaseActivity() { } } + /** + * 准星的显隐控制 + */ + fun setHomeCenterVisibility(visible: Int) { + binding.mainActivityHomeCenter.visibility = visible + binding.mainActivityHomeCenterText.visibility = visible + if (visible != View.VISIBLE) { + binding.mainActivityHomeCenterText.text = "" + } + } + + /** + * 设置屏幕中心文字内容 + */ + fun setHomeCenterText(str: String) { + binding.mainActivityHomeCenterText.text = str + } + /** * 隐藏或显示右侧展开按钮 */ @@ -474,6 +492,10 @@ class MainActivity : BaseActivity() { */ fun setTopMenuButtonVisibility(visibility: Int) { binding.mainActivityMenu.visibility = visibility + if (visibility != View.VISIBLE) { + binding.mainActivityMenuGroup.visibility = View.INVISIBLE + binding.mainActivityMenu.isSelected = false + } } /** @@ -608,8 +630,14 @@ class MainActivity : BaseActivity() { */ fun onClickNewNote() { rightController.navigate(R.id.NoteFragment) - binding.mainActivityMenu.isSelected = false - binding.mainActivityMenuGroup.visibility = View.INVISIBLE + } + + /** + * 新增评测link + */ + fun onClickTaskLink() { + rightController.navigate(R.id.TaskLinkFragment) + } /** diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt new file mode 100644 index 00000000..703e0d85 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt @@ -0,0 +1,169 @@ +package com.navinfo.omqs.ui.fragment.tasklink + +import android.os.Build +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.fragment.app.viewModels +import androidx.navigation.findNavController +import androidx.navigation.fragment.findNavController +import com.navinfo.collect.library.map.NIMapController +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.FragmentTaskLinkBinding +import com.navinfo.omqs.ui.activity.map.MainActivity +import com.navinfo.omqs.ui.fragment.BaseFragment +import com.navinfo.omqs.ui.other.BaseToast +import com.navinfo.omqs.ui.other.shareViewModels +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject + +@AndroidEntryPoint +class TaskLinkFragment : BaseFragment(), View.OnClickListener { + private var _binding: FragmentTaskLinkBinding? = null + private val binding get() = _binding!! + + @Inject + lateinit var mapController: NIMapController + + private val viewModel by shareViewModels("taskLink") + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View { + _binding = FragmentTaskLinkBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + + binding.taskLinkAddPoint.setOnClickListener(this) + binding.taskLinkKind.setOnClickListener(this) + binding.taskLinkFunctionalLevel.setOnClickListener(this) + binding.taskLinkDataLevel.setOnClickListener(this) + binding.taskLinkBarCancel.setOnClickListener(this) + binding.taskLinkBarSave.setOnClickListener(this) + /** + * 数据操作结束 + */ + viewModel.liveDataFinish.observe(viewLifecycleOwner) { + if (it) + onBackPressed() + } + /** + * 种别 + */ + viewModel.liveDataSelectKind.observe(viewLifecycleOwner) { + binding.taskLinkKind.text = it?.title + } + + /** + * 功能等级 + */ + viewModel.liveDataSelectFunctionLevel.observe(viewLifecycleOwner) { + binding.taskLinkFunctionalLevel.text = it?.title + } + + /** + * 数据等级 + */ + viewModel.liveDataSelectDataLevel.observe(viewLifecycleOwner) { + binding.taskLinkDataLevel.text = it?.title + } + + /** + * 当前选中任务 + */ + viewModel.liveDataTaskBean.observe(viewLifecycleOwner) { + binding.taskLinkTaskName.text = it?.evaluationTaskName + } + + /** + * viewModel 返回的文字信息 + */ + viewModel.liveDataToastMessage.observe(viewLifecycleOwner) { + Toast.makeText(requireContext(), it, Toast.LENGTH_SHORT).show() + } + /** + * 线长度 + */ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + mapController.measureLayerHandler.lineLenghtLiveData.observe(viewLifecycleOwner) { + binding.taskLinkLength.text = "${it}米" + } + mapController.measureLayerHandler.tempLineDistanceLiveData.observe(viewLifecycleOwner) { + (activity as MainActivity).setHomeCenterText(it) + } + } + } + + override fun onStart() { + super.onStart() + /** + * 显示地图准星 + */ + activity?.let { + (activity as MainActivity).setHomeCenterVisibility(View.VISIBLE) + } + } + + override fun onDestroy() { + super.onDestroy() + } + + override fun onStop() { + super.onStop() + /** + * 隐藏地图准星 + */ + requireActivity().findNavController(R.id.main_activity_middle_fragment).navigateUp() + activity?.let { + (activity as MainActivity).setHomeCenterVisibility(View.GONE) + } + } + + override fun onClick(v: View) { + when (v) { + binding.taskLinkAddPoint -> { + viewModel.addPoint() + } + binding.taskLinkKind -> { + showMiddleFragment() + viewModel.setAdapterList(1) + } + binding.taskLinkFunctionalLevel -> { + showMiddleFragment() + viewModel.setAdapterList(2) + } + binding.taskLinkDataLevel -> { + showMiddleFragment() + viewModel.setAdapterList(3) + } + binding.taskLinkBarCancel -> { + onBackPressed() + } + binding.taskLinkBarSave -> { + viewModel.saveData() + } + } + } + + /** + * 显示中间面板 + */ + private fun showMiddleFragment() { + activity?.run { + val controller = findNavController( + R.id.main_activity_middle_fragment + ) + if (controller.currentDestination?.id == R.id.MiddleEmptyFragment) + controller.navigate(R.id.TaskLinkMiddleFragment) + } + } + + override fun onBackPressed(): Boolean { + findNavController().navigateUp() + return true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleAdapter.kt new file mode 100644 index 00000000..3ce977fa --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleAdapter.kt @@ -0,0 +1,49 @@ +package com.navinfo.omqs.ui.fragment.tasklink + +import android.os.Build +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.annotation.RequiresApi +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.AdapterElectronicEyeBinding +import com.navinfo.omqs.databinding.AdapterTaskLinkInfoBinding +import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter +import com.navinfo.omqs.ui.other.BaseViewHolder + +data class TaskLinkInfoAdapterItem( + val title: String, + val type: String +) + +class TaskLinkMiddleAdapter(private var itemListener: ((Int, TaskLinkInfoAdapterItem) -> Unit?)? = null) : + BaseRecyclerViewAdapter() { + + private var selectTitle = "" + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { + val viewBinding = + AdapterTaskLinkInfoBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return BaseViewHolder(viewBinding) + } + + @RequiresApi(Build.VERSION_CODES.M) + override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { + val binding = holder.viewBinding as AdapterTaskLinkInfoBinding + binding.title.text = data[position].title + + if (selectTitle == binding.title.text) { + binding.title.setBackgroundResource(R.drawable.shape_bg_blue_bg_4_radius) + binding.title.setTextColor(holder.viewBinding.root.context.getColor(R.color.white)) + } else { + binding.title.setBackgroundResource(R.drawable.shape_rect_white_2dp_bg) + binding.title.setTextColor(holder.viewBinding.root.context.getColor(R.color.black)) + } + binding.root.setOnClickListener { + if (selectTitle != data[position].title) { + selectTitle = data[position].title + notifyDataSetChanged() + } + itemListener?.invoke(position, data[position]) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleFragment.kt new file mode 100644 index 00000000..3b8a23dc --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleFragment.kt @@ -0,0 +1,77 @@ +package com.navinfo.omqs.ui.fragment.tasklink + +import android.os.Build +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.viewModels +import androidx.navigation.findNavController +import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.LinearLayoutManager +import com.navinfo.collect.library.map.NIMapController +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.FragmentTaskLinkBinding +import com.navinfo.omqs.databinding.FragmentTaskLinkMiddleBinding +import com.navinfo.omqs.ui.activity.map.MainActivity +import com.navinfo.omqs.ui.fragment.BaseFragment +import com.navinfo.omqs.ui.fragment.evaluationresult.LeftAdapter +import com.navinfo.omqs.ui.other.shareViewModels +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject + +@AndroidEntryPoint +class TaskLinkMiddleFragment : BaseFragment(), View.OnClickListener { + private var _binding: FragmentTaskLinkMiddleBinding? = null + private val binding get() = _binding!! + + @Inject + lateinit var mapController: NIMapController + + private val viewModel by shareViewModels("taskLink") + + /** + * 监听左侧栏的点击事件 + */ + val adapter = TaskLinkMiddleAdapter { _, item -> + viewModel.setAdapterSelectValve(item) + if (activity != null) { + requireActivity().findNavController(R.id.main_activity_middle_fragment).navigateUp() + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View { + _binding = FragmentTaskLinkMiddleBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + + binding.taskLinkMiddleRecyclerview.layoutManager = LinearLayoutManager(requireContext()) + binding.taskLinkMiddleRecyclerview.adapter = adapter + viewModel.liveDataLeftAdapterList.observe(viewLifecycleOwner) { + adapter.refreshData(it) + } + } + + + override fun onStart() { + super.onStart() + } + + override fun onStop() { + super.onStop() + } + + override fun onClick(v: View) { + when (v) { + } + } + + override fun onBackPressed(): Boolean { + findNavController().navigateUp() + return true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt new file mode 100644 index 00000000..88778e8e --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt @@ -0,0 +1,202 @@ +package com.navinfo.omqs.ui.fragment.tasklink + +import android.content.SharedPreferences +import android.os.Build +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.navinfo.collect.library.data.entity.HadLinkDvoBean +import com.navinfo.collect.library.data.entity.TaskBean +import com.navinfo.collect.library.map.NIMapController +import com.navinfo.omqs.Constant +import dagger.hilt.android.lifecycle.HiltViewModel +import io.realm.Realm +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch +import org.bson.codecs.UuidCodec +import org.bson.internal.UuidHelper +import org.oscim.core.GeoPoint +import java.util.UUID +import javax.inject.Inject + +@HiltViewModel +class TaskLinkViewModel @Inject constructor( + val mapController: NIMapController, + val sharedPreferences: SharedPreferences +) : ViewModel(), SharedPreferences.OnSharedPreferenceChangeListener { + + /** + * 种别 + */ + private val kindList = listOf( + TaskLinkInfoAdapterItem("高速道路", "1"), + TaskLinkInfoAdapterItem("城市高速", "2"), + TaskLinkInfoAdapterItem("国道", "3"), + TaskLinkInfoAdapterItem("省道", "4"), + TaskLinkInfoAdapterItem("县道", "6"), + TaskLinkInfoAdapterItem("乡镇村道路", "7"), + TaskLinkInfoAdapterItem("其他道路", "8"), + TaskLinkInfoAdapterItem("非引导道路", "9"), + TaskLinkInfoAdapterItem("步行道路", "10"), + TaskLinkInfoAdapterItem("人渡", "11"), + TaskLinkInfoAdapterItem("轮渡", "13"), + TaskLinkInfoAdapterItem("自行车道路", "15"), + ) + + /** + * FunctionGrade 功能等级 + */ + private val functionLevelList = listOf( + TaskLinkInfoAdapterItem("等级1", "1"), + TaskLinkInfoAdapterItem("等级2", "2"), + TaskLinkInfoAdapterItem("等级3", "3"), + TaskLinkInfoAdapterItem("等级4", "4"), + TaskLinkInfoAdapterItem("等级5", "5"), + ) + + /** + * 数据级别 + */ + private val dataLevelList = listOf( + TaskLinkInfoAdapterItem("Pro lane model(有高精车道模型覆盖的高速和城高link)", "1"), + TaskLinkInfoAdapterItem("Lite lane model(有高精车道模型覆盖的普通路link)", "2"), + TaskLinkInfoAdapterItem("Standard road model(其他link)", "3"), + ) + + /** + * 处理结束关闭fragment` + */ + val liveDataFinish = MutableLiveData(false) + + /** + * 左侧面板展示内容 + */ + val liveDataLeftAdapterList = MutableLiveData>() + + /** + * 选择的种别 + */ + val liveDataSelectKind = MutableLiveData() + + /** + * 选择的功能等级 + */ + val liveDataSelectFunctionLevel = MutableLiveData() + + /** + * 选择的数据等级 + */ + val liveDataSelectDataLevel = MutableLiveData() + + /** + * 要提示的错误信息 + */ + val liveDataToastMessage = MutableLiveData() + + /** + * 当前选中的任务 + */ + val liveDataTaskBean = MutableLiveData() + + /** + * 当前正在选择哪个数据 1:种别 2:功能等级 3:数据等级 + */ + private var selectType = 0 + + init { + getTaskBean() + sharedPreferences.registerOnSharedPreferenceChangeListener(this) + } + + + private fun getTaskBean() { + viewModelScope.launch(Dispatchers.IO) { + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + val realm = Realm.getDefaultInstance() + val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst() + liveDataTaskBean.postValue(realm.copyFromRealm(res)) + } + } + + /** + * 编辑点 + */ + fun addPoint() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + mapController.measureLayerHandler.drawLineOrPolygon(false) + } + } + + /** + * 设置左侧面板要显示的内容 + */ + fun setAdapterList(type: Int) { + selectType = type + when (type) { + 1 -> liveDataLeftAdapterList.value = kindList + 2 -> liveDataLeftAdapterList.value = functionLevelList + 3 -> liveDataLeftAdapterList.value = dataLevelList + } + } + + /** + * 返回左侧面板选择的内容 + */ + fun setAdapterSelectValve(item: TaskLinkInfoAdapterItem) { + when (selectType) { + 1 -> liveDataSelectKind.value = item + 2 -> liveDataSelectFunctionLevel.value = item + 3 -> liveDataSelectDataLevel.value = item + } + } + + override fun onCleared() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + mapController.measureLayerHandler.clear() + } + sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) + super.onCleared() + } + + /** + * 保存数据 + */ + fun saveData() { + viewModelScope.launch(Dispatchers.Default) { + if (liveDataTaskBean.value == null) { + liveDataToastMessage.postValue("还没有选择任何一条任务!") + return@launch + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + + if (mapController.measureLayerHandler.mPathLayer.points.size < 2) { + liveDataToastMessage.postValue("道路点少于2个!") + return@launch + } + } + if (liveDataSelectKind.value == null) { + liveDataToastMessage.postValue("请选择种别!") + return@launch + } + if (liveDataSelectFunctionLevel.value == null) { + liveDataToastMessage.postValue("请选择功能等级!") + return@launch + } + if (liveDataSelectDataLevel.value == null) { + liveDataToastMessage.postValue("请选择数据等级!") + return@launch + } + val linkBean = HadLinkDvoBean(linkPid = UUID.randomUUID().toString()) + } + } + + /** + * 监听shared变化 + */ + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + if (key == Constant.SELECT_TASK_ID) { + getTaskBean() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt index 502b8ae3..afe01176 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt @@ -1,7 +1,6 @@ package com.navinfo.omqs.ui.fragment.tasklist -import android.app.AlertDialog -import android.content.DialogInterface +import android.os.Build import android.os.Bundle import android.text.Editable import android.text.TextWatcher @@ -16,14 +15,10 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.navinfo.collect.library.data.entity.HadLinkDvoBean import com.navinfo.omqs.R import com.navinfo.omqs.databinding.FragmentTaskBinding -import com.navinfo.omqs.databinding.FragmentTaskListBinding -import com.navinfo.omqs.http.taskdownload.TaskDownloadManager -import com.navinfo.omqs.http.taskupload.TaskUploadManager import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.other.shareViewModels import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch -import javax.inject.Inject /** * 当前任务的道路列表 @@ -42,7 +37,9 @@ class TaskFragment : BaseFragment() { TaskAdapter(object : TaskAdapterCallback { override fun itemOnClick(bean: HadLinkDvoBean) { if(bean!=null){ - viewModel.showCurrentLink(bean) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + viewModel.showCurrentLink(bean) + } }else{ Toast.makeText(context, "数据错误,无法显示!", Toast.LENGTH_SHORT).show() } 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 841b1467..ab16a1cc 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,7 +1,6 @@ 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 @@ -10,7 +9,6 @@ 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 @@ -19,15 +17,9 @@ 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 适配器 @@ -51,8 +43,7 @@ class TaskListAdapter( private var isShowDeleteView = false - private - val downloadBtnClick = View.OnClickListener() { + private val downloadBtnClick = View.OnClickListener() { if (it.tag != null) { val taskBean = data[it.tag as Int] if (taskBean.hadLinkDvoList.isNotEmpty()) { @@ -131,6 +122,7 @@ class TaskListAdapter( holder: BaseViewHolder, @SuppressLint("RecyclerView") position: Int ) { + Log.e("jingo", "TaskListAdapter onBindViewHolder $position ") val binding: AdapterTaskListBinding = holder.viewBinding as AdapterTaskListBinding val taskBean = data[position] @@ -216,7 +208,7 @@ class TaskListAdapter( * 重置item状态 * @param point */ - fun restoreItemView() { + private fun restoreItemView() { leftDeleteView?.let { if (isShowDeleteView) it.resetDeleteStatus() @@ -370,6 +362,17 @@ class TaskListAdapter( } } + fun initSelectTask(list: List, id: Int?) { + + for (i in list.indices) { + if (list[i].id == id) { + selectPosition = i + break + } + } + refreshData(list) + } + companion object { object ItemClickStatus { const val ITEM_LAYOUT_CLICK = 0 //条目点击 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 c8e69749..f1f5e966 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,6 +1,5 @@ package com.navinfo.omqs.ui.fragment.tasklist -import android.app.Dialog import android.os.Build import android.os.Bundle import android.text.Editable @@ -9,26 +8,15 @@ 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() { @@ -47,11 +35,27 @@ class TaskListFragment : BaseFragment() { private val adapter: TaskListAdapter by lazy { TaskListAdapter( - downloadManager, uploadManager,binding.taskListRecyclerview + downloadManager, uploadManager, binding.taskListRecyclerview ) { _, status, taskBean -> - if(taskBean.hadLinkDvoList.isEmpty()){ + if (taskBean.hadLinkDvoList.isEmpty()) { Toast.makeText(context, "数据错误,无Link数据!", Toast.LENGTH_SHORT).show() } + when (status) { + TaskListAdapter.Companion.ItemClickStatus.ITEM_LAYOUT_CLICK -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + viewModel.setSelectTaskBean(taskBean) + } else { + } + } + TaskListAdapter.Companion.ItemClickStatus.DELETE_LAYOUT_CLICK -> { + context?.let { viewModel.removeTask(it, taskBean) } + } + TaskListAdapter.Companion.ItemClickStatus.UPLOAD_LAYOUT_CLICK -> { + showLoadingDialog("正在校验") + Toast.makeText(context, "正在校验", Toast.LENGTH_SHORT).show() + viewModel.checkUploadTask(binding.root.context, taskBean) + } + else -> { if(status==TaskListAdapter.Companion.ItemClickStatus.ITEM_LAYOUT_CLICK){ viewModel.setSelectTaskBean(taskBean as TaskBean) }else if(status==TaskListAdapter.Companion.ItemClickStatus.DELETE_LAYOUT_CLICK){ @@ -62,6 +66,7 @@ class TaskListFragment : BaseFragment() { viewModel.checkUploadTask(binding.root.context,taskBean) } else { + } } } } @@ -85,21 +90,13 @@ class TaskListFragment : BaseFragment() { binding.taskListRecyclerview.layoutManager = layoutManager binding.taskListRecyclerview.adapter = adapter viewModel.liveDataTaskList.observe(viewLifecycleOwner) { - adapter.refreshData(it) - } - - //监听关闭任务状态 - viewModel.liveDataCloseTask.observe(viewLifecycleOwner){ - if(it){ - Toast.makeText(binding.root.context,"成功关闭!",Toast.LENGTH_LONG).show() - } - hideLoadingDialog() + adapter.initSelectTask(it,viewModel.currentSelectTaskBean?.id) } //监听并调用上传 - viewModel.liveDataTaskUpload.observe(viewLifecycleOwner){ + viewModel.liveDataTaskUpload.observe(viewLifecycleOwner) { for ((key, value) in it) { - if(value){ + if (value) { adapter.uploadTask(key) } } 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 6eb9da55..35a66f37 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 @@ -2,6 +2,7 @@ package com.navinfo.omqs.ui.fragment.tasklist import android.app.Dialog import android.content.Context +import android.content.SharedPreferences import android.graphics.Color import android.os.Build import android.widget.Toast @@ -28,7 +29,9 @@ import javax.inject.Inject @HiltViewModel class TaskViewModel @Inject constructor( - private val networkService: NetworkService, private val mapController: NIMapController + private val networkService: NetworkService, + private val mapController: NIMapController, + private val sharedPreferences: SharedPreferences ) : ViewModel() { /** @@ -57,7 +60,7 @@ class TaskViewModel @Inject constructor( /** * 当前选中的任务 */ - private var currentSelectTaskBean: TaskBean? = null + var currentSelectTaskBean: TaskBean? = null /** * 任务列表查询协程 @@ -66,6 +69,7 @@ class TaskViewModel @Inject constructor( private var filterTaskJob: Job? = null + /** * 下载任务列表 */ @@ -135,6 +139,15 @@ class TaskViewModel @Inject constructor( FileManager.checkOMDBFileInfo(item) } liveDataTaskList.postValue(taskList) + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + if (id > -1) { + for(item in taskList){ + if(item.id == id){ + currentSelectTaskBean = item + liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList) + } + } + } } } @@ -143,6 +156,9 @@ class TaskViewModel @Inject constructor( */ @RequiresApi(Build.VERSION_CODES.M) fun setSelectTaskBean(taskBean: TaskBean) { + + sharedPreferences.edit().putInt(Constant.SELECT_TASK_ID, taskBean.id).commit() + currentSelectTaskBean = taskBean liveDataTaskLinks.value = taskBean.hadLinkDvoList diff --git a/app/src/main/res/drawable-xxhdpi/icon_menu_note.png b/app/src/main/res/drawable-xxhdpi/icon_menu_note.png new file mode 100644 index 00000000..9ba0d812 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/icon_menu_note.png differ diff --git a/app/src/main/res/drawable-xxhdpi/icon_note.png b/app/src/main/res/drawable-xxhdpi/icon_note.png new file mode 100644 index 00000000..3d9fa526 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/icon_note.png differ diff --git a/app/src/main/res/drawable/ripple_fragment_save_botton_bg.xml b/app/src/main/res/drawable/ripple_fragment_save_button_bg.xml similarity index 100% rename from app/src/main/res/drawable/ripple_fragment_save_botton_bg.xml rename to app/src/main/res/drawable/ripple_fragment_save_button_bg.xml diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 6a3dcc15..d6c4333f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -31,6 +31,28 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + + + app:constraint_referenced_ids="main_activity_serach,main_activity_2d_3d,main_activity_camera,main_activity_trace,main_activity_note,main_activity_task_line,main_activity_calc_disance" /> + + + \ No newline at end of file diff --git a/app/src/main/res/layout/adapter_task_link_info.xml b/app/src/main/res/layout/adapter_task_link_info.xml new file mode 100644 index 00000000..f8edde78 --- /dev/null +++ b/app/src/main/res/layout/adapter_task_link_info.xml @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_evaluation_result.xml b/app/src/main/res/layout/fragment_evaluation_result.xml index c1070d32..7d77f88b 100644 --- a/app/src/main/res/layout/fragment_evaluation_result.xml +++ b/app/src/main/res/layout/fragment_evaluation_result.xml @@ -39,7 +39,7 @@ android:layout_height="40dp" android:layout_marginTop="9dp" android:layout_marginRight="14dp" - android:background="@drawable/ripple_fragment_save_botton_bg" + android:background="@drawable/ripple_fragment_save_button_bg" android:src="@drawable/icon_save" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/fragment_note.xml b/app/src/main/res/layout/fragment_note.xml index 6ee54057..121d4b04 100644 --- a/app/src/main/res/layout/fragment_note.xml +++ b/app/src/main/res/layout/fragment_note.xml @@ -1,5 +1,6 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +