diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransform.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransform.kt index de2cc8562e..f37b846bf8 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransform.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/transform/OchTransform.kt @@ -2,7 +2,6 @@ package com.mogo.och.common.module.manager.transform import com.mogo.eagle.core.function.api.och.IOchCommonFunctionCall import com.mogo.eagle.core.function.call.base.CallerBase -import com.mogo.eagle.core.function.call.och.CallerOchFunctionCallManager object OchTransform : CallerBase(),IOchCommonFunctionCall { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneContainerView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneContainerView.kt index 14775ffd39..92b54c1731 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneContainerView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneContainerView.kt @@ -7,6 +7,7 @@ import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.eagle.core.data.enums.Carmodel import com.mogo.eagle.core.function.api.och.IOchFunctionCall +import com.mogo.eagle.core.function.api.och.IOchFunctionCallNotify import com.mogo.eagle.core.function.call.och.CallerOchFunctionCallManager import com.mogo.eagle.core.function.hmi.R import kotlinx.android.synthetic.main.view_bone_container.view.clBoneBiz @@ -17,7 +18,7 @@ class BoneContainerView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr), IOchFunctionCall { +) : ConstraintLayout(context, attrs, defStyleAttr), IOchFunctionCallNotify { companion object{ private const val TAG = "BoneContainerView" @@ -54,13 +55,13 @@ class BoneContainerView @JvmOverloads constructor( this.logOut = logOut } - override fun invokeCarMode(carModel: Carmodel?) { - super.invokeCarMode(carModel) + override fun notifyCarMode(carModel: Carmodel?) { + super.notifyCarMode(carModel) clBoneTab.setCarMode(carModel) } - override fun invokePlateNumber(plateNumber: String?) { - super.invokePlateNumber(plateNumber) + override fun notifyPlateNumber(plateNumber: String?) { + super.notifyPlateNumber(plateNumber) clBoneTab.setCarNo(plateNumber) } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ToolKitTabView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ToolKitTabView.kt index bf66ab0c13..2ea2e4f7ef 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ToolKitTabView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ToolKitTabView.kt @@ -3,22 +3,23 @@ package com.mogo.eagle.core.function.hmi.bone.tab import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater -import android.view.View import androidx.constraintlayout.widget.ConstraintLayout +import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner +import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.GridLayoutManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.bone.toolkit.ToolKitBean import com.mogo.eagle.core.function.hmi.bone.toolkit.ToolKitDataManager -import com.mogo.eagle.core.function.hmi.bone.toolkit.ToolKitDefaultItemView import com.mogo.eagle.core.function.hmi.bone.toolkit.ToolKitListAdapter +import com.mogo.eagle.core.function.hmi.bone.toolkit.ToolKitListDiffCallback import com.mogo.eagle.core.function.hmi.bone.toolkit.ToolKitViewModel +import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.mogo.view.GridSpacingItemDecoration +import com.mogo.eagle.core.utilcode.util.UiThreadHandler import kotlinx.android.synthetic.main.view_tool_kit_tab.view.recyclerView -import kotlinx.coroutines.flow.asFlow import me.jessyan.autosize.utils.AutoSizeUtils -import java.lang.ref.WeakReference class ToolKitTabView @JvmOverloads constructor( context: Context, @@ -31,6 +32,7 @@ class ToolKitTabView @JvmOverloads constructor( } private var viewModel: ToolKitViewModel? = null + private var observer: Observer>? = null init { LayoutInflater.from(context).inflate(R.layout.view_tool_kit_tab, this, true) @@ -43,6 +45,9 @@ class ToolKitTabView @JvmOverloads constructor( override fun onDetachedFromWindow() { super.onDetachedFromWindow() + kotlin.runCatching { + observer?.also { viewModel?.toolKitList?.removeObserver(it) } + } } private fun initView() { @@ -59,12 +64,17 @@ class ToolKitTabView @JvmOverloads constructor( false ) ) + viewModel = findViewTreeViewModelStoreOwner()?.let { + Logger.d(TAG, "findViewTreeViewModelStoreOwner instance=$it") ViewModelProvider(it).get(ToolKitViewModel::class.java) } - viewModel?.toolKitList?.observeForever { data -> + viewModel?.toolKitList?.observeForever(Observer> { data -> + Logger.d(TAG, "new list size== ${data.size}") + val old = adapter.items + val result = DiffUtil.calculateDiff(ToolKitListDiffCallback(old, data)) adapter.items = data - adapter.notifyDataSetChanged() - } + result.dispatchUpdatesTo(adapter) + }.also { observer = it }) } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitDataManager.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitDataManager.kt index 340be81c9b..c99f547520 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitDataManager.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitDataManager.kt @@ -5,9 +5,13 @@ import android.content.Intent import android.os.Process import android.view.View import androidx.fragment.app.FragmentActivity +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.ViewModelStoreOwner import com.mogo.commons.env.ProjectUtils import com.mogo.eagle.core.data.config.FunctionBuildConfig -import com.mogo.eagle.core.function.api.och.IToolKitItemClickListener +import com.mogo.eagle.core.function.api.och.toolkit.IToolKitItemClickListener +import com.mogo.eagle.core.function.api.och.toolkit.ToolKitCustomItemAddParam +import com.mogo.eagle.core.function.api.och.toolkit.ToolKitDefaultItemAddParam import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.bone.toolkit.custom.ToolDriverRomaView @@ -16,6 +20,7 @@ import com.mogo.eagle.core.function.hmi.bone.toolkit.custom.ToolStopServiceView import com.mogo.eagle.core.function.hmi.ui.setting.SopView import com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugView import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.util.ActivityUtils import com.mogo.eagle.core.utilcode.util.NetworkUtils import com.mogo.eagle.core.utilcode.util.ToastUtils @@ -27,7 +32,6 @@ import kotlin.system.exitProcess object ToolKitDataManager : IToolKitItemClickListener { const val TAG = "ToolKitDataManager" - enum class ToolTypeEnum { DEBUG_PANEL, //调试面板 OPERATION_PANEL, //运营面板 @@ -41,6 +45,8 @@ object ToolKitDataManager : IToolKitItemClickListener { private val listeners by lazy { ConcurrentHashMap() } + private var viewModel: ToolKitViewModel? = null + val toolList = ArrayList() fun addListener(tag: String, listener: IToolKitItemClickListener) { @@ -54,12 +60,6 @@ object ToolKitDataManager : IToolKitItemClickListener { listeners.remove(tag) } - fun invokeItemClick(toolTag: String, ctx: Context?) { - listeners.values.forEach { itx -> - itx.onItemClick(toolTag, ctx) - } - } - fun init(ctx: Context) { if (!AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { return @@ -111,6 +111,12 @@ object ToolKitDataManager : IToolKitItemClickListener { } } addListener(TAG, this) + + kotlin.runCatching { + val owner = ctx as? ViewModelStoreOwner + ?: throw IllegalStateException("ctx: $ctx is a instance of ViewModelStoreOwner.") + viewModel = ViewModelProvider(owner).get(ToolKitViewModel::class.java) + } } fun unInit() { @@ -124,9 +130,9 @@ object ToolKitDataManager : IToolKitItemClickListener { /** * 生成默认风格的工具item view(上面icon, 下面名称) */ - private fun getDefaultItemView(context: Context, toolName: String, drawableId: Int): View { + private fun getDefaultItemView(context: Context, toolTitle: String, drawableId: Int): View { return ToolKitDefaultItemView(context).apply { - setData(toolName, drawableId) + setData(toolTitle, drawableId) } } @@ -204,4 +210,94 @@ object ToolKitDataManager : IToolKitItemClickListener { } } } + + fun invokeItemClick(toolTag: String, ctx: Context?) { + listeners.values.forEach { itx -> + itx.onItemClick(toolTag, ctx) + } + } + + private fun getToolKitTags(): Set { + synchronized(toolList) { + return toolList.map { it.toolTag }.toSet() + } + } + + private fun invokeAddSingleToolKitDefaultItem( + ctx: Context, + param: ToolKitDefaultItemAddParam, + toolTags: Set + ) { + Logger.i(TAG, "invokeAddSingleToolKitDefaultItem, param=$param") + if (toolTags.contains(param.toolTag)) { + Logger.i(TAG, "invokeAddSingleToolKitDefaultItem, 重复的toolTag, 不执行添加") + return + } + val position = + if (param.position < 1) 0 else if (param.position > toolTags.size) toolTags.size - 1 else param.position - 1 + val bean = ToolKitBean( + param.toolTag, + getDefaultItemView(ctx, param.toolTitle, param.toolDrawableIcon) + ) + toolList.add(position, bean) + } + + fun invokeAddMultiToolKitDefaultItem( + ctx: Context, + list: ArrayList + ) { + Logger.i(TAG, "invokeAddMultiToolKitDefaultItem, size=${list.size}") + val toolTags = getToolKitTags() + synchronized(toolList) { + list.forEach { + invokeAddSingleToolKitDefaultItem(ctx, it, toolTags) + } + viewModel?.updateToolKitData(toolList) + } + } + + private fun invokeAddSingleToolKitCustomItem( + ctx: Context, + param: ToolKitCustomItemAddParam, + toolTags: Set + ) { + Logger.i(TAG, "invokeAddSingleToolKitCustomItem, param=$param") + if (toolTags.contains(param.toolTag)) { + Logger.i(TAG, "invokeAddSingleToolKitCustomItem, 重复的toolTag, 不执行添加") + return + } + val position = + if (param.position < 1) 0 else if (param.position > toolTags.size) toolTags.size - 1 else param.position - 1 + val bean = ToolKitBean( + param.toolTag, + param.customView + ) + toolList.add(position, bean) + } + + fun invokeAddMultiToolKitCustomItem( + ctx: Context, + list: ArrayList + ) { + Logger.i(TAG, "invokeAddMultiToolKitCustomItem, size=${list.size}") + val toolTags = getToolKitTags() + synchronized(toolList) { + list.forEach { + invokeAddSingleToolKitCustomItem(ctx, it, toolTags) + } + viewModel?.updateToolKitData(toolList) + } + } + + fun invokeGetToolkitAllTags(): Set { + return getToolKitTags() + } + + fun invokeRemoveToolkitByTag(toolTagList: List) { +// synchronized(toolList) { +// val targetList = toolList.filter { toolTagList.contains(it.toolTag) } +// toolList.removeAll(targetList.toSet()) +// viewModel?.updateToolKitData(toolList) +// } + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitListDiffCallback.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitListDiffCallback.kt new file mode 100644 index 0000000000..35558fe34b --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitListDiffCallback.kt @@ -0,0 +1,25 @@ +package com.mogo.eagle.core.function.hmi.bone.toolkit + +import androidx.recyclerview.widget.DiffUtil + +internal class ToolKitListDiffCallback( + private val old: List, + private val update: List +) : DiffUtil.Callback() { + + override fun getOldListSize(): Int = old.size + + override fun getNewListSize(): Int = update.size + + override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + val old = old[oldItemPosition] + val new = update[newItemPosition] + return old == new + } + + override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + val old = old[oldItemPosition] + val new = update[newItemPosition] + return old.toolTag == new.toolTag + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitViewModel.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitViewModel.kt index 52ab892c44..b380b571cb 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitViewModel.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitViewModel.kt @@ -2,6 +2,7 @@ package com.mogo.eagle.core.function.hmi.bone.toolkit import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import com.mogo.eagle.core.utilcode.util.UiThreadHandler class ToolKitViewModel : ViewModel() { val toolKitList: MutableLiveData> = MutableLiveData() @@ -11,6 +12,8 @@ class ToolKitViewModel : ViewModel() { } fun updateToolKitData(newData: ArrayList) { - toolKitList.value = newData + UiThreadHandler.post({ + toolKitList.postValue(newData) + }, UiThreadHandler.MODE.QUEUE) } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt index 7902e2fe49..a4c2ba44e4 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt @@ -5,6 +5,7 @@ import android.text.TextUtils import android.transition.Slide import android.util.Log import android.view.Gravity +import android.view.View import android.view.ViewGroup import android.view.WindowManager import androidx.lifecycle.ProcessLifecycleOwner @@ -29,7 +30,9 @@ import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.function.api.hmi.xiaozhi.event.Event import com.mogo.eagle.core.function.api.hmi.xiaozhi.listener.OnXiaoZhiStateChangeListener import com.mogo.eagle.core.function.api.hmi.xiaozhi.state.State -import com.mogo.eagle.core.function.api.och.IToolKitItemClickListener +import com.mogo.eagle.core.function.api.och.toolkit.IToolKitItemClickListener +import com.mogo.eagle.core.function.api.och.toolkit.ToolKitCustomItemAddParam +import com.mogo.eagle.core.function.api.och.toolkit.ToolKitDefaultItemAddParam import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager import com.mogo.eagle.core.function.call.v2x.CallerTurnLightListenerManager @@ -40,8 +43,8 @@ import com.mogo.eagle.core.function.hmi.ui.lookaround.M1LookAroundView import com.mogo.eagle.core.function.hmi.ui.notice.DispatchDialogManager import com.mogo.eagle.core.function.hmi.ui.notice.NoticeCheckDialog import com.mogo.eagle.core.function.hmi.ui.notice.traffic.NoticeTrafficDialog -import com.mogo.eagle.core.function.hmi.ui.setting.CameraLiveView.Companion.cameraLiveView import com.mogo.eagle.core.function.hmi.ui.operate.OperatePanelLayout +import com.mogo.eagle.core.function.hmi.ui.setting.CameraLiveView.Companion.cameraLiveView import com.mogo.eagle.core.function.hmi.ui.setting.StatusView import com.mogo.eagle.core.function.hmi.ui.setting.ToolsView.Companion.toolsView import com.mogo.eagle.core.function.hmi.ui.tools.AdUpgradeDialog @@ -441,10 +444,6 @@ class MoGoHmiProvider : IMoGoHmiProvider { CallerHmiViewControlListenerManager.invokeGreenWaveDismiss() } - override fun registerToolKitDefaultItemClickListener(tag: String, listener: IToolKitItemClickListener) { - ToolKitDataManager.addListener(TAG, listener) - } - override fun toggleOperatePanel(show: Boolean) { val activity = AppStateManager.currentActivity() if (activity == null) { @@ -474,4 +473,74 @@ class MoGoHmiProvider : IMoGoHmiProvider { operatePanel.get()?.get()?.hide() } } + + override fun addToolKitDefaultItemClickListener(tag: String, listener: IToolKitItemClickListener) { + ToolKitDataManager.addListener(TAG, listener) + } + + /** + * 增加单个默认样式的工具箱item + * @param toolTag 唯一标识tag,和前面toolTag重复的,默认不添加,跳过 + * @param toolTitle 工具名称 + * @param toolDrawableIcon icon drawable 资源文件id + * @param position 在列表中排列位置 (1...N), position大于当前列表size最大值的默认放列表最后 + */ + override fun addSingleToolKitDefaultItem( + toolTag: String, + toolTitle: String, + toolDrawableIcon: Int, + position: Int + ) { + context?.also { ctx -> + ToolKitDataManager.invokeAddMultiToolKitDefaultItem(ctx, ArrayList().also { + it += ToolKitDefaultItemAddParam(toolTag, toolTitle, toolDrawableIcon, position) + }) + } + } + + /** + * 增加多个默认样式的工具箱item + */ + override fun addMultiToolkitDefaultItem(list: ArrayList) { + context?.also { ctx -> + ToolKitDataManager.invokeAddMultiToolKitDefaultItem(ctx, list) + } + } + + /** + * 增加单个自定义样式的工具箱item + * @param toolTag 唯一标识tag,和前面toolTag重复的,默认不添加,跳过 + * @param customView 自定义View + * @param position 在列表中排列位置 (1...N), position大于当前列表size最大值的默认放列表最后 + */ + override fun addSingleToolKitCustomItem(toolTag: String, customView: View, position: Int) { + context?.also { ctx -> + ToolKitDataManager.invokeAddMultiToolKitCustomItem(ctx, ArrayList().also { + it += ToolKitCustomItemAddParam(toolTag, customView, position) + }) + } + } + + /** + * 增加多个自定义样式的工具箱item + */ + override fun addMultiToolkitCustomItem(list: ArrayList) { + context?.also { ctx -> + ToolKitDataManager.invokeAddMultiToolKitCustomItem(ctx, list) + } + } + + /** + * 获取当前所有工具箱中各工具的tag + */ + override fun getToolkitAllTags(): Set { + return ToolKitDataManager.invokeGetToolkitAllTags() + } + + /** + * 根据toolTag 移除工具箱中工具 + */ + override fun removeToolkitByTag(toolTagList: List) { + ToolKitDataManager.invokeRemoveToolkitByTag(toolTagList) + } } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt index 03a1386f87..946f8042da 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.api.hmi.warning +import android.view.View import android.view.ViewGroup import com.alibaba.android.arouter.facade.template.IProvider import com.mogo.eagle.core.data.biz.dispatch.DispatchAdasAutoPilotLocReceiverBean @@ -11,7 +12,9 @@ import com.mogo.eagle.core.data.map.Infrastructure import com.mogo.eagle.core.function.api.hmi.xiaozhi.event.Event import com.mogo.eagle.core.function.api.hmi.xiaozhi.listener.OnXiaoZhiStateChangeListener import com.mogo.eagle.core.function.api.hmi.xiaozhi.state.State -import com.mogo.eagle.core.function.api.och.IToolKitItemClickListener +import com.mogo.eagle.core.function.api.och.toolkit.IToolKitItemClickListener +import com.mogo.eagle.core.function.api.och.toolkit.ToolKitCustomItemAddParam +import com.mogo.eagle.core.function.api.och.toolkit.ToolKitDefaultItemAddParam /** * @author xiaoyuzhou @@ -245,7 +248,44 @@ interface IMoGoHmiProvider :IProvider{ /** * 注册 工具箱 item点击事件监听 (默认样式item的点击事件监听,自定义样式的item的点击交给view自己处理) */ - fun registerToolKitDefaultItemClickListener( tag: String, listener: IToolKitItemClickListener) + fun addToolKitDefaultItemClickListener( tag: String, listener: IToolKitItemClickListener) + + /** + * 增加单个默认样式的工具箱item + * @param toolTag 唯一标识tag,和前面toolTag重复的,默认不添加,跳过 + * @param toolTitle 工具名称 + * @param toolDrawableIcon icon drawable 资源文件id + * @param position 在列表中排列位置 (1...N), position大于当前列表size最大值的默认放列表最后 + */ + fun addSingleToolKitDefaultItem(toolTag: String, toolTitle: String, toolDrawableIcon: Int, position: Int) + + /** + * 增加多个默认样式的工具箱item + */ + fun addMultiToolkitDefaultItem(list: ArrayList) + + /** + * 增加单个自定义样式的工具箱item + * @param toolTag 唯一标识tag,和前面toolTag重复的,默认不添加,跳过 + * @param customView 自定义View + * @param position 在列表中排列位置 (1...N), position大于当前列表size最大值的默认放列表最后 + */ + fun addSingleToolKitCustomItem(toolTag: String, customView: View, position: Int) + + /** + * 增加多个自定义样式的工具箱item + */ + fun addMultiToolkitCustomItem(list: ArrayList) + + /** + * 获取当前所有工具箱中各工具的tag + */ + fun getToolkitAllTags(): Set + + /** + * 根据toolTag 移除工具箱中工具 + */ + fun removeToolkitByTag(toolTagList: List) /** * 显示/隐藏 运营面板 diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/IOchFunctionCall.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/IOchFunctionCall.kt index 9f39cf0d91..d60bc7c78d 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/IOchFunctionCall.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/IOchFunctionCall.kt @@ -1,6 +1,9 @@ package com.mogo.eagle.core.function.api.och -import com.mogo.eagle.core.data.enums.Carmodel +import android.view.View +import com.mogo.eagle.core.function.api.och.toolkit.IToolKitItemClickListener +import com.mogo.eagle.core.function.api.och.toolkit.ToolKitCustomItemAddParam +import com.mogo.eagle.core.function.api.och.toolkit.ToolKitDefaultItemAddParam /** * 定义给 Och 业务层调用的接口 @@ -10,14 +13,56 @@ interface IOchFunctionCall { /** * 注册 工具箱 item点击事件监听 (默认样式item的点击事件监听,自定义样式的item的点击交给view自己处理) */ - fun registerToolKitDefaultItemClickListener(tag: String, listener: IToolKitItemClickListener) {} + fun addToolKitDefaultItemClickListener(tag: String, listener: IToolKitItemClickListener) - fun LoginOut(){} + /** + * 增加单个默认样式的工具箱item + * @param toolTag 唯一标识tag,和前面toolTag重复的,默认不添加,跳过 + * @param toolTitle 工具名称 + * @param toolDrawableIcon icon drawable 资源文件id + * @param position 在列表中排列位置 (1...N), position大于当前列表size最大值的默认放列表最后 + */ + fun addSingleToolKitDefaultItem( + toolTag: String, + toolTitle: String, + toolDrawableIcon: Int, + position: Int + ) { + } - // 车型变化回调 - fun invokeCarMode(carModel: Carmodel?){} + /** + * 增加多个默认样式的工具箱item + */ + fun addMultiToolkitDefaultItem(list: ArrayList) {} - // 车牌变化回调 - fun invokePlateNumber(plateNumber: String?){} + /** + * 增加单个自定义样式的工具箱item + * @param toolTag 唯一标识tag,和前面toolTag重复的,默认不添加,跳过 + * @param customView 自定义View + * @param position 在列表中排列位置 (1...N), position大于当前列表size最大值的默认放列表最后 + */ + fun addSingleToolKitCustomItem(toolTag: String, customView: View, position: Int) {} + + /** + * 增加多个自定义样式的工具箱item + */ + fun addMultiToolkitCustomItem(list: ArrayList) {} + + /** + * 获取当前所有工具箱中各工具的tag + */ + fun getToolkitAllTags(): Set { + return emptySet() + } + + /** + * 根据toolTag 移除工具箱中工具 + */ + fun removeToolkitByTag(toolTagList: List) {} + + /** + * 网约车回调登陆信息 + */ + fun invokeLoginInfo() {} } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/IOchFunctionCallNotify.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/IOchFunctionCallNotify.kt new file mode 100644 index 0000000000..4347ba17c9 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/IOchFunctionCallNotify.kt @@ -0,0 +1,23 @@ +package com.mogo.eagle.core.function.api.och + +import com.mogo.eagle.core.data.enums.Carmodel + +/** + * 定义给 Och 业务层调用的接口后注册监听的接口 + */ +interface IOchFunctionCallNotify { + + /** + * 网约车回调登陆信息 + */ + fun notifyLoginInfo() {} + + // 车型变化回调 + fun notifyCarMode(carModel: Carmodel?){} + + // 车牌变化回调 + fun notifyPlateNumber(plateNumber: String?){} + + fun LoginOut() {} + +} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/toolkit/IToolKitItemClickListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/toolkit/IToolKitItemClickListener.kt new file mode 100644 index 0000000000..8bd788b616 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/toolkit/IToolKitItemClickListener.kt @@ -0,0 +1,10 @@ +package com.mogo.eagle.core.function.api.och.toolkit + +import android.content.Context + +/** + * 工具箱-item点击事件监听 + */ +interface IToolKitItemClickListener { + fun onItemClick(toolTag: String, ctx: Context?) +} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/toolkit/ToolKitCustomItemAddParam.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/toolkit/ToolKitCustomItemAddParam.kt new file mode 100644 index 0000000000..006cb6a2e7 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/toolkit/ToolKitCustomItemAddParam.kt @@ -0,0 +1,12 @@ +package com.mogo.eagle.core.function.api.och.toolkit + +import android.view.View + +/** + * 添加 工具箱 自定义样式item时参数bean + */ +data class ToolKitCustomItemAddParam( + var toolTag: String, //唯一标识tag,和前面toolTag重复的,默认不添加,跳过 + var customView: View, //自定义view + var position: Int //在列表中排列位置 (1...N), position大于当前列表size最大值的默认放列表最后 +) diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/toolkit/ToolKitDefaultItemAddParam.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/toolkit/ToolKitDefaultItemAddParam.kt new file mode 100644 index 0000000000..5ac13bac4d --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/och/toolkit/ToolKitDefaultItemAddParam.kt @@ -0,0 +1,11 @@ +package com.mogo.eagle.core.function.api.och.toolkit + +/** + * 添加 工具箱 默认样式item时参数bean + */ +data class ToolKitDefaultItemAddParam( + var toolTag: String, //唯一标识tag,和前面toolTag重复的,默认不添加,跳过 + var toolTitle: String, // 工具名称 + var toolDrawableIcon: Int, // icon drawable 资源文件id, + var position: Int //在列表中排列位置 (1...N), position大于当前列表size最大值的默认放列表最后 +) diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt index 31c48dbee4..ba417523b3 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt @@ -1,6 +1,7 @@ package com.mogo.eagle.core.function.call.hmi import android.content.Context +import android.view.View import android.view.ViewGroup import com.alibaba.android.arouter.launcher.ARouter import com.mogo.eagle.core.data.biz.dispatch.DispatchAdasAutoPilotLocReceiverBean @@ -16,7 +17,9 @@ import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.function.api.hmi.xiaozhi.event.Event import com.mogo.eagle.core.function.api.hmi.xiaozhi.listener.OnXiaoZhiStateChangeListener import com.mogo.eagle.core.function.api.hmi.xiaozhi.state.State -import com.mogo.eagle.core.function.api.och.IToolKitItemClickListener +import com.mogo.eagle.core.function.api.och.toolkit.IToolKitItemClickListener +import com.mogo.eagle.core.function.api.och.toolkit.ToolKitCustomItemAddParam +import com.mogo.eagle.core.function.api.och.toolkit.ToolKitDefaultItemAddParam /** * @author xiaoyuzhou @@ -33,7 +36,7 @@ object CallerHmiManager { get() = ARouter.getInstance().build(MogoServicePaths.PATH_FRAGMENT_HMI) .navigation() as? IMoGoHmiProvider - fun init(context:Context){ + fun init(context: Context) { hmiProviderApi?.init(context) } @@ -49,7 +52,15 @@ object CallerHmiManager { expireTime: Long = 5000L, isFromObu: Boolean, ) { - hmiProviderApi?.warningV2X(v2xType, alertContent, ttsContent, listenerIMoGo, direction, expireTime, isFromObu) + hmiProviderApi?.warningV2X( + v2xType, + alertContent, + ttsContent, + listenerIMoGo, + direction, + expireTime, + isFromObu + ) } /** @@ -176,7 +187,7 @@ object CallerHmiManager { /** * 云调度重启自驾弹窗 */ - fun showDispatchRestartDialog(msgData: DispatchAdasAutoPilotLocReceiverBean){ + fun showDispatchRestartDialog(msgData: DispatchAdasAutoPilotLocReceiverBean) { hmiProviderApi?.showDispatchRestartDialog(msgData) } @@ -259,56 +270,56 @@ object CallerHmiManager { /** * 展示红绿灯 */ - fun showTrafficLightView(){ + fun showTrafficLightView() { hmiProviderApi?.showTrafficLightView() } /** * 隐藏红绿灯 */ - fun hideTrafficLightView(){ + fun hideTrafficLightView() { hmiProviderApi?.hideTrafficLightView() } /** * 展示转向灯 */ - fun showTurnLightView(){ + fun showTurnLightView() { hmiProviderApi?.showTurnLightView() } /** * 隐藏转向灯 */ - fun hideTurnLightView(){ + fun hideTurnLightView() { hmiProviderApi?.hideTurnLightView() } /** * taxi无人化司机端 是否在执行任务中(无人化模式和算路验证模式 都复用此变量) */ - fun isTaxiUnmanedDriverPerformTask() :Boolean { + fun isTaxiUnmanedDriverPerformTask(): Boolean { return hmiProviderApi?.isTaxiUnmanedDriverPerformTask() ?: false } /** * taxi无人化司机端 是否在接单中 */ - fun isTaxiUnmanedDriverTakingOrders() :Boolean { + fun isTaxiUnmanedDriverTakingOrders(): Boolean { return hmiProviderApi?.isTaxiUnmanedDriverTakingOrders() ?: false } /** * taxi自主算路验证 是否在执行任务中 */ - fun isTaxiUnmanedDriverLineRoutingPerformTask() :Boolean { + fun isTaxiUnmanedDriverLineRoutingPerformTask(): Boolean { return hmiProviderApi?.isTaxiUnmanedDriverLineRoutingPerformTask() ?: false } /** * taxi无人化司机端 是否自主算路验证模式 */ - fun isTaxiUnmanedDriverLineRoutingVerifyMode() :Boolean { + fun isTaxiUnmanedDriverLineRoutingVerifyMode(): Boolean { return hmiProviderApi?.isTaxiUnmanedDriverLineRoutingVerifyMode() ?: false } @@ -316,7 +327,7 @@ object CallerHmiManager { * taxi无人化司机端 设置是否自主算路验证模式 */ fun setTaxiUnmanedDriverLineRoutingVerifyMode(isMode: Boolean) { - hmiProviderApi?.setTaxiUnmanedDriverLineRoutingVerifyMode(isMode) + hmiProviderApi?.setTaxiUnmanedDriverLineRoutingVerifyMode(isMode) } /** @@ -354,17 +365,71 @@ object CallerHmiManager { hmiProviderApi?.dismissGreenWave() } - /** - * 注册 工具箱 item点击事件监听 (默认样式item的点击事件监听,自定义样式的item的点击交给view自己处理) - */ - fun registerToolKitDefaultItemClickListener(tag: String, listener: IToolKitItemClickListener) { - hmiProviderApi?.registerToolKitDefaultItemClickListener(tag, listener) - } - /** * 显示/隐藏 运营面板 */ fun toggleOperatePanel(show: Boolean) { hmiProviderApi?.toggleOperatePanel(show) } + + /** + * 注册 工具箱 item点击事件监听 (默认样式item的点击事件监听,自定义样式的item的点击交给view自己处理) + */ + fun addToolKitDefaultItemClickListener(tag: String, listener: IToolKitItemClickListener) { + hmiProviderApi?.addToolKitDefaultItemClickListener(tag, listener) + } + + /** + * 增加单个默认样式的工具箱item + * @param toolTag 唯一标识tag,和前面toolTag重复的,默认不添加,跳过 + * @param toolTitle 工具名称 + * @param toolDrawableIcon icon drawable 资源文件id + * @param position 在列表中排列位置 (1...N), position大于当前列表size最大值的默认放列表最后 + */ + fun addSingleToolKitDefaultItem( + toolTag: String, + toolTitle: String, + toolDrawableIcon: Int, + position: Int + ) { + hmiProviderApi?.addSingleToolKitDefaultItem(toolTag, toolTitle, toolDrawableIcon, position) + } + + /** + * 增加多个默认样式的工具箱item + */ + fun addMultiToolkitDefaultItem(list: ArrayList) { + hmiProviderApi?.addMultiToolkitDefaultItem(list) + } + + /** + * 增加单个自定义样式的工具箱item + * @param toolTag 唯一标识tag,和前面toolTag重复的,默认不添加,跳过 + * @param customView 自定义View + * @param position 在列表中排列位置 (1...N), position大于当前列表size最大值的默认放列表最后 + */ + fun addSingleToolKitCustomItem(toolTag: String, customView: View, position: Int) { + hmiProviderApi?.addSingleToolKitCustomItem(toolTag, customView, position) + } + + /** + * 增加多个自定义样式的工具箱item + */ + fun addMultiToolkitCustomItem(list: ArrayList) { + hmiProviderApi?.addMultiToolkitCustomItem(list) + } + + /** + * 获取当前所有工具箱中各工具的tag + */ + fun getToolkitAllTags(): Set { + return hmiProviderApi?.getToolkitAllTags() ?: emptySet() + } + + /** + * 根据toolTag 移除工具箱中工具 + */ + fun removeToolkitByTag(toolTagList: List) { + hmiProviderApi?.removeToolkitByTag(toolTagList) + } } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/och/CallerOchFunctionCallManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/och/CallerOchFunctionCallManager.kt index 834301f169..0fa75e4ef2 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/och/CallerOchFunctionCallManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/och/CallerOchFunctionCallManager.kt @@ -1,9 +1,13 @@ package com.mogo.eagle.core.function.call.och +import android.view.View import com.mogo.eagle.core.data.enums.Carmodel import com.mogo.eagle.core.function.api.och.IOchCommonFunctionCall import com.mogo.eagle.core.function.api.och.IOchFunctionCall -import com.mogo.eagle.core.function.api.och.IToolKitItemClickListener +import com.mogo.eagle.core.function.api.och.IOchFunctionCallNotify +import com.mogo.eagle.core.function.api.och.toolkit.IToolKitItemClickListener +import com.mogo.eagle.core.function.api.och.toolkit.ToolKitCustomItemAddParam +import com.mogo.eagle.core.function.api.och.toolkit.ToolKitDefaultItemAddParam import com.mogo.eagle.core.function.call.base.CallerBase import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import kotlin.properties.Delegates @@ -11,40 +15,129 @@ import kotlin.properties.Delegates /** * 实现给 Och 业务层调用的接口 */ -object CallerOchFunctionCallManager : CallerBase() { +object CallerOchFunctionCallManager : CallerBase(), IOchFunctionCall { const val TAG = "CallerOchFunctionCallManager" - override fun doSomeAfterAddListener(tag: String, listener: IOchFunctionCall) { + override fun doSomeAfterAddListener(tag: String, listener: IOchFunctionCallNotify) { super.doSomeAfterAddListener(tag, listener) - listener.invokeCarMode(carModel) - listener.invokePlateNumber(plateNumber) + listener.notifyCarMode(carModel) + listener.notifyPlateNumber(plateNumber) + listener.notifyLoginInfo() } // 车的类型 private var carModel: Carmodel? by Delegates.observable(null) { _, oldValue, newValue -> if (oldValue != newValue) { M_LISTENERS.forEach { - it.value.invokeCarMode(carModel) + it.value.notifyCarMode(carModel) } } } - private var plateNumber:String? by Delegates.observable(null) { _, oldValue, newValue -> + private var plateNumber: String? by Delegates.observable(null) { _, oldValue, newValue -> if (oldValue != newValue) { M_LISTENERS.forEach { - it.value.invokePlateNumber(plateNumber) + it.value.notifyPlateNumber(plateNumber) } } } + private var _ochCallFuncation: IOchCommonFunctionCall? = null + + val ochCallFunction: IOchCommonFunctionCall? + get() = _ochCallFuncation + + fun setOchCommonFunctionCall(caller: IOchCommonFunctionCall) { + this._ochCallFuncation = caller + } + /** * 注册 工具箱 item点击事件监听 (默认样式item的点击事件监听,自定义样式的item的点击交给view自己处理) */ - fun toolKitDefaultItemClickListener( + override fun addToolKitDefaultItemClickListener( tag: String, listener: IToolKitItemClickListener ) { - CallerHmiManager.registerToolKitDefaultItemClickListener(tag, listener) + CallerHmiManager.addToolKitDefaultItemClickListener(tag, listener) + } + + /** + * 增加单个默认样式的工具箱item + * @param toolTag 唯一标识tag,和前面toolTag重复的,默认不添加,跳过 + * @param toolTitle 工具名称 + * @param toolDrawableIcon icon drawable 资源文件id + * @param position 在列表中排列位置 (1...N), position大于当前列表size最大值的默认放列表最后 + */ + override fun addSingleToolKitDefaultItem( + toolTag: String, + toolTitle: String, + toolDrawableIcon: Int, + position: Int + ) { + CallerHmiManager.addSingleToolKitDefaultItem( + toolTag, + toolTitle, + toolDrawableIcon, + position + ) + } + + /** + * 增加多个默认样式的工具箱item + */ + override fun addMultiToolkitDefaultItem(list: ArrayList) { + CallerHmiManager.addMultiToolkitDefaultItem(list) + } + + /** + * 增加单个自定义样式的工具箱item + * @param toolTag 唯一标识tag,和前面toolTag重复的,默认不添加,跳过 + * @param customView 自定义View + * @param position 在列表中排列位置 (1...N), position大于当前列表size最大值的默认放列表最后 + */ + override fun addSingleToolKitCustomItem(toolTag: String, customView: View, position: Int) { + CallerHmiManager.addSingleToolKitCustomItem(toolTag, customView, position) + } + + /** + * 增加多个自定义样式的工具箱item + */ + override fun addMultiToolkitCustomItem(list: ArrayList) { + CallerHmiManager.addMultiToolkitCustomItem(list) + } + + /** + * 获取当前所有工具箱中各工具的tag + */ + override fun getToolkitAllTags(): Set { + return CallerHmiManager.getToolkitAllTags() + } + + /** + * 根据toolTag 移除工具箱中工具 + */ + override fun removeToolkitByTag(toolTagList: List) { + //CallerHmiManager.removeToolkitByTag(toolTagList) + } + + /** + * 车型 E70 H9 B1 B2 M1 金旅牌XML6606JEVY0(小巴车) NJL6450ICEV(小巴) BJ5122TXSEV-H1(环卫车) + */ + fun setOchCarModel(carModel: Carmodel) { + this.carModel = carModel + } + + // 车牌 + fun setOchPlateNumber(plateNumber: String?) { + this.plateNumber = plateNumber + } + + + override fun invokeLoginInfo() { + M_LISTENERS.forEach { + val listener = it.value + listener.notifyLoginInfo() + } } fun invokeLoginOut(){ @@ -52,14 +145,4 @@ object CallerOchFunctionCallManager : CallerBase() { it.value.LoginOut() } } - - // 车型 E70 H9 B1 B2 M1 金旅牌XML6606JEVY0(小巴车) NJL6450ICEV(小巴) BJ5122TXSEV-H1(环卫车) - fun setOchCarModel(carModel: Carmodel) { - this.carModel = carModel - } - // 车牌 - fun setOchPlateNumber(plateNumber:String?){ - this.plateNumber = plateNumber - } - } \ No newline at end of file