From 23a3490c20885c9c7cf6fda3e76ab12d0f70d961 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Thu, 13 Jul 2023 14:09:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=84=E6=B5=8Blink?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/navinfo/omqs/Constant.kt | 2 + .../com/navinfo/omqs/hilt/GlobalModule.kt | 10 +- .../omqs/ui/activity/map/MainActivity.kt | 32 +- .../ui/fragment/tasklink/TaskLinkFragment.kt | 169 +++++ .../tasklink/TaskLinkMiddleAdapter.kt | 49 ++ .../tasklink/TaskLinkMiddleFragment.kt | 77 +++ .../ui/fragment/tasklink/TaskLinkViewModel.kt | 202 ++++++ .../omqs/ui/fragment/tasklist/TaskFragment.kt | 11 +- .../ui/fragment/tasklist/TaskListAdapter.kt | 25 +- .../ui/fragment/tasklist/TaskListFragment.kt | 48 +- .../ui/fragment/tasklist/TaskViewModel.kt | 20 +- .../res/drawable-xxhdpi/icon_menu_note.png | Bin 0 -> 1704 bytes .../main/res/drawable-xxhdpi/icon_note.png | Bin 0 -> 1382 bytes ...xml => ripple_fragment_save_button_bg.xml} | 0 app/src/main/res/layout/activity_main.xml | 33 +- .../res/layout/adapter_task_link_info.xml | 17 + .../res/layout/fragment_evaluation_result.xml | 2 +- app/src/main/res/layout/fragment_note.xml | 21 +- .../main/res/layout/fragment_task_link.xml | 294 +++++++++ .../res/layout/fragment_task_link_middle.xml | 14 + .../navigation/middle_fragment_nav_graph.xml | 5 + .../navigation/right_fragment_nav_graph.xml | 8 +- .../src/main/assets/omdb/icon_4004_0.svg | 46 +- .../src/main/assets/omdb/icon_4010.svg | 25 +- .../library/data/entity/HadLinkDvoBean.kt | 11 +- .../collect/library/map/NIMapController.kt | 7 - .../map/handler/MeasureLayerHandler.kt | 577 +++++++++--------- .../collect/library/utils/StringUtil.kt | 1 - vtm | 2 +- 29 files changed, 1346 insertions(+), 362 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleAdapter.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleFragment.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt create mode 100644 app/src/main/res/drawable-xxhdpi/icon_menu_note.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_note.png rename app/src/main/res/drawable/{ripple_fragment_save_botton_bg.xml => ripple_fragment_save_button_bg.xml} (100%) create mode 100644 app/src/main/res/layout/adapter_task_link_info.xml create mode 100644 app/src/main/res/layout/fragment_task_link.xml create mode 100644 app/src/main/res/layout/fragment_task_link_middle.xml 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 2234802e..962fdc13 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 @@ -460,6 +460,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 + } + /** * 隐藏或显示右侧展开按钮 */ @@ -472,6 +490,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 + } } /** @@ -601,8 +623,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 2a82c060..054665a0 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] @@ -212,7 +204,7 @@ class TaskListAdapter( * 重置item状态 * @param point */ - fun restoreItemView() { + private fun restoreItemView() { leftDeleteView?.let { if (isShowDeleteView) it.resetDeleteStatus() @@ -366,6 +358,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 58ad3124..20a57e5a 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,21 +35,29 @@ 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() } - 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 { + 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 -> { + } } } } @@ -85,13 +81,13 @@ class TaskListFragment : BaseFragment() { binding.taskListRecyclerview.layoutManager = layoutManager binding.taskListRecyclerview.adapter = adapter viewModel.liveDataTaskList.observe(viewLifecycleOwner) { - adapter.refreshData(it) + 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 74ddacf6..7ffa46e3 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() { /** @@ -52,7 +55,7 @@ class TaskViewModel @Inject constructor( /** * 当前选中的任务 */ - private var currentSelectTaskBean: TaskBean? = null + var currentSelectTaskBean: TaskBean? = null /** * 任务列表查询协程 @@ -61,6 +64,7 @@ class TaskViewModel @Inject constructor( private var filterTaskJob: Job? = null + /** * 下载任务列表 */ @@ -130,6 +134,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) + } + } + } } } @@ -138,6 +151,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 0000000000000000000000000000000000000000..9ba0d812eda4d92a2cef56c8f6ba8c7f571710f4 GIT binary patch literal 1704 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 literal 0 HcmV?d00001 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 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +