From d926a147f340ab0756b28f8b660a5bbefa78de8a Mon Sep 17 00:00:00 2001
From: xiaoyan <xiaoyan159@163.com>
Date: Fri, 5 May 2023 10:58:16 +0800
Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=9B=BE?=
 =?UTF-8?q?=E5=B1=82=E7=AE=A1=E7=90=86=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    |  6 +-
 .../omqs/ui/activity/map/MainActivity.kt      | 24 +++++-
 .../omqs/ui/activity/map/MainViewModel.kt     |  4 +-
 .../LayerManagerExpandableListAdapter.kt      | 29 +++++---
 .../layermanager/LayerManagerViewModel.kt     | 13 +++-
 .../layermanager/LayermanagerFragment.kt      | 26 ++++++-
 .../com/navinfo/omqs/util/FlowEventBus.kt     | 73 +++++++++++++++++++
 ...r_default_text_color_white_enable_gray.xml |  4 +-
 .../res/drawable/ic_baseline_check_24.xml     |  5 ++
 .../ic_baseline_keyboard_arrow_down_24.xml    |  5 ++
 .../ic_baseline_keyboard_arrow_left_24.xml    |  5 ++
 .../ic_baseline_keyboard_arrow_right_24.xml   |  5 ++
 .../res/drawable/selector_bg_round_button.xml |  8 ++
 .../main/res/drawable/selector_img_expand.xml |  6 ++
 .../res/drawable/shape_card_bg_default.xml    | 11 +++
 .../res/drawable/shape_round_btn_normal.xml   |  5 ++
 .../res/drawable/shape_round_btn_press.xml    |  5 ++
 .../res/layout/fragment_layer_manager.xml     | 70 +++++++++++++++---
 .../layout/layer_manager_checked_child.xml    | 19 ++++-
 .../layout/layer_manager_checked_parent.xml   | 31 ++++++--
 app/src/main/res/values/colors.xml            |  3 +-
 app/src/main/res/values/dimens.xml            |  1 +
 app/src/main/res/values/styles.xml            | 21 +++++-
 .../map/handler/LayerManagerHandler.kt        |  3 +-
 .../map/source/OMDBTileDataSource.java        | 16 ++--
 25 files changed, 348 insertions(+), 50 deletions(-)
 create mode 100644 app/src/main/java/com/navinfo/omqs/util/FlowEventBus.kt
 create mode 100644 app/src/main/res/drawable/ic_baseline_check_24.xml
 create mode 100644 app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml
 create mode 100644 app/src/main/res/drawable/ic_baseline_keyboard_arrow_left_24.xml
 create mode 100644 app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24.xml
 create mode 100644 app/src/main/res/drawable/selector_bg_round_button.xml
 create mode 100644 app/src/main/res/drawable/selector_img_expand.xml
 create mode 100644 app/src/main/res/drawable/shape_card_bg_default.xml
 create mode 100644 app/src/main/res/drawable/shape_round_btn_normal.xml
 create mode 100644 app/src/main/res/drawable/shape_round_btn_press.xml

diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt
index b3bd4539..0df2e6d9 100644
--- a/app/src/main/java/com/navinfo/omqs/Constant.kt
+++ b/app/src/main/java/com/navinfo/omqs/Constant.kt
@@ -62,8 +62,6 @@ class Constant {
 
         const val MESSAGE_PAGE_SIZE = 30 //消息列表一页最多数量
 
-        lateinit var realm: Realm
-
         //选择相机默认或者外设
         const val SELECT_CAMERA_STATE = "select_camera_state"
 
@@ -86,6 +84,10 @@ class Constant {
         const val OMDB_CONFIG = "omdb.config"
         const val OTHER_CONFIG = "other.config"
         const val LAYER_MANAGER_CONFIG = "LAYER_MANAGER_CONFIG" // 图层管理界面缓存的key
+
+        val OMDB_LAYER_VISIBLE_LIST: MutableList<String> = mutableListOf() // 记录OMDB数据显示的图层名称列表
+
+        const val EVENT_LAYER_MANAGER_CHANGE = "EVENT_LAYER_MANAGER_CHANGE" // 图层管理中的配置修改
     }
 
 
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 620a0ece..73e3ec2b 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
@@ -9,17 +9,18 @@ import androidx.activity.viewModels
 import androidx.annotation.RequiresApi
 import androidx.core.view.WindowCompat
 import androidx.databinding.DataBindingUtil
-import androidx.navigation.findNavController
+import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.LinearLayoutManager
-import com.blankj.utilcode.util.ToastUtils
 import com.navinfo.collect.library.map.NIMapController
-import com.navinfo.collect.library.map.handler.NiLocationListener
 import com.navinfo.omqs.Constant
 import com.navinfo.omqs.R
+import com.navinfo.omqs.bean.ImportConfig
 import com.navinfo.omqs.databinding.ActivityMainBinding
 import com.navinfo.omqs.http.offlinemapdownload.OfflineMapDownloadManager
 import com.navinfo.omqs.ui.activity.BaseActivity
+import com.navinfo.omqs.util.FlowEventBus
 import dagger.hilt.android.AndroidEntryPoint
+import kotlinx.coroutines.launch
 import javax.inject.Inject
 
 /**
@@ -88,6 +89,23 @@ class MainActivity : BaseActivity() {
         viewModel.liveDataSignList.observe(this) {
             signAdapter.refreshData(it)
         }
+
+        lifecycleScope.launch {
+            // 初始化地图图层控制接收器
+            FlowEventBus.subscribe<List<ImportConfig>>(lifecycle, Constant.EVENT_LAYER_MANAGER_CHANGE) {
+                // 根据获取到的配置信息,筛选未勾选的图层名称
+                val omdbVisibleList = it.filter { importConfig->
+                    importConfig.tableGroupName == "OMDB数据"
+                }.first().tables.filter { tableInfo ->
+                    !tableInfo.checked
+                }.map {
+                    tableInfo -> tableInfo.table
+                }.toList()
+                com.navinfo.collect.library.system.Constant.HAD_LAYER_INVISIABLE_ARRAY = omdbVisibleList.toTypedArray()
+                // 刷新地图
+                mapController.mMapView.vtmMap.clearMap()
+            }
+        }
     }
 
     override fun onStart() {
diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt
index 39a9f952..21201bf5 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt
@@ -29,15 +29,18 @@ import com.navinfo.collect.library.utils.GeometryTools
 import com.navinfo.collect.library.utils.GeometryToolsKt
 import com.navinfo.omqs.Constant
 import com.navinfo.omqs.R
+import com.navinfo.omqs.bean.ImportConfig
 import com.navinfo.omqs.db.RealmOperateHelper
 import com.navinfo.omqs.ui.dialog.CommonDialog
 import com.navinfo.omqs.ui.manager.TakePhotoManager
 import com.navinfo.omqs.util.DateTimeUtil
+import com.navinfo.omqs.util.FlowEventBus
 import com.navinfo.omqs.util.SoundMeter
 import com.navinfo.omqs.util.SpeakMode
 import dagger.hilt.android.lifecycle.HiltViewModel
 import io.realm.RealmSet
 import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.launch
 import org.oscim.core.GeoPoint
@@ -88,7 +91,6 @@ class MainViewModel @Inject constructor(
                 testPoint = it
             }
         }
-
     }
 
     private fun initLocation() {
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerExpandableListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerExpandableListAdapter.kt
index aeacc1b4..9e6c267a 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerExpandableListAdapter.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerExpandableListAdapter.kt
@@ -4,13 +4,12 @@ import android.content.Context
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
-import android.widget.BaseExpandableListAdapter
-import android.widget.CheckBox
+import android.widget.*
 import com.navinfo.omqs.R
 import com.navinfo.omqs.bean.ImportConfig
 import com.navinfo.omqs.bean.TableInfo
 
-class LayerManagerExpandableListAdapter(private val context: Context, private val parentItems: List<ImportConfig>) :
+class LayerManagerExpandableListAdapter(private val context: Context, val parentItems: List<ImportConfig>) :
     BaseExpandableListAdapter() {
 
     override fun getGroupCount(): Int {
@@ -30,7 +29,6 @@ class LayerManagerExpandableListAdapter(private val context: Context, private va
         return parentItems[groupPosition].tables[childPosition]
     }
 
-
     override fun getGroupId(groupPosition: Int): Long = groupPosition.toLong()
 
     override fun getChildId(groupPosition: Int, childPosition: Int): Long = childPosition.toLong()
@@ -56,14 +54,18 @@ class LayerManagerExpandableListAdapter(private val context: Context, private va
         }
 
         val parentItem = getGroup(groupPosition) as ImportConfig
-        viewHolder.parentCheckBox.text = parentItem.tableGroupName
+        viewHolder.parentName.text = parentItem.tableGroupName
         viewHolder.parentCheckBox.isChecked = parentItem.checked
-        viewHolder.parentCheckBox.setOnCheckedChangeListener { _, isChecked ->
-            parentItem.checked = isChecked
-            parentItem.tables.forEach { it.checked = isChecked }
+        viewHolder.parentCheckBox.setOnClickListener {
+            parentItem.checked = !parentItem.checked
+            parentItem.tables.forEach { it.checked = parentItem.checked }
             notifyDataSetChanged()
         }
-
+        if (isExpanded) {
+            viewHolder.imgGroupIndicator.setImageResource(R.drawable.ic_baseline_keyboard_arrow_down_24)
+        } else {
+            viewHolder.imgGroupIndicator.setImageResource(R.drawable.ic_baseline_keyboard_arrow_right_24)
+        }
         return view!!
     }
 
@@ -87,10 +89,10 @@ class LayerManagerExpandableListAdapter(private val context: Context, private va
         }
 
         val childItem = getChild(groupPosition, childPosition) as TableInfo
-        viewHolder.childCheckBox.text = childItem.name
+        viewHolder.childName.text = childItem.name
         viewHolder.childCheckBox.isChecked = childItem.checked
-        viewHolder.childCheckBox.setOnCheckedChangeListener { _, isChecked ->
-            childItem.checked = isChecked
+        viewHolder.childCheckBox.setOnClickListener {
+            childItem.checked = !childItem.checked
             parentItems[groupPosition].checked = parentItems[groupPosition].tables.all { it.checked }
             notifyDataSetChanged()
         }
@@ -102,9 +104,12 @@ class LayerManagerExpandableListAdapter(private val context: Context, private va
 
     internal class ParentViewHolder(view: View) {
         val parentCheckBox: CheckBox = view.findViewById(R.id.chk_layermanager_parent)
+        val parentName: TextView = view.findViewById(R.id.tv_layermanager_parent_name)
+        val imgGroupIndicator: ImageView = view.findViewById(R.id.img_group_indicator)
     }
 
     internal class ChildViewHolder(view: View) {
         val childCheckBox: CheckBox = view.findViewById(R.id.chk_layermanager_child)
+        val childName: TextView = view.findViewById(R.id.tv_layermanager_child_name)
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerViewModel.kt
index c73ccc2e..6f0ae558 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerViewModel.kt
@@ -1,12 +1,15 @@
 package com.navinfo.omqs.ui.fragment.layermanager
 
 import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
 import com.blankj.utilcode.util.FileIOUtils
 import com.blankj.utilcode.util.SPStaticUtils
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
 import com.navinfo.omqs.Constant
 import com.navinfo.omqs.bean.ImportConfig
+import com.navinfo.omqs.util.FlowEventBus
+import kotlinx.coroutines.launch
 import java.io.File
 
 class LayerManagerViewModel(): ViewModel() {
@@ -16,7 +19,7 @@ class LayerManagerViewModel(): ViewModel() {
 
     fun getLayerConfigList(): List<ImportConfig> {
         // 首先读取Shared文件,如果存在则直接返回,否则读取config文件
-        val importConfigList = with(SPStaticUtils.getString(Constant.LAYER_MANAGER_CONFIG, null)) {
+        val importConfigList: List<ImportConfig>? = SPStaticUtils.getString(Constant.LAYER_MANAGER_CONFIG, null).run {
             if (this!=null) {
                 gson.fromJson(this, object : TypeToken<List<ImportConfig>>(){}.type)
             } else {
@@ -30,6 +33,14 @@ class LayerManagerViewModel(): ViewModel() {
         }
     }
 
+    fun saveLayerConfigList(listData: List<ImportConfig>) {
+        SPStaticUtils.put(Constant.EVENT_LAYER_MANAGER_CHANGE, gson.toJson(listData))
+        // 发送新的配置数据
+        viewModelScope.launch {
+            FlowEventBus.post(Constant.EVENT_LAYER_MANAGER_CHANGE, listData)
+        }
+    }
+
     private fun getLayerConfigListFromAssetsFile(): List<ImportConfig> {
         val resultList = mutableListOf<ImportConfig>()
         if (omdbConfigFile.exists()) {
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayermanagerFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayermanagerFragment.kt
index b49e1b39..ba11a236 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayermanagerFragment.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayermanagerFragment.kt
@@ -6,11 +6,15 @@ import android.view.View
 import android.view.ViewGroup
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.viewModels
+import androidx.navigation.fragment.findNavController
+import com.blankj.utilcode.util.SPStaticUtils
+import com.navinfo.omqs.Constant
 import com.navinfo.omqs.databinding.FragmentEmptyBinding
 import com.navinfo.omqs.databinding.FragmentLayerManagerBinding
+import com.navinfo.omqs.ui.fragment.BaseFragment
 import com.navinfo.omqs.ui.fragment.offlinemap.OfflineMapCityListViewModel
 
-class LayermanagerFragment :Fragment(){
+class LayermanagerFragment : BaseFragment(){
     private var _binding: FragmentLayerManagerBinding? = null
 
     private val binding get() = _binding!!
@@ -28,6 +32,26 @@ class LayermanagerFragment :Fragment(){
         super.onViewCreated(view, savedInstanceState)
         val adapter = LayerManagerExpandableListAdapter(requireContext(), viewModel.getLayerConfigList())
         binding.elvLayerManager.setAdapter(adapter)
+        // 默认显示第一个父项下的子类
+        binding.elvLayerManager.expandGroup(0)
+        binding.elvLayerManager.setGroupIndicator(null)
+        binding.elvLayerManager.setOnGroupClickListener { expandableListView, view, groupPosition, l ->
+            if (expandableListView.isGroupExpanded(groupPosition)) {
+                binding.elvLayerManager.collapseGroup(groupPosition)
+            } else {
+                binding.elvLayerManager.expandGroup(groupPosition)
+            }
+        }
+
+        binding.imgBack.setOnClickListener {
+            findNavController().navigateUp()
+        }
+
+        binding.tvTitle.text = findNavController().currentDestination?.label
+
+        binding.imgConfirm.setOnClickListener {  // 用户点击确认,重新设置当前的图层显隐控制
+            viewModel.saveLayerConfigList(adapter.parentItems)
+        }
     }
 
     override fun onDestroyView() {
diff --git a/app/src/main/java/com/navinfo/omqs/util/FlowEventBus.kt b/app/src/main/java/com/navinfo/omqs/util/FlowEventBus.kt
new file mode 100644
index 00000000..1353aeb9
--- /dev/null
+++ b/app/src/main/java/com/navinfo/omqs/util/FlowEventBus.kt
@@ -0,0 +1,73 @@
+package com.navinfo.omqs.util
+
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.repeatOnLifecycle
+import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.SharedFlow
+
+object FlowEventBus {
+    private val bus: HashMap<String, MutableSharedFlow<out Any>> = hashMapOf()
+
+    private fun <T : Any> with(key: String): MutableSharedFlow<T> {
+        if (!bus.containsKey(key)) {
+            val flow = MutableSharedFlow<T>()
+            bus[key] = flow
+        }
+        return bus[key] as MutableSharedFlow<T>
+    }
+
+    /**
+     * 对外只暴露SharedFlow
+     * @param action String
+     * @return SharedFlow<T>
+     */
+    fun <T> getFlow(action: String): SharedFlow<T> {
+        return with(action)
+    }
+
+
+    /**
+     * 挂起函数
+     * @param action String
+     * @param data T
+     */
+    suspend fun <T : Any> post(action: String, data: T) {
+        with<T>(action).emit(data)
+    }
+
+    /**
+     * 详见tryEmit和emit的区别
+     * @param action String
+     * @param data T
+     * @return Boolean
+     */
+    fun <T : Any> tryPost(action: String, data: T): Boolean {
+        return with<T>(action).tryEmit(data)
+    }
+
+    /**
+     * sharedFlow会长久持有,所以要加声明周期限定,不然会出现内存溢出
+     * @param lifecycle Lifecycle
+     * @param action String
+     * @param block Function1<T, Unit>
+     */
+    suspend fun <T : Any> subscribe(lifecycle: Lifecycle, action: String, block: (T) -> Unit) {
+        lifecycle.repeatOnLifecycle(Lifecycle.State.CREATED) {
+            with<T>(action).collect {
+                block(it)
+            }
+        }
+    }
+
+    /**
+     * 注意,使用这个方法需要将协程在合适的时候取消,否则会导致内存溢出
+     * @param action String
+     * @param block Function1<T, Unit>
+     */
+    suspend fun <T : Any> subscribe(action: String, block: (T) -> Unit) {
+        with<T>(action).collect {
+            block(it)
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/color/selector_default_text_color_white_enable_gray.xml b/app/src/main/res/color/selector_default_text_color_white_enable_gray.xml
index 18707d36..f3d0a646 100644
--- a/app/src/main/res/color/selector_default_text_color_white_enable_gray.xml
+++ b/app/src/main/res/color/selector_default_text_color_white_enable_gray.xml
@@ -1,6 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_enabled="false"  android:color="@color/line_gray" />
+    <item android:state_pressed="true"  android:color="@color/line_gray" />
+    <item android:state_selected="true"  android:color="@color/line_gray" />
+    <item android:state_checked="true"  android:color="@color/line_gray" />
     <item android:color="@color/white" />
-
 </selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_baseline_check_24.xml b/app/src/main/res/drawable/ic_baseline_check_24.xml
new file mode 100644
index 00000000..a95c8560
--- /dev/null
+++ b/app/src/main/res/drawable/ic_baseline_check_24.xml
@@ -0,0 +1,5 @@
+<vector android:height="24dp" android:tint="#2C2C2C"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml
new file mode 100644
index 00000000..000b1a11
--- /dev/null
+++ b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml
@@ -0,0 +1,5 @@
+<vector android:height="24dp" android:tint="#2C2C2C"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M7.41,8.59L12,13.17l4.59,-4.58L18,10l-6,6 -6,-6 1.41,-1.41z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_left_24.xml b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_left_24.xml
new file mode 100644
index 00000000..5b5b57c0
--- /dev/null
+++ b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_left_24.xml
@@ -0,0 +1,5 @@
+<vector android:autoMirrored="true" android:height="24dp"
+    android:tint="#2C2C2C" android:viewportHeight="24"
+    android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M15.41,16.59L10.83,12l4.58,-4.59L14,6l-6,6 6,6 1.41,-1.41z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24.xml b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24.xml
new file mode 100644
index 00000000..44f9953c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24.xml
@@ -0,0 +1,5 @@
+<vector android:autoMirrored="true" android:height="24dp"
+    android:tint="#2C2C2C" android:viewportHeight="24"
+    android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M8.59,16.59L13.17,12 8.59,7.41 10,6l6,6 -6,6 -1.41,-1.41z"/>
+</vector>
diff --git a/app/src/main/res/drawable/selector_bg_round_button.xml b/app/src/main/res/drawable/selector_bg_round_button.xml
new file mode 100644
index 00000000..bb411691
--- /dev/null
+++ b/app/src/main/res/drawable/selector_bg_round_button.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_enabled="false" android:drawable="@drawable/shape_round_btn_press"></item>
+    <item android:state_checked="true" android:drawable="@drawable/shape_round_btn_press"/>
+    <item android:state_pressed="true" android:drawable="@drawable/shape_round_btn_press"/>
+    <item android:state_selected="true" android:drawable="@drawable/shape_round_btn_press"></item>
+    <item android:drawable="@drawable/shape_round_btn_normal"/>
+</selector>
diff --git a/app/src/main/res/drawable/selector_img_expand.xml b/app/src/main/res/drawable/selector_img_expand.xml
new file mode 100644
index 00000000..c9788a8f
--- /dev/null
+++ b/app/src/main/res/drawable/selector_img_expand.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_expanded="true"
+        android:drawable="@drawable/ic_baseline_keyboard_arrow_down_24"/>
+    <item android:drawable="@drawable/ic_baseline_keyboard_arrow_right_24"/>
+</selector>
diff --git a/app/src/main/res/drawable/shape_card_bg_default.xml b/app/src/main/res/drawable/shape_card_bg_default.xml
new file mode 100644
index 00000000..8abc0e3e
--- /dev/null
+++ b/app/src/main/res/drawable/shape_card_bg_default.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="@dimen/default_widget_padding"></corners>
+    <padding
+        android:bottom="@dimen/nimap_defalut_padding"
+        android:left="@dimen/nimap_defalut_padding"
+        android:right="@dimen/nimap_defalut_padding"
+        android:top="@dimen/nimap_defalut_padding"></padding>
+    <solid android:color="@color/colorSurface"></solid>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shape_round_btn_normal.xml b/app/src/main/res/drawable/shape_round_btn_normal.xml
new file mode 100644
index 00000000..40cff95d
--- /dev/null
+++ b/app/src/main/res/drawable/shape_round_btn_normal.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <solid android:color="@color/colorSurface" />
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shape_round_btn_press.xml b/app/src/main/res/drawable/shape_round_btn_press.xml
new file mode 100644
index 00000000..e11e679f
--- /dev/null
+++ b/app/src/main/res/drawable/shape_round_btn_press.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <solid android:color="@color/colorOnSurface" />
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_layer_manager.xml b/app/src/main/res/layout/fragment_layer_manager.xml
index cd8f3149..44d94c43 100644
--- a/app/src/main/res/layout/fragment_layer_manager.xml
+++ b/app/src/main/res/layout/fragment_layer_manager.xml
@@ -1,12 +1,64 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    tools:context=".ui.fragment.empty.EmptyFragment">
-
-    <ExpandableListView
-        android:id="@+id/elv_layer_manager"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:background="@color/bg_left_pannel"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/title_layout"
         android:layout_width="match_parent"
-        android:layout_height="match_parent"/>
-</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
+        android:layout_height="wrap_content"
+        app:layout_constraintTop_toTopOf="parent"
+        style="@style/left_pannel_title_layout">
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/img_back"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            android:layout_marginTop="5dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:background="@drawable/selector_bg_round_button"
+            android:foreground="@drawable/ripple_btn_press"
+            style="@style/btn_round"
+            android:src="@drawable/ic_baseline_keyboard_arrow_left_24"></androidx.appcompat.widget.AppCompatImageView>
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textSize="@dimen/left_pannel_title_font"
+            android:textStyle="bold"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"></androidx.appcompat.widget.AppCompatTextView>
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/img_confirm"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            android:layout_marginTop="5dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:background="@drawable/selector_bg_round_button"
+            android:foreground="@drawable/ripple_btn_press"
+            style="@style/btn_round"
+            android:src="@drawable/ic_baseline_check_24"></androidx.appcompat.widget.AppCompatImageView>
+    </androidx.constraintlayout.widget.ConstraintLayout>
+    <androidx.cardview.widget.CardView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_constraintTop_toBottomOf="@id/title_layout"
+        style="@style/default_card_view">
+        <ExpandableListView
+            android:id="@+id/elv_layer_manager"
+            android:divider="@android:drawable/divider_horizontal_dim_dark"
+            android:dividerHeight="0.1dp"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"/>
+    </androidx.cardview.widget.CardView>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layer_manager_checked_child.xml b/app/src/main/res/layout/layer_manager_checked_child.xml
index 99cd89f9..158d2140 100644
--- a/app/src/main/res/layout/layer_manager_checked_child.xml
+++ b/app/src/main/res/layout/layer_manager_checked_child.xml
@@ -1,10 +1,21 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:paddingLeft="@dimen/default_widget_padding"
+    android:gravity="center_vertical"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
-    <androidx.appcompat.widget.AppCompatCheckBox
+    android:layout_height="wrap_content">
+
+    <CheckBox
         android:id="@+id/chk_layermanager_child"
-        android:layout_width="match_parent"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:checked="true"></androidx.appcompat.widget.AppCompatCheckBox>
+        android:paddingVertical="0dp"
+        android:paddingHorizontal="@dimen/default_widget_padding"
+        android:checked="true"></CheckBox>
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_layermanager_child_name"
+        android:textSize="@dimen/default_font_size"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"></androidx.appcompat.widget.AppCompatTextView>
 </LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layer_manager_checked_parent.xml b/app/src/main/res/layout/layer_manager_checked_parent.xml
index 66756e88..2c5c4a52 100644
--- a/app/src/main/res/layout/layer_manager_checked_parent.xml
+++ b/app/src/main/res/layout/layer_manager_checked_parent.xml
@@ -1,11 +1,32 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="wrap_content"
+    android:orientation="horizontal">
     <androidx.appcompat.widget.AppCompatCheckBox
         android:id="@+id/chk_layermanager_parent"
-        android:layout_width="match_parent"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:textStyle="bold"
+        android:focusable="false"
+        android:focusableInTouchMode="false"
+        android:layout_alignParentLeft="true"
+        android:layout_centerVertical="true"
         android:checked="true"></androidx.appcompat.widget.AppCompatCheckBox>
-</LinearLayout>
\ No newline at end of file
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/img_group_indicator"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:src="@drawable/selector_img_expand"></androidx.appcompat.widget.AppCompatImageView>
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_layermanager_parent_name"
+        android:textStyle="bold"
+        android:textSize="@dimen/default_font_size"
+        android:layout_width="match_parent"
+        android:layout_toLeftOf="@id/img_group_indicator"
+        android:layout_toRightOf="@id/chk_layermanager_parent"
+        android:layout_centerVertical="true"
+        android:layout_height="wrap_content"></androidx.appcompat.widget.AppCompatTextView>
+</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 7f540798..7eea917c 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -2,11 +2,12 @@
 <resources>
     <color name="transp">#00000000</color>
     <color name="line_gray" comment="轻度灰色,一般用于下划线,不可点击按钮的边框">#dadade</color>
+    <color name="bg_left_pannel" comment="左侧弹出框背景颜色">#f4f4fc</color>
     <color name="colorPrimary">#6c14c4</color>
     <color name="colorSecondary">#4c54ec</color>
     <color name="colorAccent">#c42cd4</color>
     <color name="colorSurface">#FFFFFF</color>
-    <color name="colorOnSurface">#4263EB</color>
+    <color name="colorOnSurface">#3c3c44</color>
     <color name="colorPrimarySurface">#aa342c4c</color>
     <color name="colorOnPrimarySurface">#FFFFFF</color>
     <color name="colorError">#e74c3c</color>
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 7785420d..4ad74c4a 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -6,6 +6,7 @@
     <dimen name="nav_header_vertical_spacing">8dp</dimen>
     <dimen name="nav_header_height">176dp</dimen>
     <dimen name="default_widget_padding">10dp</dimen>
+    <dimen name="left_pannel_title_font" comment="左侧弹出框顶部标题字体大小">22sp</dimen>
     <dimen name="default_font_size" comment="默认字体大小,style中父最顶层">15sp</dimen>
     <dimen name="card_title_font_2size">13sp</dimen>
     <dimen name="card_title_font_3size">10sp</dimen>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index d74b2586..101bdcfd 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -76,7 +76,7 @@
     </style>
 
     <style name="btn_gradient_color" parent="TextAppearance.AppCompat.Button">
-        <item name="android:textColor">@color/btn_select_color</item>
+        <item name="android:textColor">@color/selector_default_text_color_white_enable_gray</item>
         <item name="android:background">@drawable/selector_bg_default_button</item>
         <item name="android:clickable">true</item>
         <item name="android:focusable">true</item>
@@ -102,4 +102,23 @@
         <item name="android:windowBackground">@android:color/transparent</item>
         <item name="android:windowNoTitle">true</item>
     </style>
+
+    <!-- 左侧弹出框顶部标题栏样式 -->
+    <style name="left_pannel_title_layout" parent="TextAppearance.AppCompat">
+        <item name="android:textSize">@dimen/left_pannel_title_font</item>
+        <item name="android:textColor">@color/black</item>
+        <item name="android:paddingHorizontal">@dimen/default_widget_padding</item>
+    </style>
+
+    <!--圆形按钮的样式-->
+    <style name="btn_round">
+        <item name="background">@drawable/selector_bg_round_button</item>
+        <item name="android:padding">@dimen/default_widget_padding</item>
+    </style>
+
+    <style name="default_card_view" parent="@style/CardView">
+        <item name="background">@drawable/shape_card_bg_default</item>
+        <item name="android:layout_margin">@dimen/default_widget_padding</item>
+        <item name="cardCornerRadius">@dimen/default_widget_padding</item>
+    </style>
 </resources>
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
index 085a7766..ba22bce1 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
@@ -47,6 +47,8 @@ class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tracePa
     private lateinit var omdbVectorTileLayer: VectorTileLayer
     private lateinit var omdbLabelLayer: LabelLayer
 
+    private val omdbTileSource by lazy { OMDBTileSource() }
+
     init {
         initMap()
     }
@@ -97,7 +99,6 @@ class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tracePa
     }
 
     private fun initOMDBVectorTileLayer() {
-        val omdbTileSource: OMDBTileSource = OMDBTileSource()
         omdbVectorTileLayer = VectorTileLayer(mMapView.vtmMap, omdbTileSource)
         omdbLabelLayer = LabelLayer(mMapView.vtmMap, omdbVectorTileLayer, LabelTileLoaderHook(), Constant.OMDB_MIN_ZOOM)
         if(omdbVectorTileLayer!=null){
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java
index 31f2291a..277c6f3c 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java
@@ -41,14 +41,14 @@ public class OMDBTileDataSource implements ITileDataSource {
 
             RealmQuery<RenderEntity> realmQuery = Realm.getDefaultInstance().where(RenderEntity.class)
                     .rawPredicate("tileX>="+xStart+" and tileX<="+xEnd+" and tileY>="+yStart+" and tileY<="+yEnd);
-//            // 筛选不显示的数据
-//            if (Constant.HAD_LAYER_INVISIABLE_ARRAY!=null&&Constant.HAD_LAYER_INVISIABLE_ARRAY.length>0) {
-//                realmQuery.beginGroup();
-//                for (String type: Constant.HAD_LAYER_INVISIABLE_ARRAY) {
-//                    realmQuery.notEqualTo("name", type);
-//                }
-//                realmQuery.endGroup();
-//            }
+            // 筛选不显示的数据
+            if (Constant.HAD_LAYER_INVISIABLE_ARRAY!=null&&Constant.HAD_LAYER_INVISIABLE_ARRAY.length>0) {
+                realmQuery.beginGroup();
+                for (String type: Constant.HAD_LAYER_INVISIABLE_ARRAY) {
+                    realmQuery.notEqualTo("table", type);
+                }
+                realmQuery.endGroup();
+            }
             List<RenderEntity> listResult = realmQuery/*.distinct("id")*/.findAll();
             if (!listResult.isEmpty()) {
                 mThreadLocalDecoders.get().decode(tile, mapDataSink, listResult);

From 464ca815c47dfb8d5f78bdeadd7700fff18c72e9 Mon Sep 17 00:00:00 2001
From: xiaoyan <xiaoyan159@163.com>
Date: Fri, 5 May 2023 14:12:20 +0800
Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E5=9B=BE=E5=B1=82?=
 =?UTF-8?q?=E7=AE=A1=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/src/main/java/com/navinfo/omqs/Constant.kt               | 1 -
 app/src/main/java/com/navinfo/omqs/tools/LayerConfigUtils.kt | 4 ++--
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt
index 0df2e6d9..87db6dfd 100644
--- a/app/src/main/java/com/navinfo/omqs/Constant.kt
+++ b/app/src/main/java/com/navinfo/omqs/Constant.kt
@@ -83,7 +83,6 @@ class Constant {
 
         const val OMDB_CONFIG = "omdb.config"
         const val OTHER_CONFIG = "other.config"
-        const val LAYER_MANAGER_CONFIG = "LAYER_MANAGER_CONFIG" // 图层管理界面缓存的key
 
         val OMDB_LAYER_VISIBLE_LIST: MutableList<String> = mutableListOf() // 记录OMDB数据显示的图层名称列表
 
diff --git a/app/src/main/java/com/navinfo/omqs/tools/LayerConfigUtils.kt b/app/src/main/java/com/navinfo/omqs/tools/LayerConfigUtils.kt
index 2349f384..41a96486 100644
--- a/app/src/main/java/com/navinfo/omqs/tools/LayerConfigUtils.kt
+++ b/app/src/main/java/com/navinfo/omqs/tools/LayerConfigUtils.kt
@@ -16,7 +16,7 @@ class LayerConfigUtils {
 
         fun getLayerConfigList(): List<ImportConfig> {
             // 首先读取Shared文件,如果存在则直接返回,否则读取config文件
-            return SPStaticUtils.getString(Constant.LAYER_MANAGER_CONFIG, null).let {
+            return SPStaticUtils.getString(Constant.EVENT_LAYER_MANAGER_CHANGE, null).let {
                 if (this!=null) {
                     val result: List<ImportConfig> = gson.fromJson(it, object : TypeToken<List<ImportConfig>>(){}.type)
                     result
@@ -26,7 +26,7 @@ class LayerConfigUtils {
             }
         }
 
-        fun getLayerConfigListFromAssetsFile(): List<ImportConfig> {
+        private fun getLayerConfigListFromAssetsFile(): List<ImportConfig> {
             val resultList = mutableListOf<ImportConfig>()
             if (omdbConfigFile.exists()) {
                 val omdbConfiStr = FileIOUtils.readFile2String(omdbConfigFile)