diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/constant/OchCommonConst.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/constant/OchCommonConst.kt index 4c30321280..a57266e728 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/constant/OchCommonConst.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/constant/OchCommonConst.kt @@ -59,5 +59,7 @@ class OchCommonConst { // 自动驾驶自动规划的最大距离 const val AUTOMATIC_PLANNING_MAX_DISTANCE = 15 + + const val ARRIVE_AT_END_STATION_DISTANCE = 10 } } \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotManager.kt index d985b04ab3..9da319e419 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotManager.kt @@ -69,8 +69,8 @@ object OchAutoPilotManager : IMoGoReceiveReceivedAckListener, IMoGoFsm2024Listen fun canStartAutoPilotSSM(): Boolean { if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().autopilotAbilityStatus) { val reasons = OCHAdasAbilityManager.getInstance().unableAutopilotReasons - if ("AutopilotAbility440" == OCHAdasAbilityManager.getInstance().abilityVersion && !reasons.isNullOrEmpty()) { - val msg = reasons[0].unableLaunchReason + " 来源:" + reasons[0].source + if ("AutopilotAbilityFSM" == OCHAdasAbilityManager.getInstance().abilityVersion && !reasons.isNullOrEmpty()) { + val msg = reasons[0].getUnableLaunchReason() + " 来源:" + reasons[0].source CallerMsgBoxManager.saveMsgBox( MsgBoxBean( MsgBoxType.AUTOPILOT, @@ -95,7 +95,6 @@ object OchAutoPilotManager : IMoGoReceiveReceivedAckListener, IMoGoFsm2024Listen @JvmStatic fun startAutoPilot(controlParameters: AutopilotControlParameters?): Long { val sessionId = CallerAutoPilotControlManager.startAutoPilot(controlParameters) - LineManager.isReStartAutopilot = false globalSessionId.set(sessionId) fsmBackSessionId.set(-1L) OchAutopilotAnalytics.triggerStartAutopilotParameters(controlParameters, sessionId) diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotStatusListenerManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotStatusListenerManager.kt index 441363f1de..fbc81bca6e 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotStatusListenerManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotStatusListenerManager.kt @@ -6,11 +6,13 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.util.StringUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.och.common.module.R import com.mogo.och.common.module.manager.autopilot.autopilot.bean.ArrivedStation import com.mogo.och.common.module.manager.autopilot.line.LineManager import com.mogo.och.common.module.manager.autopilot.trajectory.TrajectoryManager +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.utils.CallerBase import com.zhjt.mogo.adas.data.AdasConstants import com.zhjt.mogo.adas.data.bean.MogoReport @@ -51,10 +53,12 @@ object OchAutoPilotStatusListenerManager : CallerBase() { */ private var endStation: BusStationBean? = null - var isReStartAutopilot = true + var isFirstStartAutopilot = true + + private var orderId = "" + + // 自车定位 + private val mMapLocationListener = object : IMoGoChassisLocationGCJ02Listener { + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + if (null == mogoLocation) return + getStations { start, end -> + val startLon = end.gcjLon + val startLat = end.gcjLat + val distance = CoordinateUtils.calculateLineDistance( + startLon, startLat, + mogoLocation.longitude, mogoLocation.latitude + ) + if (distance <= OchCommonConst.ARRIVE_AT_END_STATION_DISTANCE) { + val token = CallerAutoPilotControlManager.sendSsmFuncQueryAutoPilotStation(orderId) + OchChainLogManager.writeChainLogAutopilot("到站逻辑","距离站点:$distance 请求token:$token") + } + } + } + } + + + fun invokeArrivedStation(orderId: String, arrivedStationFlag: Boolean) { + if (this.orderId==orderId&&arrivedStationFlag){ + M_LISTENERS.forEach { + it.value.arrivedStationSuccessBySearch() + } + } + } + + fun invokeSetIsFirstAutopilot(orderId: String?, firstAutopilotFlag: Boolean, count: Int) { + if (this.orderId==orderId){ + if(count>=1){ + isFirstStartAutopilot = false + }else{ + isFirstStartAutopilot = true + } + } + } /** * 设置站点信息 */ fun setStartAndEndStation(startStation: BusStationBean?, endStation: BusStationBean?) { if(this.startStation!=startStation||this.endStation!=endStation){ - isReStartAutopilot = true + isFirstStartAutopilot = true } this.startStation = startStation this.endStation = endStation @@ -197,11 +241,19 @@ object LineManager : CallerBase() { endStationLocation.latitude = end.gcjLat endStationLocation.longitude = end.gcjLon TrajectoryAndDistanceManager.setStationPoint(startStationLocation, endStationLocation, lineInfo.lineId) + OchLocationManager.addGCJ02Listener(TAG,1,mMapLocationListener) + // 恢复启动自驾信息 + searchAutopilotState() } } + fun searchAutopilotState(){ + CallerAutoPilotControlManager.sendSsmFuncQueryAutoPilotInfo() + } private fun clearAutopilotControlParameters(){ CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(null) TrajectoryAndDistanceManager.setStationPoint(null, null, null) + this.orderId = "" + OchLocationManager.removeGCJ02Listener(TAG) } fun hasDrawnGlobalTrajectory(): Boolean { @@ -245,6 +297,9 @@ object LineManager : CallerBase() { parameters?.startLatLon = AutoPilotLonLat(start.lat, start.lon) parameters?.endLatLon = AutoPilotLonLat(end.lat, end.lon) parameters?.vehicleType = 10 + this.orderId = "${lineInfo.lineId}_${start.siteId}_${end.siteId}" + parameters?.orderId = this.orderId + parameters?.firstAutopilotFlag = isFirstStartAutopilot if (parameters?.autoPilotLine == null) { parameters?.autoPilotLine = AutoPilotLine( @@ -334,7 +389,7 @@ object LineManager : CallerBase() { M_BUS + TAG, "行程日志-开启自动驾驶====" + GsonUtil.jsonFromObject(parameters) + " startLatLon=" + parameters.startName + ",endLatLon=" + parameters.endName + - "isRestart = " + LineManager.isReStartAutopilot + "isRestart = " + LineManager.isFirstStartAutopilot ) M_LISTENERS.forEach { @@ -354,7 +409,7 @@ object LineManager : CallerBase() { fun triggerStartServiceEvent(send: Boolean,source:Int) { getStationsWithLine { start, end, lineInfo -> OchAutopilotAnalytics.triggerStartAutopilotEvent( - isReStartAutopilot, + isFirstStartAutopilot, send, start.name, end.name, diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/biz/OperationalInfoGatewayView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/biz/OperationalInfoGatewayView.kt new file mode 100644 index 0000000000..c548b06851 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/biz/OperationalInfoGatewayView.kt @@ -0,0 +1,48 @@ +package com.mogo.och.common.module.wigets.biz + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.och.common.module.R +import com.mogo.och.common.module.utils.ResourcesUtils +import kotlinx.android.synthetic.main.common_line_view.view.iv_toolkit_item_head +import kotlinx.android.synthetic.main.common_line_view.view.iv_toolkit_item_title + +/** + * + */ +class OperationalInfoGatewayView : ConstraintLayout { + + private val TAG = "LineView" + + constructor(context: Context) : super(context) + + constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super( + context, + attributeSet, + defStyleAttr + ) + + private fun initView() { + LayoutInflater.from(context).inflate(R.layout.common_line_view, this, true) + iv_toolkit_item_head.setImageResource(R.drawable.common_biz_operation) + iv_toolkit_item_title.text = ResourcesUtils.getString(R.string.common_operation) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + } + + init { + try { + initView() + } catch (e: Exception) { + e.printStackTrace() + } + } + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/drawline/LineView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/drawline/LineView.kt index d7f9262861..7515dcdc06 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/drawline/LineView.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/drawline/LineView.kt @@ -2,18 +2,22 @@ package com.mogo.och.common.module.wigets.map.drawline import android.content.Context import android.util.AttributeSet -import androidx.appcompat.widget.AppCompatImageView +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.och.common.module.R import com.mogo.och.common.module.manager.autopilot.line.LineManager +import com.mogo.och.common.module.utils.ResourcesUtils +import kotlinx.android.synthetic.main.common_line_view.view.iv_toolkit_item_head +import kotlinx.android.synthetic.main.common_line_view.view.iv_toolkit_item_title /** * */ -class LineView : AppCompatImageView, LineViewModel.ILineViewCallback { +class LineView : ConstraintLayout, LineViewModel.ILineViewCallback { private val TAG = "LineView" @@ -28,7 +32,9 @@ class LineView : AppCompatImageView, LineViewModel.ILineViewCallback { ) private fun initView() { - setImageResource(R.drawable.common_map_line_close) + LayoutInflater.from(context).inflate(R.layout.common_line_view, this, true) + iv_toolkit_item_head.setImageResource(R.drawable.common_map_line_close) + iv_toolkit_item_title.text = ResourcesUtils.getString(R.string.common_line_info) } override fun onAttachedToWindow() { @@ -62,7 +68,7 @@ class LineView : AppCompatImageView, LineViewModel.ILineViewCallback { } override fun setImageViewResource(name: Int) { - setImageResource(name) + iv_toolkit_item_head.setImageResource(name) } diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_biz_operation.png b/OCH/common/common/src/main/res/drawable-nodpi/common_biz_operation.png new file mode 100644 index 0000000000..743141bc95 Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/common_biz_operation.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_map_line_close.png b/OCH/common/common/src/main/res/drawable-nodpi/common_map_line_close.png old mode 100644 new mode 100755 index 4187e3ddbd..febf573bb2 Binary files a/OCH/common/common/src/main/res/drawable-nodpi/common_map_line_close.png and b/OCH/common/common/src/main/res/drawable-nodpi/common_map_line_close.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_map_line_open.png b/OCH/common/common/src/main/res/drawable-nodpi/common_map_line_open.png old mode 100644 new mode 100755 index 8bfc10bae6..cbf5dcc770 Binary files a/OCH/common/common/src/main/res/drawable-nodpi/common_map_line_open.png and b/OCH/common/common/src/main/res/drawable-nodpi/common_map_line_open.png differ diff --git a/OCH/common/common/src/main/res/layout/common_line_view.xml b/OCH/common/common/src/main/res/layout/common_line_view.xml new file mode 100644 index 0000000000..2a223a80d9 --- /dev/null +++ b/OCH/common/common/src/main/res/layout/common_line_view.xml @@ -0,0 +1,36 @@ + + + + + + + + \ No newline at end of file diff --git a/OCH/common/common/src/main/res/values/strings.xml b/OCH/common/common/src/main/res/values/strings.xml index 825d744df0..587ebe9d52 100644 --- a/OCH/common/common/src/main/res/values/strings.xml +++ b/OCH/common/common/src/main/res/values/strings.xml @@ -7,6 +7,9 @@ START 启动失败 + 车道指引 + 运营看板 + 欢迎您登录 登录 获取验证码 diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/OrderModel.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/OrderModel.kt index f915feba4d..726b0816c4 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/OrderModel.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/OrderModel.kt @@ -18,6 +18,7 @@ import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.manager.autopilot.autopilot.bean.ArrivedStation +import com.mogo.och.common.module.manager.autopilot.line.ILineCallback import com.mogo.och.common.module.manager.autopilot.line.LineManager import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager @@ -73,8 +74,8 @@ object OrderModel { // 加载核销模块 TicketModel.load() - // 定位监听 - OchLocationManager.addGCJ02Listener(TAG, 5, mMapLocationListener) + + LineManager.addListener(TAG,arriveStationBySearch) OchTransform.addListener(TAG,ochTransform) @@ -89,7 +90,7 @@ object OrderModel { TicketModel.release() - OchLocationManager.removeGCJ02Listener(TAG) + LineManager.removeListener(TAG) OchTransform.removeListener(TAG) } @@ -107,34 +108,17 @@ object OrderModel { // 自车定位 - private val mMapLocationListener = object : IMoGoChassisLocationGCJ02Listener { - override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { - if (null == mogoLocation) return - + private val arriveStationBySearch = object : ILineCallback { + override fun arrivedStationSuccessBySearch() { //是否到站的围栏判断 离站状态并且自动驾驶还未触发到站 if (isGoingToNextStation && !isArrivedStation) { OCHThreadPoolManager.getsInstance().locationExecute { - judgeArrivedStation(mogoLocation) + onArriveAt(null, "兜底:根据定位计算到站") } } } } - //根据围栏判断,是否到达站点 - private fun judgeArrivedStation(location: MogoLocation) { - LineManager.getStations { start, end -> - val startLon = end.gcjLon - val startLat = end.gcjLat - val distance = CoordinateUtils.calculateLineDistance( - startLon, startLat, - location.longitude, location.latitude - ) - if (distance <= BusConst.ARRIVE_AT_END_STATION_DISTANCE) { - d(M_BUS + TAG, "行程日志-judgeArrivedStation() distance = $distance to ${end.name}") - onArriveAt(null, "兜底:根据定位计算到站") - } - } - } /** * 查询小巴路线 diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/fragment/ShuttleFragment.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/fragment/ShuttleFragment.kt index 03520387e9..f2ab0199b7 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/fragment/ShuttleFragment.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/fragment/ShuttleFragment.kt @@ -1,5 +1,6 @@ package com.mogo.och.weaknet.ui.fragment +import android.content.Context import android.graphics.BitmapFactory import android.os.Bundle import android.view.LayoutInflater @@ -10,11 +11,14 @@ import com.mogo.commons.mvp.MvpFragment import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.temp.EventLogout +import com.mogo.eagle.core.function.api.och.toolkit.IToolKitItemClickListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager +import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.och.common.module.utils.createQRCodeWithPicture import com.mogo.och.common.module.wigets.BindQRCodeDialog +import com.mogo.och.common.module.wigets.map.drawline.LineView import com.mogo.och.shuttle.weaknet.R import com.mogo.och.weaknet.ui.bizswitch.SwitchBizView import com.mogo.och.weaknet.ui.taskrunned.RunningTaskManager @@ -35,6 +39,11 @@ import org.greenrobot.eventbus.ThreadMode */ class ShuttleFragment : MvpFragment() { + + private val runningTaskGateWay = "RUNNINGTASKGATEWAY" + private val lineView = "LINEVIEW" + + override fun getLayoutId(): Int { return R.layout.shuttle_weak_base_fragment } @@ -47,6 +56,15 @@ class ShuttleFragment : MvpFragment() { context?.let { boneContainerView.addBizView(SwitchBizView(it)) + + CallerEagleBaseFunctionCall4OchManager.addSingleToolKitDefaultItem(runningTaskGateWay,"本地缓存任务", R.drawable.bus_running_task_history,4) + CallerEagleBaseFunctionCall4OchManager.addToolKitDefaultItemClickListener(runningTaskGateWay,object : + IToolKitItemClickListener{ + override fun onItemClick(toolTag: String, ctx: Context?) { + RunningTaskManager.showBadCaseConfigWindow(it) + } + }) + CallerEagleBaseFunctionCall4OchManager.addSingleToolKitCustomItem(lineView, LineView(it),10) } initListener() diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunned/RunningTaskGatewayView.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunned/RunningTaskGatewayView.kt new file mode 100644 index 0000000000..cbd692abb6 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunned/RunningTaskGatewayView.kt @@ -0,0 +1,53 @@ +package com.mogo.och.weaknet.ui.taskrunned + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.ImageView +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.och.common.module.utils.ResourcesUtils +import com.mogo.och.shuttle.weaknet.R + +/** + * + */ +class RunningTaskGatewayView : ConstraintLayout { + + private val TAG = "LineView" + + constructor(context: Context) : super(context) + + constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super( + context, + attributeSet, + defStyleAttr + ) + + private fun initView() { + LayoutInflater.from(context).inflate(R.layout.common_line_view, this, true) + findViewById(R.id.iv_toolkit_item_head).setImageResource(R.drawable.bus_running_task_history) + findViewById(R.id.iv_toolkit_item_title).text = ResourcesUtils.getString(R.string.bus_running_tasked_gateway) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + + onClick { + RunningTaskManager.showBadCaseConfigWindow(context) + } + + } + + init { + try { + initView() + } catch (e: Exception) { + e.printStackTrace() + } + } + +} \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/res/drawable-nodpi/bus_running_task_history.png b/OCH/shuttle/driver_weaknet/src/main/res/drawable-nodpi/bus_running_task_history.png new file mode 100644 index 0000000000..40f08dc381 Binary files /dev/null and b/OCH/shuttle/driver_weaknet/src/main/res/drawable-nodpi/bus_running_task_history.png differ diff --git a/OCH/shuttle/driver_weaknet/src/main/res/values/strings.xml b/OCH/shuttle/driver_weaknet/src/main/res/values/strings.xml index 44dd954a8d..66a8b9e181 100644 --- a/OCH/shuttle/driver_weaknet/src/main/res/values/strings.xml +++ b/OCH/shuttle/driver_weaknet/src/main/res/values/strings.xml @@ -60,6 +60,7 @@ 距离发车时间还有%1$s分钟 平行驾驶 + 本地缓存任务 diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java index a8d88edf6b..b4482c5db0 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java @@ -3,6 +3,7 @@ package com.mogo.och.taxi.ui; import static com.mogo.och.taxi.constant.TaxiConst.TIMER_START_AUTOPILOT_INTERVAL; import android.animation.ObjectAnimator; +import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -15,6 +16,7 @@ import android.widget.RelativeLayout; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.Group; import androidx.fragment.app.FragmentTransaction; @@ -23,10 +25,12 @@ import com.mogo.commons.mvp.IView; import com.mogo.commons.mvp.MvpFragment; import com.mogo.commons.mvp.Presenter; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; +import com.mogo.eagle.core.function.api.och.toolkit.IToolKitItemClickListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager; import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; +import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchManager; import com.mogo.eagle.core.function.hmi.map.MapContainerLayout; import com.mogo.eagle.core.function.view.MapRoamView; import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener; @@ -34,12 +38,14 @@ import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.listener.IMogoMapListener; import com.mogo.och.common.module.utils.ResourcesUtils; +import com.mogo.och.common.module.wigets.map.drawline.LineView; import com.mogo.och.common.module.wigets.map.orderstatus.OrderStatusView; import com.mogo.och.common.module.wigets.map.overmapview.OverMapDialog; -import com.mogo.och.common.module.wigets.map.switchvisual.VisualViewDirver; import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager; import com.mogo.och.taxi.R; +import java.lang.ref.WeakReference; + import me.jessyan.autosize.utils.AutoSizeUtils; @@ -60,11 +66,11 @@ public abstract class BaseTaxiTabFragment personalDialogFragment = null; + + @Override protected int getLayoutId() { return R.layout.taxi_base_fragment; @@ -90,15 +103,15 @@ public abstract class BaseTaxiTabFragment { - if (groupTestPanel.getVisibility() == View.VISIBLE) { - groupTestPanel.setVisibility(View.GONE); - } else { - groupTestPanel.setVisibility(View.VISIBLE); - } - return false; - }); +// mSpeedView.setOnLongClickListener(v -> { +// if (groupTestPanel.getVisibility() == View.VISIBLE) { +// groupTestPanel.setVisibility(View.GONE); +// } else { +// groupTestPanel.setVisibility(View.VISIBLE); +// } +// return false; +// }); CallerHmiViewControlListenerManager.INSTANCE.invokeMainPageViewVisible(View.VISIBLE); onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getState(), CallerAutoPilotControlManager.INSTANCE.isCanStartAutopilot(false, 0)); @@ -176,6 +189,19 @@ public abstract class BaseTaxiTabFragment(new TaxiPersonalDialogFragment()); + personalDialogFragment.get().show(getActivity().getSupportFragmentManager(), "service_data"); + } + }); + CallerEagleBaseFunctionCall4OchManager.INSTANCE.addSingleToolKitCustomItem(lineView, new LineView(getContext()),10); + } + } @Override @@ -233,7 +259,6 @@ public abstract class BaseTaxiTabFragment serverOrdersFragmentWR; - // 查看运营情况 点击账户信息右边的箭头展示 - private WeakReference personalDialogFragment = null; @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { @@ -366,16 +364,12 @@ public class TaxiFragment extends BaseTaxiTabFragment(new TaxiPersonalDialogFragment()); - personalDialogFragment.get().show(getActivity().getSupportFragmentManager(), "service_data"); - } private void testRouteInfoUpload() { TPRouteDataTestUtils.converToRouteData(); diff --git a/OCH/taxi/driver/src/main/res/layout/taxi_base_fragment.xml b/OCH/taxi/driver/src/main/res/layout/taxi_base_fragment.xml index a0e95a7398..730ca8ec3d 100644 --- a/OCH/taxi/driver/src/main/res/layout/taxi_base_fragment.xml +++ b/OCH/taxi/driver/src/main/res/layout/taxi_base_fragment.xml @@ -219,14 +219,14 @@ app:layout_constraintTop_toBottomOf="@+id/module_mogo_och_autopilot_status" tools:visibility="visible" /> - + + + + + + + + --> - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/BaseTaxiTabFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/BaseTaxiTabFragment.kt index 2249eba786..b1444dc508 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/BaseTaxiTabFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/BaseTaxiTabFragment.kt @@ -2,6 +2,7 @@ package com.mogo.och.unmanned.taxi.ui.base import android.animation.ObjectAnimator import android.annotation.SuppressLint +import android.content.Context import android.content.Intent import android.os.Bundle import android.view.LayoutInflater @@ -16,11 +17,13 @@ import com.mogo.commons.mvp.MvpFragment import com.mogo.commons.mvp.Presenter import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.och.toolkit.IToolKitItemClickListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getState import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager +import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchManager import com.mogo.eagle.core.function.hmi.ui.widget.ParallelDriveView import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener @@ -29,6 +32,7 @@ import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.map.listener.IMogoMapListener import com.mogo.map.uicontroller.VisualAngleMode import com.mogo.och.common.module.wigets.StartAutopilotAnimationView +import com.mogo.och.common.module.wigets.map.drawline.LineView import com.mogo.och.common.module.wigets.map.overmapview.OverMapDialog import com.mogo.och.unmanned.taxi.R import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst @@ -36,6 +40,7 @@ import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst.Companion.START_AUT import com.mogo.och.unmanned.taxi.ui.debug.DebugView import com.mogo.och.unmanned.taxi.ui.navi.amap.TaxiAmapNaviFragment import com.mogo.och.unmanned.taxi.ui.navi.auto.TaxiRoutingNaviFragment +import com.mogo.och.unmanned.taxi.ui.operational.TaxiOperationalDialogFragment import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.aciv_show_guid import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.groupTestPanel import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.mapBizView @@ -50,6 +55,8 @@ import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.parallelDriveV import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.smallMapView import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.startAutopilotAnimationView import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.taxi_close_navi_icon +import java.lang.ref.WeakReference + /** * @author: wangmingjun * @date: 2023/7/24 @@ -70,6 +77,12 @@ abstract class BaseTaxiTabFragment> : MvpFragment? = null + + override fun getLayoutId(): Int { return R.layout.unmanned_taxi_base_fragment } @@ -184,6 +197,20 @@ abstract class BaseTaxiTabFragment> : MvpFragment(), } private var taskTabFragment: WeakReference? = null - private var personalDialogFragment: WeakReference? = null + private var routingVerifyFragment: WeakReference? = null private var moFanglistener: IMogoStatusChangedListener? = object :IMogoStatusChangedListener{ @@ -76,19 +76,11 @@ class TaxiFragment : BaseTaxiTabFragment(), @Subscribe(threadMode = ThreadMode.MAIN) fun openOperationalInfoView(eventLogout: EventLogout) { // V6.2.0 增加订单统计功能 - if (eventLogout.messgae == EventLogout.PERSONAL_TYPE) { -// 个人信息, 运营数据在无人化阶段暂时不展示 - d(SceneConstant.M_TAXI + TAG, "openOperationalInfoView Event个人中心") - openOperationalInfoView() - } - } - - private fun openOperationalInfoView() { - personalDialogFragment = WeakReference(TaxiOperationalDialogFragment()) - activity?.supportFragmentManager?.let { - personalDialogFragment!!.get() - ?.show(it, "service_data") - } +// if (eventLogout.messgae == EventLogout.PERSONAL_TYPE) { +//// 个人信息, 运营数据在无人化阶段暂时不展示 +// d(SceneConstant.M_TAXI + TAG, "openOperationalInfoView Event个人中心") +// openOperationalInfoView() +// } } override fun getTagName(): String { diff --git a/app/src/androidTest/java/com/mogo/functions/test/TestAutoPilotBeforeLaunch.kt b/app/src/androidTest/java/com/mogo/functions/test/TestAutoPilotBeforeLaunch.kt index 375f4da20b..8d245345cc 100644 --- a/app/src/androidTest/java/com/mogo/functions/test/TestAutoPilotBeforeLaunch.kt +++ b/app/src/androidTest/java/com/mogo/functions/test/TestAutoPilotBeforeLaunch.kt @@ -15,8 +15,8 @@ import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02Lis import com.mogo.eagle.core.function.call.autopilot.CallerChassisStatesListenerManager import com.mogo.eagle.core.function.main.MainLauncherActivity import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.zhjt.mogo.adas.data.bean.MogoReport import com.zhjt.mogo.adas.data.bean.LaunchConditionData +import com.zhjt.mogo.adas.data.bean.MogoReport import com.zhjt.mogo.adas.data.bean.UnableLaunchReason import com.zhjt.mogo.adas.data.bean.UnableLaunchReason.SourceType.CHASSIS import com.zhjt.mogo.adas.data.bean.UnableLaunchReason.UnableType.CHASSIS_BRAKE @@ -154,7 +154,12 @@ class TestAutoPilotBeforeLaunch { .setRemotePilotReady(false).build(), FSMStatusReasonRespond.getDefaultInstance() ), ArrayList().also { - it += UnableLaunchReason(CHASSIS, CHASSIS_GEAR, "gear") + it += UnableLaunchReason(CHASSIS, CHASSIS_GEAR, + object : ArrayList() { + init { + add("gear") + } + }) }) } @@ -169,7 +174,12 @@ class TestAutoPilotBeforeLaunch { .setRemotePilotReady(false).build(), FSMStatusReasonRespond.getDefaultInstance() ), ArrayList().also { - it += UnableLaunchReason(CHASSIS, CHASSIS_STEERING, "steering") + it += UnableLaunchReason(CHASSIS, CHASSIS_STEERING, + object : ArrayList() { + init { + add("steering") + } + }) }) } @@ -185,7 +195,12 @@ class TestAutoPilotBeforeLaunch { .setRemotePilotReady(false).build(), FSMStatusReasonRespond.getDefaultInstance() ), ArrayList().also { - it += UnableLaunchReason(CHASSIS, CHASSIS_BRAKE, "brake") + it += UnableLaunchReason(CHASSIS, CHASSIS_BRAKE, + object : ArrayList() { + init { + add("brake") + } + }) }) } @@ -200,7 +215,12 @@ class TestAutoPilotBeforeLaunch { .setRemotePilotReady(false).build(), FSMStatusReasonRespond.getDefaultInstance() ), ArrayList().also { - it += UnableLaunchReason(CHASSIS, CHASSIS_HAZARD_LIGHTS, "lights") + it += UnableLaunchReason(CHASSIS, CHASSIS_HAZARD_LIGHTS, + object : ArrayList() { + init { + add("lights") + } + }) }) } @@ -215,7 +235,12 @@ class TestAutoPilotBeforeLaunch { .setRemotePilotReady(false).build(), FSMStatusReasonRespond.getDefaultInstance() ), ArrayList().also { - it += UnableLaunchReason(CHASSIS, CHASSIS_THROTTLE, "throttle") + it += UnableLaunchReason(CHASSIS, CHASSIS_THROTTLE, + object : ArrayList() { + init { + add("throttle") + } + }) }) } @@ -230,11 +255,36 @@ class TestAutoPilotBeforeLaunch { .setRemotePilotReady(false).build(), FSMStatusReasonRespond.getDefaultInstance() ), ArrayList().also { - it += UnableLaunchReason(CHASSIS, CHASSIS_GEAR, "gear") - it += UnableLaunchReason(CHASSIS, CHASSIS_STEERING, "steering") - it += UnableLaunchReason(CHASSIS, CHASSIS_HAZARD_LIGHTS, "lights") - it += UnableLaunchReason(CHASSIS, CHASSIS_THROTTLE, "throttle") - it += UnableLaunchReason(CHASSIS, CHASSIS_BRAKE, "brake") + it += UnableLaunchReason(CHASSIS, CHASSIS_GEAR, + object : ArrayList() { + init { + add("gear") + } + }) + it += UnableLaunchReason(CHASSIS, CHASSIS_STEERING, + object : ArrayList() { + init { + add("steering") + } + }) + it += UnableLaunchReason(CHASSIS, CHASSIS_HAZARD_LIGHTS, + object : ArrayList() { + init { + add("lights") + } + }) + it += UnableLaunchReason(CHASSIS, CHASSIS_THROTTLE, + object : ArrayList() { + init { + add("throttle") + } + }) + it += UnableLaunchReason(CHASSIS, CHASSIS_BRAKE, + object : ArrayList() { + init { + add("brake") + } + }) }) } CallerAutoPilotControlManager.isCanStartAutopilot(true) diff --git a/app/src/androidTest/java/com/mogo/functions/test/V2NTest.kt b/app/src/androidTest/java/com/mogo/functions/test/V2NTest.kt index 78f15e375f..7987fb199f 100644 --- a/app/src/androidTest/java/com/mogo/functions/test/V2NTest.kt +++ b/app/src/androidTest/java/com/mogo/functions/test/V2NTest.kt @@ -58,12 +58,12 @@ class V2NTest { if (millis > 0) { delay(millis) } - FunctionBuildConfig.isNewV2NData = true - FunctionBuildConfig.v2nMainSwitch = true + FunctionBuildConfig.v2nNewLinked = true + FunctionBuildConfig.v2nTotalSwitch = true runCatching { val map = HashMap().also { - it["f1"] = FunctionBuildConfig.v2nMainSwitch - it["f2"] = FunctionBuildConfig.isNewV2NData + it["f1"] = FunctionBuildConfig.v2nTotalSwitch + it["f2"] = FunctionBuildConfig.v2nNewLinked } CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_NEW_LINK_SWITCH, GsonUtils.toJson(map).toByteArray()) } @@ -99,12 +99,12 @@ class V2NTest { if (millis > 0) { delay(millis) } - FunctionBuildConfig.isNewV2NData = true - FunctionBuildConfig.v2nMainSwitch = true + FunctionBuildConfig.v2nNewLinked = true + FunctionBuildConfig.v2nTotalSwitch = true runCatching { val map = HashMap().also { - it["f1"] = FunctionBuildConfig.v2nMainSwitch - it["f2"] = FunctionBuildConfig.isNewV2NData + it["f1"] = FunctionBuildConfig.v2nTotalSwitch + it["f2"] = FunctionBuildConfig.v2nNewLinked } CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_NEW_LINK_SWITCH, GsonUtils.toJson(map).toByteArray()) } @@ -179,12 +179,12 @@ class V2NTest { } val newPoint = DrivingDirectionUtils.calculateNewPoint(car.longitude, car.latitude, car.heading , 200.0) Log.d(TAG, "获取到路口数据..., 自车:[${car.longitude}, ${car.latitude}]前方200米外的点: [${newPoint.first}, ${newPoint.second}]") - FunctionBuildConfig.isNewV2NData = true - FunctionBuildConfig.v2nMainSwitch = true + FunctionBuildConfig.v2nNewLinked = true + FunctionBuildConfig.v2nTotalSwitch = true runCatching { val map = HashMap().also { - it["f1"] = FunctionBuildConfig.v2nMainSwitch - it["f2"] = FunctionBuildConfig.isNewV2NData + it["f1"] = FunctionBuildConfig.v2nTotalSwitch + it["f2"] = FunctionBuildConfig.v2nNewLinked } CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_NEW_LINK_SWITCH, GsonUtils.toJson(map).toByteArray()) } @@ -211,12 +211,12 @@ class V2NTest { if (millis > 0) { delay(millis) } - FunctionBuildConfig.isNewV2NData = true - FunctionBuildConfig.v2nMainSwitch = true + FunctionBuildConfig.v2nNewLinked = true + FunctionBuildConfig.v2nTotalSwitch = true runCatching { val map = HashMap().also { - it["f1"] = FunctionBuildConfig.v2nMainSwitch - it["f2"] = FunctionBuildConfig.isNewV2NData + it["f1"] = FunctionBuildConfig.v2nTotalSwitch + it["f2"] = FunctionBuildConfig.v2nNewLinked } CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_NEW_LINK_SWITCH, GsonUtils.toJson(map).toByteArray()) } @@ -261,12 +261,12 @@ class V2NTest { if (millis > 0) { delay(millis) } - FunctionBuildConfig.isNewV2NData = true - FunctionBuildConfig.v2nMainSwitch = true + FunctionBuildConfig.v2nNewLinked = true + FunctionBuildConfig.v2nTotalSwitch = true runCatching { val map = HashMap().also { - it["f1"] = FunctionBuildConfig.v2nMainSwitch - it["f2"] = FunctionBuildConfig.isNewV2NData + it["f1"] = FunctionBuildConfig.v2nTotalSwitch + it["f2"] = FunctionBuildConfig.v2nNewLinked } CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_NEW_LINK_SWITCH, GsonUtils.toJson(map).toByteArray()) } diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/FuncBizProvider.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/FuncBizProvider.kt index 1e29f19194..574bd5f14a 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/FuncBizProvider.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/FuncBizProvider.kt @@ -118,7 +118,7 @@ class FuncBizProvider : IMoGoFuncBizProvider { } override fun queryV2XEvents() { - if (V2NCarTypeCheck.verifyCarType() && (!FunctionBuildConfig.v2nMainSwitch || !FunctionBuildConfig.isNewV2NData)) { + if (V2NCarTypeCheck.verifyCarType() && (!FunctionBuildConfig.v2nTotalSwitch || !FunctionBuildConfig.v2nNewLinked)) { v2xPoiLoader.queryWholeRoadEvents() } } diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/overview/OverViewDataManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/overview/OverViewDataManager.kt index 496ddc44b2..e121438401 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/overview/OverViewDataManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/overview/OverViewDataManager.kt @@ -107,7 +107,7 @@ object OverViewDataManager { .observeOn(AndroidSchedulers.mainThread()) .subscribe { it?.apply { - if (V2NCarTypeCheck.verifyCarType() && (!FunctionBuildConfig.v2nMainSwitch || !FunctionBuildConfig.isNewV2NData)) { + if (V2NCarTypeCheck.verifyCarType() && (!FunctionBuildConfig.v2nTotalSwitch || !FunctionBuildConfig.v2nNewLinked)) { CallerFuncBizListenerManager.invokeV2XEvents(this) } } diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XEventManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XEventManager.kt index 4b4238ee09..dd3b9092d5 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XEventManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XEventManager.kt @@ -196,8 +196,8 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IV2XCallback, } is V2XEvent.RoadEventX -> { val flag = verifyCarType() - Log.d("$M_V2X$TAG", "---- 收到ai云V2N事件 ---:${flag}, ${FunctionBuildConfig.v2nMainSwitch}, ${FunctionBuildConfig.isNewV2NData}") - if (flag && (!FunctionBuildConfig.v2nMainSwitch || !FunctionBuildConfig.isNewV2NData)) { + Log.d("$M_V2X$TAG", "---- 收到ai云V2N事件 ---:${flag}, ${FunctionBuildConfig.v2nTotalSwitch}, ${FunctionBuildConfig.v2nNewLinked}") + if (flag && (!FunctionBuildConfig.v2nTotalSwitch || !FunctionBuildConfig.v2nNewLinked)) { // try { if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { Log.d("$M_V2X$TAG", "onAck -> 司机端: 将收到云端事件给到乘客端...") @@ -210,7 +210,7 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IV2XCallback, // } handleRoadMarkerEvent(event.data.toRoadMarker()) } else{ - V2XBizTrace.onAck("事件未触发,被开关拦截",mapOf("roadEvent" to event, "v2nMainSwitch" to FunctionBuildConfig.v2nMainSwitch,"isNewV2NData" to FunctionBuildConfig.isNewV2NData), true) + V2XBizTrace.onAck("事件未触发,被开关拦截",mapOf("roadEvent" to event, "v2nMainSwitch" to FunctionBuildConfig.v2nTotalSwitch,"isNewV2NData" to FunctionBuildConfig.v2nNewLinked), true) } } else -> { diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt index a9a0282d94..516feb66b2 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt @@ -45,7 +45,6 @@ import com.mogo.eagle.function.biz.v2x.v2n.utils.EventDismissBean import com.mogo.eagle.function.biz.v2x.v2n.utils.EventDismissManager import com.mogo.eagle.function.biz.v2x.v2n.utils.IEventDismissListener import com.mogo.eagle.function.biz.v2x.v2n.utils.V2XEventAnalyticsManager -import com.mogo.map.entities.Lane import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.delay @@ -484,42 +483,42 @@ internal object V2NIdentifyDrawer: IEventDismissListener { } private fun drawShiGong(events: List) { - if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) { + if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nTotalSwitch && FunctionBuildConfig.v2nNewLinked) { handler.removeMessages(MSG_WHAT_DRAW_SHIGONE) handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_SHIGONE, events)) } } private fun drawShiGu(events: List) { - if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) { + if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nTotalSwitch && FunctionBuildConfig.v2nNewLinked) { handler.removeMessages(MSG_WHAT_DRAW_SHIGU) handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_SHIGU, events)) } } private fun drawYongDu(events: List) { - if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) { + if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nTotalSwitch && FunctionBuildConfig.v2nNewLinked) { handler.removeMessages(MSG_WHAT_DRAW_YONGDU) handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_YONGDU, events)) } } private fun drawOtherRetrogradeVehicle(event: MessagePad.Event) { - if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) { + if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nTotalSwitch && FunctionBuildConfig.v2nNewLinked) { handler.removeMessages(MSG_WHAT_DRAW_OTHER_RETROGRADE_VEHICLE) handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_OTHER_RETROGRADE_VEHICLE, event)) } } private fun drawGreenWave(crossSpeed: V2nCrossSpeed) { - if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) { + if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nTotalSwitch && FunctionBuildConfig.v2nNewLinked) { handler.removeMessages(MSG_WHAT_DRAW_GREEN_WAVE) handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_GREEN_WAVE, crossSpeed)) } } private fun drawPeopleCross(event: MessagePad.Event) { - if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) { + if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nTotalSwitch && FunctionBuildConfig.v2nNewLinked) { handler.removeMessages(MSG_WHAT_DRAW_PEOPLE_CROSS) handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_PEOPLE_CROSS, event)) } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt index 41e007e3b0..107722103d 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt @@ -68,7 +68,6 @@ import com.zhidao.support.adas.high.common.Constants import com.zhidao.support.adas.high.common.CupidLogUtils import com.zhjt.mogo.adas.common.MessageType import com.zhjt.mogo.adas.common.power.PowerUnitChannel -import com.zhjt.mogo.adas.data.Adas import com.zhjt.mogo.adas.data.AdasConstants import com.zhjt.mogo.adas.data.bean.MogoReport import com.zhjt.mogo.adas.data.bean.NodeStateInfo @@ -1166,8 +1165,8 @@ class MoGoAutopilotControlProvider : CallerLogger.d("$M_D_C$TAG", status) runCatching { val map = HashMap().also { - it["f1"] = FunctionBuildConfig.v2nMainSwitch - it["f2"] = FunctionBuildConfig.isNewV2NData + it["f1"] = FunctionBuildConfig.v2nTotalSwitch + it["f2"] = FunctionBuildConfig.v2nNewLinked } CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_NEW_LINK_SWITCH, GsonUtils.toJson(map).toByteArray()) } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt index 6bcc217bf5..b49fc78e30 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt @@ -149,8 +149,8 @@ class TeleMsgHandler : IMsgHandler { val f1 = data["f1"] as Boolean val f2 = data["f2"] as Boolean Log.d(TAG, "乘客屏收到司机屏转发的新链路开关 --- 3 ---:$data, f1: $f1, f2:$f2") - FunctionBuildConfig.v2nMainSwitch = f1 - FunctionBuildConfig.isNewV2NData = f2 + FunctionBuildConfig.v2nTotalSwitch = f1 + FunctionBuildConfig.v2nNewLinked = f2 } catch (t: Throwable) { t.printStackTrace() Log.e(TAG, "乘客屏收到司机屏转发的新链路开关异常", t) @@ -270,11 +270,11 @@ class TeleMsgHandler : IMsgHandler { TelematicConstant.OBU_RUNREDLIGHT_WARNING -> { when (String(it.body)) { "0" -> { - HmiBuildConfig.isShowRunRedLightView = false + HmiBuildConfig.v2iRedLightWarning = false } "1" -> { - HmiBuildConfig.isShowRunRedLightView = true + HmiBuildConfig.v2iRedLightWarning = true } } } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt index 37b63b34be..b874c07fee 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt @@ -64,25 +64,25 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener } override fun onMoGoObuRsiWarning(rsiWarningData: ObuScene.RsiWarningData) { - if (FunctionBuildConfig.v2xMainSwitch && HmiBuildConfig.isShowObuV2iView) { + if (FunctionBuildConfig.v2xTotalSwitch && HmiBuildConfig.v2iTotalSwitch) { onMogoObuDcRsiWarning(rsiWarningData) } } override fun onMoGoObuRsmWarning(rsmWarningData: ObuScene.RsmWarningData) { - if (FunctionBuildConfig.v2xMainSwitch && HmiBuildConfig.isShowObuV2iView) { + if (FunctionBuildConfig.v2xTotalSwitch && HmiBuildConfig.v2iTotalSwitch) { onMogoObuDcRsmWarning(rsmWarningData) } } override fun onMoGoObuSpatWarning(spatWarningData: ObuScene.SpatWarningData) { - if (FunctionBuildConfig.v2xMainSwitch && HmiBuildConfig.isShowObuV2iView) { + if (FunctionBuildConfig.v2xTotalSwitch && HmiBuildConfig.v2iTotalSwitch) { onMogoObuDcSpatWarning(spatWarningData) } } override fun onMoGoObuMapMath(mapMatchData: ObuScene.MapMatchData) { - if (FunctionBuildConfig.v2xMainSwitch && HmiBuildConfig.isShowObuV2iView) { + if (FunctionBuildConfig.v2xTotalSwitch && HmiBuildConfig.v2iTotalSwitch) { onMogoObuMapMath(mapMatchData) } } @@ -339,7 +339,7 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener * RSM预警信息 CvxPtcThreatIndInfo CvxPtcInfoIndInfo(主车与弱势交通参与者之间的预警(如:弱势交通参与者碰撞预警)) */ fun onMogoObuDcRsmWarning(rsmWarningData: ObuScene.RsmWarningData?) { - if (HmiBuildConfig.isShowObuWeaknessTrafficView) { + if (HmiBuildConfig.v2iWeaknessTraffic) { CallerLogger.d( "${M_OBU}${TAG}", "MogoObuDcCombineManager onMogoObuRsmWarning ------> ${rsmWarningData.toString()}" @@ -576,8 +576,8 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener } 1 -> { //闯红灯 V2I_RLVW_VIOLATION_TYPE_RUNNING_RED_LIGHT 一个红灯周期只显示一次 - if(FunctionBuildConfig.v2xMainSwitch && HmiBuildConfig.isShowObuV2iView){ - if (HmiBuildConfig.isShowRunRedLightView) { + if(FunctionBuildConfig.v2xTotalSwitch && HmiBuildConfig.v2iTotalSwitch){ + if (HmiBuildConfig.v2iRedLightWarning) { if (!isShowRunRedLight) { isShowRunRedLight = true ttsContent = @@ -609,7 +609,7 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener } 2 -> { //绿波通行引导 V2I_RLVW_VIOLATION_TYPE_NO_VIOLATION 一个绿灯周期只显示一次 - if (FunctionBuildConfig.v2xMainSwitch && FunctionBuildConfig.v2nMainSwitch && HmiBuildConfig.isShowGreenWaveView) { + if (FunctionBuildConfig.v2xTotalSwitch && FunctionBuildConfig.v2nTotalSwitch && HmiBuildConfig.isShowGreenWaveView) { if (!isShowGreenWave) { isShowGreenWave = true CallerLogger.d( diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt index edab8756ef..9307fc3ecd 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt @@ -296,7 +296,7 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { * v2v预警信息 CvxRvInfoIndInfo CvxV2vThreatIndInfo 他车 */ override fun onObuRvWarning(data: ObuScene.RvWarningData) { - if (FunctionBuildConfig.v2xMainSwitch && HmiBuildConfig.isShowObuV2vView) { + if (FunctionBuildConfig.v2xTotalSwitch && HmiBuildConfig.v2vTotalSwitch) { if (data.warningMsg != null) { // 更新数据,远车数据,之前要匹配uuid data.vehBasicsMsg?.let { @@ -343,7 +343,7 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { * 红绿灯预警信息 CvxIvpThreatIndInfo */ override fun onObuSpatWarning(data: ObuScene.SpatWarningData) { - if (FunctionBuildConfig.v2xMainSwitch && HmiBuildConfig.isShowObuV2iView) { + if (FunctionBuildConfig.v2xTotalSwitch && HmiBuildConfig.v2iTotalSwitch) { handlerTrafficLight( data.warningType, data.status, @@ -356,7 +356,7 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { * RSI预警信息 onMogoObuRsiWarning(交通标志预警(前方限速、前方学校等等),交通事件预警(前方拥堵、前方积水等等)) */ override fun onObuRsiWarning(data: ObuScene.RsiWarningData) { - if (FunctionBuildConfig.v2xMainSwitch && HmiBuildConfig.isShowObuV2iView) { + if (FunctionBuildConfig.v2xTotalSwitch && HmiBuildConfig.v2iTotalSwitch) { if (data.warningMsgList != null && data.warningMsgList.size > 0) { var alertContent = "" var ttsContent = "" @@ -643,8 +643,8 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", "onMogoObuRsmWarning ------> ${data?.toString()}" ) - if (FunctionBuildConfig.v2xMainSwitch && HmiBuildConfig.isShowObuV2iView) { - if (HmiBuildConfig.isShowObuWeaknessTrafficView) { + if (FunctionBuildConfig.v2xTotalSwitch && HmiBuildConfig.v2iTotalSwitch) { + if (HmiBuildConfig.v2iWeaknessTraffic) { // 交通参与者类型 0x0:未知 UNKNOWN | 1机动车 2:非机动车 NON_MOTOR | 3:行人 PEDESTRIAN 4:obu if (data != null && data.participant != null) { val v2xType = when (data.participant.ptcType) { @@ -736,7 +736,7 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { * 地图匹配 是OBU算法输出地图匹配结果,主车匹配道路哪条路或者哪条车道 */ override fun onObuMapMath(data: ObuScene.MapMatchData?) { - if (FunctionBuildConfig.v2xMainSwitch && HmiBuildConfig.isShowObuV2iView) { + if (FunctionBuildConfig.v2xTotalSwitch && HmiBuildConfig.v2iTotalSwitch) { if (data != null) { CallerLogger.d( "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", @@ -1056,8 +1056,8 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { } 1 -> {//闯红灯 V2I_RLVW_VIOLATION_TYPE_RUNNING_RED_LIGHT 一个红灯周期只显示一次 - if(FunctionBuildConfig.v2xMainSwitch && HmiBuildConfig.isShowObuV2iView){ - if (HmiBuildConfig.isShowRunRedLightView) { + if(FunctionBuildConfig.v2xTotalSwitch && HmiBuildConfig.v2iTotalSwitch){ + if (HmiBuildConfig.v2iRedLightWarning) { if (!isShowRunRedLight) { isShowRunRedLight = true ttsContent = diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index 7c6cc2fb8c..5b7a6b9b6a 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -34,7 +34,6 @@ import com.mogo.eagle.core.function.api.devatools.strict.IStrictModeProvider import com.mogo.eagle.core.function.api.lookaround.IMoGoLookAroundProvider import com.mogo.eagle.core.function.api.map.route.IMapRouteProvider import com.mogo.eagle.core.function.api.upgrade.IMoGoUpgradeProvider -import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.utilcode.kotlin.lifeCycleScope import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -84,10 +83,8 @@ import com.zhjt.mogo_core_function_devatools.weaknetwork.DetectResultImpl import com.zhjt.mogo_core_function_devatools.weaknetwork.WeakNetworkStrategy import com.zhjt.mogo_core_function_devatools.workorder.WorkOrderManager import com.zhjt.service.chain.ChainLog -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import java.io.File import java.lang.ref.WeakReference import java.util.concurrent.ConcurrentHashMap @@ -410,8 +407,8 @@ class DevaToolsProvider : IDevaToolsProvider, IAppStateListener { /** * 展示考试车辆控制窗口 */ - override fun showExamControlWindow(view: View,isShow: Boolean) { - ExamControlManager.showExamControlWindow(view,isShow) + override fun showExamControlWindow(isShow: Boolean) { + ExamControlManager.showExamControlWindow(isShow) } override fun onReceiveBadCaseRecord( diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/exam/ExamControlManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/exam/ExamControlManager.kt index 566399a786..81abca169f 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/exam/ExamControlManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/exam/ExamControlManager.kt @@ -1,14 +1,10 @@ package com.zhjt.mogo_core_function_devatools.exam import android.annotation.SuppressLint -import android.view.View import androidx.fragment.app.FragmentActivity import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.call.setting.CallerSopSettingManager -import com.mogo.eagle.core.utilcode.util.ClickUtils -import com.mogo.eagle.core.utilcode.util.NetworkUtils -import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig +import com.mogo.eagle.core.utilcode.util.AppStateManager /** * 考试控制管理 @@ -21,9 +17,8 @@ internal object ExamControlManager { /** * 开启考试车辆控制窗口 */ - fun showExamControlWindow(view: View,isShow: Boolean){ - val activity = view.context as? FragmentActivity - ?: throw IllegalStateException("please ensure context is FragmentActivity.") + fun showExamControlWindow(isShow: Boolean){ + val activity = AppStateManager.currentActivity() ?: return if(examControlWindow == null){ examControlWindow = ExamControlWindow(activity) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt index 57e40f6d78..851dcfb3bc 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt @@ -173,8 +173,8 @@ object StatusManager { }, 500L) } private fun randomNoFSMChange(ctx: Context) { - val fsmStatus = FSMStatus(FSMStateCode.ExistNormal, "正常") - val noFsmStatus = FSMStatus(FSMStateCode.NotExist, "") + val fsmStatus = FSMStatus(FSMStateCode.ExistNormal, listOf("正常")) + val noFsmStatus = FSMStatus(FSMStateCode.NotExist, listOf("")) ctx.lifeCycleScope.launch(dispatcher) { model.update(if (hasFSM) fsmStatus else noFsmStatus) @@ -182,8 +182,8 @@ object StatusManager { } private fun randomFSMStatus(ctx: Context) { - val fsmNormalStatus = FSMStatus(FSMStateCode.ExistNormal, "正常") - val fsmErrorStatus = FSMStatus(FSMStateCode.ExistError, "异常") + val fsmNormalStatus = FSMStatus(FSMStateCode.ExistNormal, listOf("正常")) + val fsmErrorStatus = FSMStatus(FSMStateCode.ExistError, listOf("异常")) val fSMList = ArrayList()?.also { it += fsmNormalStatus diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt index dd0644996c..db44dd75e7 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt @@ -141,28 +141,31 @@ enum class FSMStateCode { /** * FSM模块状态 */ -class FSMStatus(var state: FSMStateCode, var desc: String = ""): Status(), IAutopilotPreLaunchStatus { +class FSMStatus(var state: FSMStateCode, var descList: List = emptyList()): Status(), IAutopilotPreLaunchStatus { override fun equals(other: Any?): Boolean { if (javaClass != other?.javaClass) return false other as FSMStatus - if (desc != other.desc) { + if (state != other.state) { return false } - if (state != other.state) { + if (descList.size != other.descList.size) { + return false + } + if (descList != other.descList) { return false } return true } override fun hashCode(): Int { - var result = desc.hashCode() + var result = descList.hashCode() result = 31 * result + state.hashCode() return result } override fun toString(): String { - return "FSMStatus(state=$state, desc='$desc', raw_data=$rawData)" + return "FSMStatus(state=$state, descList='$descList', raw_data=$rawData)" } override fun isException(): Boolean = state == FSMStateCode.ExistError diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/fsm/FSMImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/fsm/FSMImpl.kt index 5e7d1c0dd5..e151818859 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/fsm/FSMImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/fsm/FSMImpl.kt @@ -34,9 +34,9 @@ internal class FSMImpl(ctx: Context) : IFlow(ctx), IMoGoAutopilotStat AtomicReference(null) } - private fun getDesc(): String { + private fun getDesc(): List { if (!CallerAutoPilotStatusListenerManager.isConnect()) { - return "未知" + return listOf("未知") } else { val nodeState = CallerAutoPilotControlManager.getNodeStateInfo(AdasConstants.NodeName.FSM2024)?.nodeState ?: AdasConstants.NodeState.NODE_UNKNOWN return getStateDescByNodeStateInfo(nodeState) @@ -61,12 +61,12 @@ internal class FSMImpl(ctx: Context) : IFlow(ctx), IMoGoAutopilotStat } } - private fun getStateDescByNodeStateInfo(nodeState: AdasConstants.NodeState): String { + private fun getStateDescByNodeStateInfo(nodeState: AdasConstants.NodeState): List { return when(nodeState) { - AdasConstants.NodeState.NODE_UNKNOWN -> "未知" - AdasConstants.NodeState.NODE_NOT_EXIST -> "FSM不存在" - AdasConstants.NodeState.NODE_EXIST -> if(fsmStateMsg.get()?.pilotStandbyFlag == true) "状态正常" else fsmStateMsg.get()?.pilotNotStandbyReason ?: "" - else -> "未知" + AdasConstants.NodeState.NODE_UNKNOWN -> listOf("未知") + AdasConstants.NodeState.NODE_NOT_EXIST -> listOf("FSM不存在") + AdasConstants.NodeState.NODE_EXIST -> if(fsmStateMsg.get()?.pilotStandbyFlag == true) listOf("状态正常") else fsmStateMsg.get()?.repeatedPilotNotStandbyReasonList ?: listOf("") + else -> listOf("未知") } } @@ -92,7 +92,7 @@ internal class FSMImpl(ctx: Context) : IFlow(ctx), IMoGoAutopilotStat } else { CallerLogger.d("$M_DEVA$TAG", "工控机断开了....") fsmStateMsg.set(null) - send(FSMStatus(FSMStateCode.UnKnown, "工控机断开了")) + send(FSMStatus(FSMStateCode.UnKnown, listOf("工控机断开了"))) } } @@ -122,9 +122,9 @@ internal class FSMImpl(ctx: Context) : IFlow(ctx), IMoGoAutopilotStat ) fsmStateMsg.set(fsmState) if (fsmState.pilotStandbyFlag) { - send(FSMStatus(FSMStateCode.ExistNormal, "状态正常")) + send(FSMStatus(FSMStateCode.ExistNormal, listOf("状态正常"))) } else { - send(FSMStatus(FSMStateCode.ExistError, fsmState.pilotNotStandbyReason)) + send(FSMStatus(FSMStateCode.ExistError, fsmState.repeatedPilotNotStandbyReasonList)) } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt index 0bef99c5a8..f53e53fc51 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt @@ -14,7 +14,7 @@ internal class StatusModel : ViewModel() { const val TAG = "StatusModel" val DEFAULTS = Pair(null, ArrayList().also { it += OverViewStatus() - it += FSMStatus(FSMStateCode.UnKnown, "") + it += FSMStatus(FSMStateCode.UnKnown, listOf("")) it += RTKStatus("", -1) it += IpcStatus(CallerAutoPilotStatusListenerManager.isConnect()) it += CanStatus(false) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt index fc975615d5..40ee18fb4a 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt @@ -141,9 +141,7 @@ internal class StatusAdapter(val ctx: Context, var data: List) : Recycle FSMStateCode.ExistError -> { iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_fsm_error) - CallerHmiManager.showFSMExceptionStatusWindow(ArrayList().also { - it += status.desc - }) + CallerHmiManager.showFSMExceptionStatusWindow(status.descList) } } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverReasonWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverReasonWindow.kt index 4eccdf7a9e..cf3fee59b3 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverReasonWindow.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverReasonWindow.kt @@ -131,8 +131,8 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene it.format = PixelFormat.RGBA_8888 it.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL it.gravity = Gravity.START or Gravity.TOP - it.width = 844 - it.height = 846 + it.width = 902 + it.height = 1530 it.alpha = 1.0f } } @@ -445,8 +445,8 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene val metrics = DisplayMetrics() // 默认固定位置,靠屏幕右边缘的中间 mWindowManager!!.defaultDisplay.getMetrics(metrics) - mWindowParams!!.x = metrics.widthPixels-890 - mWindowParams!!.y = metrics.heightPixels - BarUtils.getStatusBarHeight()-1140 + mWindowParams!!.x = metrics.widthPixels-1560 + mWindowParams!!.y = metrics.heightPixels - BarUtils.getStatusBarHeight() mWindowManager!!.addView(mFloatLayout, mWindowParams) } mTakeOverRecordInfo = takeOverRecordInfo diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderManager.kt index d42510dfac..d3b6dcb52d 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderManager.kt @@ -44,7 +44,7 @@ class WorkOrderManager{ }) context.enqueuePop( takeOverRecordView, - AutoSizeUtils.dp2px(context, 960f), + AutoSizeUtils.dp2px(context, 1046f), WindowManager.LayoutParams.MATCH_PARENT, key = "BadCaseManagerView" ).also { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/bg_work_order_des_input.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/bg_work_order_des_input.png index eee3703f5c..49264822a1 100644 Binary files a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/bg_work_order_des_input.png and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/bg_work_order_des_input.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_take_over_label.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_take_over_label.png new file mode 100644 index 0000000000..9f37f9ee99 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_take_over_label.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_fault_type.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_fault_type.xml index cb1fa5e3d6..49cdb10ffd 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_fault_type.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_fault_type.xml @@ -5,11 +5,11 @@ > - + diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_bottom.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_bottom.png new file mode 100644 index 0000000000..b411d071dc Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_bottom.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_delete.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_delete.png new file mode 100644 index 0000000000..aece9f98b1 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_delete.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_reason.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_reason.png index a54e6efd2f..1bef38bc29 100644 Binary files a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_reason.png and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_reason.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_reason_cancel.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_reason_cancel.xml new file mode 100644 index 0000000000..9c523cef79 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_reason_cancel.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_reason_save.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_reason_save.xml new file mode 100644 index 0000000000..aed5a20c8a --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_reason_save.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_record.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_record.png index 3b494dd410..327146e713 100644 Binary files a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_record.png and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_record.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_upload.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_upload.png new file mode 100644 index 0000000000..e505aeb1b5 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_take_over_upload.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_record_cannot_check.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_record_cannot_check.png index 7484265321..b60dd3464e 100644 Binary files a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_record_cannot_check.png and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_record_cannot_check.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_record_check_false.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_record_check_false.png index aa2ccad38f..a9d9e09d88 100644 Binary files a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_record_check_false.png and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_record_check_false.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_record_check_true.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_record_check_true.png index 5a0b408b68..7442cdf962 100644 Binary files a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_record_check_true.png and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_record_check_true.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_record_no_data.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_record_no_data.png index 246b3c4f38..ed13310910 100644 Binary files a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_record_no_data.png and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_record_no_data.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/type_radio_button_select.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/type_radio_button_select.xml index a97b69d909..e086586d69 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/type_radio_button_select.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/type_radio_button_select.xml @@ -1,5 +1,10 @@ - - - + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/type_radio_button_unselect.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/type_radio_button_unselect.xml index cb1fa5e3d6..a286173cf9 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/type_radio_button_unselect.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/type_radio_button_unselect.xml @@ -5,13 +5,8 @@ > - + - - - + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_take_over_record.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_take_over_record.xml index 0793f7318a..88a32f289f 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_take_over_record.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_take_over_record.xml @@ -6,11 +6,12 @@ - - - - - - @@ -114,10 +81,9 @@ android:layout_width="@dimen/dp_781" android:layout_height="@dimen/dp_70" android:background="@drawable/bg_fault_type" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" - app:layout_constraintTop_toTopOf="parent" - android:layout_marginTop="@dimen/dp_374" + app:layout_constraintTop_toBottomOf="@id/tvTakeOverReasonTitle" + app:layout_constraintLeft_toLeftOf="@id/tvTakeOverReasonTitle" + android:layout_marginTop="@dimen/dp_12" android:paddingStart="@dimen/dp_21" android:paddingEnd="@dimen/dp_21" app:drawableEndCompat="@drawable/icon_fault_expand" @@ -126,30 +92,17 @@ android:gravity="center_vertical" /> - - - @@ -24,30 +24,31 @@ android:textColor="#FFFFFFFF" android:textSize="@dimen/sp_42" app:layout_constraintTop_toTopOf="@id/viewTakeOverRecordLine" - app:layout_constraintBottom_toBottomOf="@id/viewTakeOverRecordLine" - app:layout_constraintLeft_toLeftOf="@id/viewTakeOverRecordLine" - android:layout_marginStart="50dp" + app:layout_constraintLeft_toRightOf="@id/viewTakeOverRecordLine" + android:layout_marginStart="@dimen/dp_19" + android:layout_marginTop="@dimen/dp_m_2" /> - + + + + - - \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/values/strings.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/values/strings.xml index 0df48d8bae..1c36489633 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/values/strings.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/values/strings.xml @@ -4,7 +4,7 @@ 问题上报 问题类型 发生时间 - 问题描述 + 补充描述 手动输入 上报 取消 @@ -64,7 +64,7 @@ 上报 保存 取消 - 暂无接管记录 + 暂无内容 不能选则 \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/values/styles.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/values/styles.xml index a64bbda71e..57c57a86d2 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/values/styles.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/values/styles.xml @@ -23,7 +23,6 @@ @dimen/sp_30 @drawable/work_order_type_radio_button 1 - @dimen/dp_8 diff --git a/core/function-impl/mogo-core-function-hmi/build.gradle b/core/function-impl/mogo-core-function-hmi/build.gradle index 2fdc51ba08..8cd10480ce 100644 --- a/core/function-impl/mogo-core-function-hmi/build.gradle +++ b/core/function-impl/mogo-core-function-hmi/build.gradle @@ -79,6 +79,7 @@ dependencies { implementation rootProject.ext.dependencies.koomxhook implementation rootProject.ext.dependencies.preference implementation rootProject.ext.dependencies.preference_ktx + implementation rootProject.ext.dependencies.amapsearch implementation rootProject.ext.dependencies.thread_opt api project(':test:crashreport-apmbyte') diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneTabLayout.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneTabLayout.kt index be956276d5..2bb25033ac 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneTabLayout.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneTabLayout.kt @@ -8,16 +8,20 @@ import com.mogo.eagle.core.data.enums.Carmodel import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.bone.tab.ReportTypeView import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI import com.mogo.eagle.core.utilcode.util.UiThreadHandler import kotlinx.android.synthetic.main.view_bone_tab.view.carInfoTabView +import kotlinx.android.synthetic.main.view_bone_tab.view.faultReasonView import kotlinx.android.synthetic.main.view_bone_tab.view.msgBoxTabView +import kotlinx.android.synthetic.main.view_bone_tab.view.reportTypeView import kotlinx.android.synthetic.main.view_bone_tab.view.tabSwitchCarInfo import kotlinx.android.synthetic.main.view_bone_tab.view.tabSwitchMore import kotlinx.android.synthetic.main.view_bone_tab.view.tabSwitchMsgBox import kotlinx.android.synthetic.main.view_bone_tab.view.tabSwitchReport import kotlinx.android.synthetic.main.view_bone_tab.view.toolKitTabView +import kotlinx.android.synthetic.main.view_bone_tab.view.workOrderView import kotlin.properties.Delegates class BoneTabLayout @JvmOverloads constructor( @@ -83,6 +87,15 @@ class BoneTabLayout @JvmOverloads constructor( logOut?.invoke() } + reportTypeView.setClickListener(object: ReportTypeView.ClickListener{ + override fun openFaultReasonView() { + faultReasonView.visibility = VISIBLE + } + override fun openWorkOrderView() { + workOrderView.visibility = VISIBLE + } + }) + } fun setCarNo(carNo: String?) { @@ -132,9 +145,10 @@ class BoneTabLayout @JvmOverloads constructor( TabType.REPORT_INFO -> { tabSwitchReport.switchTab(check) if (check) { - + reportTypeView.visibility = VISIBLE + reportTypeView.showTypeSelectView() } else { - + reportTypeView.visibility = GONE } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/StartAutoPilotStatusView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/StartAutoPilotStatusView.kt index 57ca6cd7da..74b7dd1f4d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/StartAutoPilotStatusView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/StartAutoPilotStatusView.kt @@ -22,7 +22,6 @@ import com.zhjt.mogo_core_function_devatools.status.entity.FSMStateCode import com.zhjt.mogo_core_function_devatools.status.entity.FSMStatus import com.zhjt.mogo_core_function_devatools.status.entity.GearStatus import com.zhjt.mogo_core_function_devatools.status.entity.IAutopilotPreLaunchStatus -import com.zhjt.mogo_core_function_devatools.status.entity.SpeedStatus import com.zhjt.mogo_core_function_devatools.status.entity.Status import com.zhjt.mogo_core_function_devatools.status.entity.SteerStatus import kotlinx.android.synthetic.main.view_start_autopilot_status.view.fSMStatusLayout @@ -72,7 +71,7 @@ class StartAutoPilotStatusView @JvmOverloads constructor( private fun initView() { // 默认展示 FSM 情况未知的状态 - handleFSM(FSMStatus(FSMStateCode.UnKnown, "未知")) + handleFSM(FSMStatus(FSMStateCode.UnKnown, listOf("未知"))) } /** @@ -132,9 +131,7 @@ class StartAutoPilotStatusView @JvmOverloads constructor( FSMStateCode.ExistError -> { fSMStatusLayout?.onClick { - CallerHmiManager.showFSMExceptionStatusWindow(ArrayList().also { - it += status.desc - }) + CallerHmiManager.showFSMExceptionStatusWindow(status.descList) } fSMStatusLayout?.setImageDrawable( ContextCompat.getDrawable( @@ -233,7 +230,6 @@ class StartAutoPilotStatusView @JvmOverloads constructor( } } - override fun onAttachedToWindow() { super.onAttachedToWindow() StatusManager.addListener(TAG, this) @@ -256,10 +252,6 @@ class StartAutoPilotStatusView @JvmOverloads constructor( handleFSM(status) } - is SpeedStatus -> { - // TODO - } - else -> { handleWithoutFSM(status) } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/fsm/FSMStatusDetailView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/fsm/FSMStatusDetailView.kt index dcf5bd1f5e..46f0fe7f82 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/fsm/FSMStatusDetailView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/fsm/FSMStatusDetailView.kt @@ -54,7 +54,7 @@ class FSMStatusDetailView @JvmOverloads constructor( } } - fun setFsmErrorStatus(msgArray: ArrayList) { + fun setFsmErrorStatus(msgArray: List) { tvTitle?.text = "FSM异常" runCatching { val c = Color.parseColor("#FF4E41") @@ -93,7 +93,7 @@ class FSMStatusDetailView @JvmOverloads constructor( removeFsmMsgItemView() } - private fun addFsmMsgItemView(msgArray: ArrayList, isError: Boolean) { + private fun addFsmMsgItemView(msgArray: List, isError: Boolean) { if (llFsmMsgContainerLayout == null) { Logger.e(TAG, "addFsmMsmItemView llFsmMsgContainerLayout is null") return @@ -145,14 +145,7 @@ class FSMStatusDetailView @JvmOverloads constructor( } FSMStateCode.ExistError -> { - // TODO 修改成多条 - setFsmErrorStatus(ArrayList().also { - it += status.desc - it += status.desc - it += status.desc - it += status.desc - it += status.desc - }) + setFsmErrorStatus(status.descList) } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/fsm/FSMStatusDetailWindowManager.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/fsm/FSMStatusDetailWindowManager.kt index 8d9e54242e..5a20375177 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/fsm/FSMStatusDetailWindowManager.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/fsm/FSMStatusDetailWindowManager.kt @@ -25,7 +25,7 @@ class FSMStatusDetailWindowManager private constructor() { } fun showExceptionStatus( - context: Context, errorMsg: ArrayList + context: Context, errorMsg: List ) { if (mFSMStatusDetailView == null) { mFSMStatusDetailView = FSMStatusDetailView(context) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/FaultReasonView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/FaultReasonView.kt new file mode 100644 index 0000000000..9b5ca28692 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/FaultReasonView.kt @@ -0,0 +1,497 @@ +package com.mogo.eagle.core.function.hmi.bone.tab + +import android.annotation.SuppressLint +import android.content.Context +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.text.Editable +import android.text.TextWatcher +import com.iflytek.cloud.ErrorCode +import com.iflytek.cloud.InitListener +import com.iflytek.cloud.RecognizerListener +import com.iflytek.cloud.RecognizerResult +import com.iflytek.cloud.SpeechError +import com.iflytek.cloud.SpeechRecognizer +import android.util.AttributeSet +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.animation.Animation +import android.view.animation.ScaleAnimation +import android.widget.EditText +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.LinearLayoutManager +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.geocoder.GeocodeResult +import com.amap.api.services.geocoder.GeocodeSearch +import com.amap.api.services.geocoder.RegeocodeQuery +import com.amap.api.services.geocoder.RegeocodeResult +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.data.deva.report.CategoryInfo +import com.mogo.eagle.core.data.deva.report.PadAddProblemReq +import com.mogo.eagle.core.data.deva.report.PadProblemInfo +import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener +import com.mogo.eagle.core.function.api.order.IOrderListener +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +import com.mogo.eagle.core.function.call.order.CallerOrderListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.JsonParser +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.tts.base.SpeechUtils +import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig +import com.zhjt.mogo_core_function_devatools.workorder.adapter.OrderReasonAdapter +import kotlinx.android.synthetic.main.view_fault_reason.view.etNoteInput +import kotlinx.android.synthetic.main.view_fault_reason.view.faultReasonGroup +import kotlinx.android.synthetic.main.view_fault_reason.view.ivNoteAudio +import kotlinx.android.synthetic.main.view_fault_reason.view.ivTimeAdd +import kotlinx.android.synthetic.main.view_fault_reason.view.ivTimeReduce +import kotlinx.android.synthetic.main.view_fault_reason.view.rvFaultList +import kotlinx.android.synthetic.main.view_fault_reason.view.tvFaultCancel +import kotlinx.android.synthetic.main.view_fault_reason.view.tvFaultReason +import kotlinx.android.synthetic.main.view_fault_reason.view.tvFaultReport +import kotlinx.android.synthetic.main.view_fault_reason.view.tvFaultTime +import kotlinx.android.synthetic.main.view_fault_reason.view.tvFaultType +import kotlinx.android.synthetic.main.view_fault_reason.view.tvOccurrenceTime +import kotlinx.android.synthetic.main.view_fault_reason.view.tvUploadSuccess + +/** + * 故障原因编辑视图 + */ +class FaultReasonView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoDevaToolsListener, IOrderListener { + + private val TAG = "FaultReasonView" + + // 语音听写对象 + private var mIat: SpeechRecognizer? = null + // 用HashMap存储听写结果 + private val mIatResults: HashMap = LinkedHashMap() + + var ret = 0 // 函数调用返回值 + private var audioStatus = false + + private var workOrderOccurrenceTime = System.currentTimeMillis() //故障发生时间 + + private var clickListener: ClickListener? = null + + private lateinit var orderReasonAdapter: OrderReasonAdapter + + private var address: String = "" //故障地点 + private var faultCodeList = ArrayList() //故障码列表 + private var level1Id: Int = 0 //一级分类ID + private var level2Id: Int = 0 //二级分类ID + private var level3Id: Int = 0 //三级分类ID + private var level1Name: String = "" + private var level2Name: String = "" + private var level3Name: String = "" + private var reportNote: String = "" //上报描述 + private val reportType: Int = 1 //上报方式:0:小程序 1:司机屏 2:云端上报 + + private var source: Int = 0 //操作源,0:默认,一级分类 1:类型,二级分类;2:原因,三级分类 + private var hasLevel2: Boolean = false //是否有二级分类 + private var hasLevel3: Boolean = false //是否有三级分类 + + private var typeList: List ?= null //故障类型列表 + private var reasonList: List ?= null //故障原因列表 + + private var faultTypeSelectStatus: Boolean = false //故障类型选择状态 + private var faultReasonSelectStatus: Boolean = false //故障原因选择状态 + + private val type = 1 //故障类接口请求Type值为1 + + init { + LayoutInflater.from(context).inflate(R.layout.view_fault_reason, this, true) + initView() + initEvent() + } + + private fun initView(){ + // 初始化识别无UI识别对象 + // 使用SpeechRecognizer对象,可根据回调消息自定义界面; + mIat = SpeechRecognizer.createRecognizer(context, mInitListener) + val linearLayoutManager = LinearLayoutManager(context) + linearLayoutManager.orientation = LinearLayoutManager.VERTICAL + rvFaultList.layoutManager = linearLayoutManager + orderReasonAdapter = OrderReasonAdapter() + orderReasonAdapter.setListener(object: OrderReasonAdapter.ReasonSelectListener{ + override fun onSelectReason(reason: CategoryInfo, mSource: Int) { + if(mSource == 1){ + //类型 + tvFaultType.text = reason.name + //选择了故障类型 + tvFaultType.performClick() + if(level2Id != 0 && level2Id == reason.id){ + //故障类型选择没有变化 + reasonList?.let { orderReasonAdapter.setData(it,2) } + }else{ + //故障类型发生了变化 + level2Id = reason.id + level2Name = reason.name + source = 2 + //获取故障三级分类即故障原因 + CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId,3,level2Id,type,0) + tvFaultReason.text = "" + level3Id = 0 + level3Name = "" + } + }else{ + //原因 + tvFaultReason.text = reason.name + tvFaultReason.performClick() + level3Id = reason.id + level3Name = reason.name + } + } + }) + rvFaultList.adapter = orderReasonAdapter + } + + @SuppressLint("SetTextI18n") + private fun initEvent(){ + CallerDevaToolsListenerManager.addListener(TAG, this) + CallerOrderListenerManager.addListener(TAG,this) + val iconDown = ContextCompat.getDrawable(context, R.drawable.icon_fault_expand) + iconDown?.setBounds(0, 0, iconDown.minimumWidth, iconDown.minimumHeight) + val iconUp = ContextCompat.getDrawable(context, R.drawable.icon_fault_retract) + iconUp?.setBounds(0, 0, iconUp.minimumWidth, iconUp.minimumHeight) + //获取一级分类 + CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId,1,0,type,0) + //弹窗展示时间 + tvFaultTime.text = millis2String(System.currentTimeMillis(), TimeUtils.getHourMinSecondFormat()) + //故障类型选择 + tvFaultType.setOnClickListener { + if(!hasLevel2){ + ToastUtils.showShort("运营后台没有配置故障类型") + return@setOnClickListener + } + if(faultTypeSelectStatus){ + //关闭 + faultTypeSelectStatus = false + tvFaultType.setCompoundDrawables(null, null, iconDown, null) + //隐藏列表 + rvFaultList.visibility = View.GONE + }else{ + //如果故障原因此时为打开状态,则关闭 + if(faultReasonSelectStatus){ + tvFaultReason.performClick() + } + //打开 + faultTypeSelectStatus = true + tvFaultType.setCompoundDrawables(null, null, iconUp, null) + //展示列表 + rvFaultList.visibility = View.VISIBLE + (rvFaultList.layoutParams as ConstraintLayout.LayoutParams).topToBottom = R.id.tvFaultType + source = 1 + if(typeList.isNullOrEmpty()){ + //获取故障二级分类即故障类型 + CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId,2,level1Id,type,0) + }else{ + orderReasonAdapter.setData(typeList!!,source) + } + + } + } + //故障原因选择 + tvFaultReason.setOnClickListener { + if(tvFaultType.text.isEmpty()){ + ToastUtils.showShort("请先选择故障类型") + return@setOnClickListener + } + if(faultReasonSelectStatus){ + //关闭 + faultReasonSelectStatus = false + tvFaultReason.setCompoundDrawables(null, null, iconDown, null) + //隐藏列表 + rvFaultList.visibility = View.GONE + }else{ + //打开 + faultReasonSelectStatus = true + tvFaultReason.setCompoundDrawables(null, null, iconUp, null) + //展示列表 + rvFaultList.visibility = View.VISIBLE + (rvFaultList.layoutParams as ConstraintLayout.LayoutParams).topToBottom = R.id.tvFaultReason + } + } + + //发生时间 + tvOccurrenceTime.text = millis2String(workOrderOccurrenceTime, TimeUtils.getHourMinFormat()) + ivTimeReduce.setOnClickListener { + workOrderOccurrenceTime -= 60000 + tvOccurrenceTime.text = millis2String(workOrderOccurrenceTime, TimeUtils.getHourMinFormat()) + } + ivTimeAdd.setOnClickListener { + if(workOrderOccurrenceTime + 60000 > System.currentTimeMillis()){ + ToastUtils.showShort("发生时间应在当前时间之前") + return@setOnClickListener + } + workOrderOccurrenceTime += 60000 + tvOccurrenceTime.text = millis2String(workOrderOccurrenceTime, TimeUtils.getHourMinFormat()) + } + + //补充描述 + etNoteInput.onFocusChangeListener = OnFocusChangeListener { v, hasFocus -> + val edit = v as EditText + if(hasFocus){ + edit.hint = "" + }else{ + edit.hint = "手动输入" + } + } + etNoteInput.addTextChangedListener(object: TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + + } + + override fun afterTextChanged(s: Editable?) { + + } + + }) + //问题描述录音 + ivNoteAudio.setOnClickListener { + audioStatus = !audioStatus + if(audioStatus){ + ivNoteAudio.setImageDrawable(ContextCompat.getDrawable( + context, + R.drawable.icon_reason_audio_pressed + )) + }else{ + ivNoteAudio.setImageDrawable(ContextCompat.getDrawable( + context, + R.drawable.icon_reason_audio_normal + )) + } + setAudio(audioStatus) + } + //上报 + tvFaultReport.setOnClickListener{ + if(level2Name.isEmpty()){ + ToastUtils.showShort("请完整填写再上报") + return@setOnClickListener + } + if(hasLevel3 && level3Name.isEmpty()){ + ToastUtils.showShort("请完整填写再上报") + return@setOnClickListener + } + reportNote = etNoteInput.text.toString() + //故障码列表赋值 + BadCaseConfig.newFMInfoMsg?.fmInfoList?.forEach { + faultCodeList.add(it.faultId) + } + val geocodeSearch = GeocodeSearch(context) + geocodeSearch.setOnGeocodeSearchListener(object: GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult?, p1: Int) { + regeocodeResult?.regeocodeAddress?.formatAddress?.let { + address = it + } + val padProblemList= ArrayList() + val note = if(reportNote.isEmpty()){ + "$level1Name-$level2Name-$level3Name" + }else{ + "$level1Name-$level2Name-$level3Name($reportNote)" + } + val padProblemInfo = PadProblemInfo(address,faultCodeList,millis2String(workOrderOccurrenceTime),level1Id, + level2Id,level3Id,BadCaseConfig.lineName,note,reportType, + SharedPrefsMgr.getInstance().getString("och_account","")) + padProblemList.add(padProblemInfo) + val padAddProblemReq = PadAddProblemReq(padProblemList, AppConfigInfo.plateNumber) + CallerDevaToolsManager.problemPadAdd(padAddProblemReq) + } + + override fun onGeocodeSearched(p0: GeocodeResult?, p1: Int) { + + } + }) + val latLon = LatLonPoint(CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().latitude, CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().longitude) + val q = RegeocodeQuery(latLon,200f,GeocodeSearch.AMAP) + geocodeSearch.getFromLocationAsyn(q) + } + + //取消 + tvFaultCancel.setOnClickListener { + this@FaultReasonView.visibility = View.GONE + } + } + + private fun setAudio(status: Boolean){ + if(status){ + //开始录音 + mIat?.let { + //清空之前的内容 + mIatResults.clear() + SpeechUtils.setParam(it) + // 不显示听写对话框 + ret = it.startListening(mRecognizerListener) + if (ret != ErrorCode.SUCCESS) { + ToastUtils.showShort("听写失败,错误码:$ret,请点击网址https://www.xfyun.cn/document/error-code查询解决方案") + } + } + //开始录音,展示放大缩小动效 + val scaleAnimation = ScaleAnimation( + 1.0f, 0.8f, 1.0f, 0.8f, + Animation.RELATIVE_TO_SELF, 0.5f, + Animation.RELATIVE_TO_SELF, 0.5f) + scaleAnimation.duration = 1000 + scaleAnimation.repeatCount = -1 + ivNoteAudio.startAnimation(scaleAnimation) + }else{ + //停止语音听写 + mIat?.stopListening() + //结束动画 + ivNoteAudio.clearAnimation() + } + } + + /** + * 初始化监听器。 + */ + private val mInitListener = InitListener { code -> + if (code != ErrorCode.SUCCESS) { + ToastUtils.showShort("讯飞语音听写初始化失败,错误码:$code") + } + } + + /** + * 听写监听器。 + */ + private val mRecognizerListener: RecognizerListener = object : RecognizerListener{ + override fun onVolumeChanged(p0: Int, p1: ByteArray?) { + //showTip("当前正在说话,音量大小 = " + volume + " 返回音频数据 = " + data.length); + } + + override fun onBeginOfSpeech() { + // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入 + } + + override fun onEndOfSpeech() { + // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入 + } + + override fun onResult(results: RecognizerResult?, isLast: Boolean) { + results?.let { + printResult(it) + } + } + + override fun onError(p0: SpeechError?) { + // Tips: + // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。 + } + + override fun onEvent(p0: Int, p1: Int, p2: Int, p3: Bundle?) { + // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因 + // 若使用本地能力,会话id为null + // if (SpeechEvent.EVENT_SESSION_ID == eventType) { + // String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID); + // Log.d(TAG, "session id =" + sid); + // } + } + + } + + /** + * 显示结果 + */ + @SuppressLint("SetTextI18n") + private fun printResult(results: RecognizerResult) { + val text: String = JsonParser.parseIatResult(results.resultString) + Log.i(TAG, "语音内容=$text") + if(text.isNotEmpty()){ + if(etNoteInput.text.toString().isEmpty()){ + etNoteInput.setText(text) + etNoteInput.setSelection(text.length) + }else{ + val startStr = etNoteInput.text.toString().substring(0,etNoteInput.selectionStart) + val endStr = etNoteInput.text.toString().substring(etNoteInput.selectionEnd,etNoteInput.text.toString().length) + etNoteInput.setText(startStr+text+endStr) + etNoteInput.setSelection(startStr.length+text.length) + } + + } + } + + fun setClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + + interface ClickListener { + fun closeWindow() + } + + /** + * 故障上报成功 + */ + override fun problemPadAddSuccess() { + super.problemPadAddSuccess() + //显示上报成功页面,短暂停留关闭弹窗 + ThreadUtils.runOnUiThread { + //结束动画 + ivNoteAudio.clearAnimation() + rvFaultList.visibility = View.GONE + tvUploadSuccess.visibility = View.VISIBLE + faultReasonGroup.visibility = View.GONE + val successHandler = Handler(Looper.getMainLooper()) + successHandler.postDelayed({ + this@FaultReasonView.visibility = View.GONE + },1500) + } + } + + override fun problemPadAddError(msg: String) { + super.problemPadAddError(msg) + ToastUtils.showShort("故障原因上报失败$msg") + } + + override fun getCategoriesSuccess(list: List) { + super.getCategoriesSuccess(list) + ThreadUtils.runOnUiThread { + if(list.isNotEmpty()){ + if(source == 0){ + level1Id = list[0].id + level1Name = list[0].name + + source = 1 + //获取故障二级分类即故障类型 + CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId,2,level1Id,type,0) + }else{ + if(source == 1){ + typeList = list + hasLevel2 = true + }else{ + reasonList = list + hasLevel3 = true + } + orderReasonAdapter.setData(list,source) + } + }else{ + if(source == 2){ + hasLevel3 = false + }else{ + hasLevel2 = false + ToastUtils.showShort("故障类型列表为空") + } + } + } + } + + override fun getCategoriesError(msg: String) { + super.getCategoriesError(msg) + ToastUtils.showShort("故障列表获取失败:$msg") + } + +} \ 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/ReportTypeView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ReportTypeView.kt new file mode 100644 index 0000000000..430fc72531 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ReportTypeView.kt @@ -0,0 +1,261 @@ +package com.mogo.eagle.core.function.hmi.bone.tab + +import android.content.Context +import android.os.CountDownTimer +import android.os.Handler +import android.os.Looper +import android.os.SystemClock +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import com.amap.api.services.core.LatLonPoint +import com.amap.api.services.geocoder.GeocodeResult +import com.amap.api.services.geocoder.GeocodeSearch +import com.amap.api.services.geocoder.RegeocodeQuery +import com.amap.api.services.geocoder.RegeocodeResult +import com.mogo.commons.env.ProjectUtils +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.data.deva.report.CategoryInfo +import com.mogo.eagle.core.data.deva.report.PadAddProblemReq +import com.mogo.eagle.core.data.deva.report.PadProblemInfo +import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig +import kotlinx.android.synthetic.main.view_report_type.view.ivOneClickReport +import kotlinx.android.synthetic.main.view_report_type.view.oneClickGroup +import kotlinx.android.synthetic.main.view_report_type.view.reportTypeGroup +import kotlinx.android.synthetic.main.view_report_type.view.tvOneClickReportTitle +import kotlinx.android.synthetic.main.view_report_type.view.tvReportSuccess +import kotlinx.android.synthetic.main.view_report_type.view.tvReportTypeFault +import kotlinx.android.synthetic.main.view_report_type.view.tvReportTypeTakeOver +import kotlin.math.absoluteValue +import kotlin.math.round +import kotlin.random.Random + +/** + * 上报类型选择,包括一键上报及上报类型选择:故障类、接管类 + * 一键上报和类型选择互斥,当点击弹出上报类型选择时,一键上报隐藏 + */ +class ReportTypeView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoDevaToolsListener { + + private val TAG = "ReportTypeView" + + private var isOneClickType: Boolean = false //是否是一键上报类型 + private var hasReportOperate: Boolean = false //是否点击了一键上报按钮 + + private var oneClickTimer: CountDownTimer?= null + private var clickListener: ClickListener? = null + + private var address: String = "" //故障地点 + private var faultCodeList = ArrayList() //故障码列表 + private var level1Id: Int = 0 //一级分类ID + private var level2Id: Int = 0 //二级分类ID + private var level3Id: Int = 0 //三级分类ID + private var level1Name: String = "" + private var level2Name: String = "" + private var level3Name: String = "" + private val reportType: Int = 1 //上报方式:0:小程序 1:司机屏 2:云端上报 + private var level: Int = 1 + + private var canOneReport: Boolean = false //是否可以一键上报 + + init { + LayoutInflater.from(context).inflate(R.layout.view_report_type, this, true) + initView() + } + + private fun initView(){ + CallerDevaToolsListenerManager.addListener(TAG, this) + if(isOneClickType){ + showOneCLickReportView() + }else{ + showTypeSelectView() + } + //一键上报 + ivOneClickReport.setOnClickListener { + if(!canOneReport){ + ToastUtils.showShort("故障描述获取失败不能上报") + return@setOnClickListener + } + hasReportOperate = true + BadCaseConfig.newFMInfoMsg?.fmInfoList?.forEach { + faultCodeList.add(it.faultId) + } + val geocodeSearch = GeocodeSearch(context) + geocodeSearch.setOnGeocodeSearchListener(object: GeocodeSearch.OnGeocodeSearchListener { + override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult?, p1: Int) { + regeocodeResult?.regeocodeAddress?.formatAddress?.let { + address = it + } + val padProblemList= ArrayList() + val padProblemInfo = PadProblemInfo(address,faultCodeList,millis2String(System.currentTimeMillis()),level1Id, + level2Id,level3Id,BadCaseConfig.lineName,"${level1Name}-${level2Name}-${level3Name}",reportType, + SharedPrefsMgr.getInstance().getString("och_account","")) + padProblemList.add(padProblemInfo) + val padAddProblemReq = PadAddProblemReq(padProblemList, AppConfigInfo.plateNumber) + CallerDevaToolsManager.problemPadAdd(padAddProblemReq) + } + + override fun onGeocodeSearched(p0: GeocodeResult?, p1: Int) { + + } + }) + val latLon = LatLonPoint(CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().latitude, CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().longitude) + val q = RegeocodeQuery(latLon,200f, GeocodeSearch.AMAP) + geocodeSearch.getFromLocationAsyn(q) + } + + //故障类 + tvReportTypeFault.setOnClickListener { + //TODO 更改! + if(!ProjectUtils.isSaas()){ + clickListener?.openFaultReasonView() + }else{ + //展示工单上报弹窗 + clickListener?.openWorkOrderView() + } + this@ReportTypeView.visibility = View.GONE + } + + //主动录包 + tvReportTypeTakeOver.setOnClickListener { + val response = CallerAutoPilotControlManager.recordPackage( + BadCaseConfig.type, Random(SystemClock.elapsedRealtime()).nextInt().absoluteValue, + BadCaseConfig.totalDuration, BadCaseConfig.previousDuration) + if(response){ + //已发起录包 + oneClickGroup.visibility = View.GONE + reportTypeGroup.visibility = View.GONE + tvReportSuccess.visibility = View.VISIBLE + tvReportSuccess.text = resources.getString(R.string.record_success) + val successHandler = Handler(Looper.getMainLooper()) + successHandler.postDelayed({ + this@ReportTypeView.visibility = View.GONE + },1500) + }else{ + ToastUtils.showShort("主动录包命令下发失败") + this@ReportTypeView.visibility = View.GONE + } + } + } + + /** + * 展示一键上报视图 + */ + private fun showOneCLickReportView(){ + oneClickGroup.visibility = View.VISIBLE + reportTypeGroup.visibility = View.GONE + tvReportSuccess.visibility = View.GONE + tvOneClickReportTitle.text = String.format(resources.getString(R.string.identified_vehicle_malfunction),5) + oneClickTimer = object : CountDownTimer(5000, 1000) { + override fun onTick(count: Long) { + ThreadUtils.runOnUiThread { + tvOneClickReportTitle.text = String.format(resources.getString(R.string.identified_vehicle_malfunction),round((count.toDouble()/1000)).toInt()) + } + } + + override fun onFinish() { + //如果有页面操作,则不自动关闭窗口 + if(!hasReportOperate){ + ThreadUtils.runOnUiThread { + this@ReportTypeView.visibility = View.GONE + } + } + } + } + oneClickTimer?.start() + } + + /** + * 展示类型选择视图 + */ + fun showTypeSelectView(){ + oneClickGroup.visibility = View.GONE + reportTypeGroup.visibility = View.VISIBLE + tvReportSuccess.visibility = View.GONE + } + + /** + * 故障上报成功 + */ + override fun problemPadAddSuccess() { + //显示上报成功页面,短暂停留关闭弹窗 + ThreadUtils.runOnUiThread { + oneClickGroup.visibility = View.GONE + reportTypeGroup.visibility = View.GONE + tvReportSuccess.visibility = View.VISIBLE + tvReportSuccess.text = resources.getString(R.string.report_success) + val successHandler = Handler(Looper.getMainLooper()) + successHandler.postDelayed({ + this.visibility = View.GONE + },1500) + } + } + + override fun problemPadAddError(msg: String) { + super.problemPadAddError(msg) + ToastUtils.showShort("故障原因上报失败$msg") + ThreadUtils.runOnUiThread { + this.visibility = View.GONE + } + } + + override fun getCategoriesSuccess(list: List) { + super.getCategoriesSuccess(list) + if(list.isEmpty()){ + ToastUtils.showShort("一键上报故障描述后台未配置") + canOneReport = false + }else{ + when (level) { + 1 -> { + level1Id = list[0].id + level1Name = list[0].name + level = 2 + //请求二级一键上报配置 + CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId,level,level1Id,4,1) + } + 2 -> { + level2Id = list[0].id + level2Name = list[0].name + level = 3 + //请求三级一键上报配置 + CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId,level,level2Id,4,1) + } + else -> { + level3Id = list[0].id + level3Name = list[0].name + canOneReport = true + } + } + } + } + + override fun getCategoriesError(msg: String) { + super.getCategoriesError(msg) + ToastUtils.showShort("一键上报故障描述获取失败$msg") + canOneReport = false + } + + interface ClickListener { + fun openFaultReasonView() + fun openWorkOrderView() + } + + fun setClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + +} \ 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/WorkOrderView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/WorkOrderView.kt new file mode 100644 index 0000000000..25fb89a38b --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/WorkOrderView.kt @@ -0,0 +1,312 @@ +package com.mogo.eagle.core.function.hmi.bone.tab + +import android.annotation.SuppressLint +import android.content.Context +import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +import android.util.AttributeSet +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.animation.Animation +import android.view.animation.ScaleAnimation +import android.widget.EditText +import androidx.constraintlayout.widget.ConstraintLayout +import com.iflytek.cloud.ErrorCode +import com.iflytek.cloud.InitListener +import com.iflytek.cloud.RecognizerListener +import com.iflytek.cloud.RecognizerResult +import com.iflytek.cloud.SpeechError +import com.iflytek.cloud.SpeechRecognizer +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.data.deva.report.FaultDetailInfo +import com.mogo.eagle.core.data.deva.report.FaultInfo +import com.mogo.eagle.core.data.deva.report.WorkOrderReportInfo +import com.mogo.eagle.core.data.msgbox.FMInfoMsg +import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.JsonParser +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.tts.base.SpeechUtils +import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig +import kotlinx.android.synthetic.main.view_work_order.view.et_describe_input +import kotlinx.android.synthetic.main.view_work_order.view.iv_describe_audio +import kotlinx.android.synthetic.main.view_work_order.view.iv_time_add +import kotlinx.android.synthetic.main.view_work_order.view.iv_time_reduce +import kotlinx.android.synthetic.main.view_work_order.view.tv_occurrence_time +import kotlinx.android.synthetic.main.view_work_order.view.tv_work_order_cancel +import kotlinx.android.synthetic.main.view_work_order.view.tv_work_order_report +import kotlinx.android.synthetic.main.view_work_order.view.tv_work_order_time +import kotlinx.android.synthetic.main.view_work_order.view.wrap_radio_group +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch + +/** + * 工单上报视图 + */ +class WorkOrderView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoDevaToolsListener { + + private val TAG = "WorkOrderView" + + // 语音听写对象 + private var mIat: SpeechRecognizer? = null + // 用HashMap存储听写结果 + private val mIatResults: HashMap = LinkedHashMap() + + private var workOrderType = "" //工单问题类型 + private var workOrderOccurrenceTime = System.currentTimeMillis() //故障发生时间 + var ret = 0 // 函数调用返回值 + private var audioStatus = false + + init { + LayoutInflater.from(context).inflate(R.layout.view_work_order, this, true) + initView() + initEvent() + } + + private fun initView(){ + // 初始化识别无UI识别对象 + // 使用SpeechRecognizer对象,可根据回调消息自定义界面; + mIat = SpeechRecognizer.createRecognizer(context, mInitListener) + } + + @OptIn(DelicateCoroutinesApi::class) + @SuppressLint("SetTextI18n") + private fun initEvent(){ + CallerDevaToolsListenerManager.addListener(TAG, this) + //弹窗展示时间 + tv_work_order_time.text = resources.getString(R.string.work_order_time) + + millis2String(System.currentTimeMillis(), TimeUtils.getHourMinSecondFormat()) + + wrap_radio_group.setOnCheckedChangeListener{_, checkedId -> + when(checkedId){ + R.id.rb_type_software->{ + workOrderType = "软件" + } + R.id.rb_type_kit->{ + workOrderType = "套件" + } + R.id.rb_type_vehicle->{ + workOrderType = "车辆" + } + R.id.rb_type_capacity->{ + workOrderType = "运力" + } + R.id.rb_type_environment->{ + workOrderType = "环境" + } + R.id.rb_type_other->{ + workOrderType = "其他" + } + } + } + + //发生时间 + tv_occurrence_time.text = millis2String(workOrderOccurrenceTime, TimeUtils.getHourMinFormat()) + iv_time_reduce.setOnClickListener { + workOrderOccurrenceTime -= 60000 + tv_occurrence_time.text = millis2String(workOrderOccurrenceTime, TimeUtils.getHourMinFormat()) + } + iv_time_add.setOnClickListener { + if(workOrderOccurrenceTime + 60000 > System.currentTimeMillis()){ + ToastUtils.showShort("发生时间应在当前时间之前") + return@setOnClickListener + } + workOrderOccurrenceTime += 60000 + tv_occurrence_time.text = millis2String(workOrderOccurrenceTime, TimeUtils.getHourMinFormat()) + } + + et_describe_input.onFocusChangeListener = OnFocusChangeListener { v, hasFocus -> + val edit = v as EditText + if(hasFocus){ + edit.hint = "" + }else{ + edit.hint = "手动输入" + } + } + et_describe_input.addTextChangedListener(object: TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + + } + + override fun afterTextChanged(s: Editable?) { + + } + + }) + + //问题描述录音 + iv_describe_audio.setOnClickListener { + audioStatus = !audioStatus + setAudio(audioStatus) + } + + //上报 + tv_work_order_report.setOnClickListener { + //工单问题类型必选,没有选择,进行提示 + if(workOrderType.isEmpty()){ + ToastUtils.showShort("请选择问题类型") + return@setOnClickListener + } + if(et_describe_input.text.toString().isEmpty()){ + ToastUtils.showShort("请填写问题描述") + return@setOnClickListener + } + GlobalScope.launch(Dispatchers.IO){ + val msgBoxList = CallerMsgBoxManager.queryFMInfoList(context, + workOrderOccurrenceTime-120000,workOrderOccurrenceTime+120000) + val faultList = ArrayList() + msgBoxList?.forEach { msgBoxBean -> + val fmInfoMsg = msgBoxBean.bean as FMInfoMsg + fmInfoMsg.fmInfoList?.forEach { fault -> + val faultBean = FaultInfo(false,fault.faultId,fault.faultName, + fault.faultTime.toString(), FaultDetailInfo(fault.faultDesc) + ) + faultList.add(faultBean) + } + } + val workOrderReportInfo = WorkOrderReportInfo(workOrderType,workOrderOccurrenceTime.toString(), + et_describe_input.text.toString(), CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().longitude.toString(), + CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().latitude.toString(), + AppConfigInfo.plateNumber, SharedPrefsMgr.getInstance().getString("och_account","") , + BadCaseConfig.dockerVersion ?:"",faultList) + CallerDevaToolsManager.workOrderReport(workOrderReportInfo) + } + + } + + //取消 + tv_work_order_cancel.setOnClickListener { + this@WorkOrderView.visibility = View.GONE + } + + } + + private fun setAudio(status: Boolean){ + if(status){ + //开始录音 + mIat?.let { + //清空之前的内容 + mIatResults.clear() + SpeechUtils.setParam(it) + // 不显示听写对话框 + ret = it.startListening(mRecognizerListener) + if (ret != ErrorCode.SUCCESS) { + ToastUtils.showShort("听写失败,错误码:$ret,请点击网址https://www.xfyun.cn/document/error-code查询解决方案") + } + } + //开始录音,展示放大缩小动效 + val scaleAnimation = ScaleAnimation( + 1.0f, 0.8f, 1.0f, 0.8f, + Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f + ) + scaleAnimation.duration = 1000 + scaleAnimation.repeatCount = -1 + iv_describe_audio.startAnimation(scaleAnimation) + }else{ + //停止语音听写 + mIat?.stopListening() + //结束动画 + iv_describe_audio.clearAnimation() + } + } + + /** + * 初始化监听器。 + */ + private val mInitListener = InitListener { code -> + if (code != ErrorCode.SUCCESS) { + ToastUtils.showShort("讯飞语音听写初始化失败,错误码:$code") + } + } + + /** + * 听写监听器。 + */ + private val mRecognizerListener: RecognizerListener = object : RecognizerListener { + override fun onVolumeChanged(p0: Int, p1: ByteArray?) { + //showTip("当前正在说话,音量大小 = " + volume + " 返回音频数据 = " + data.length); + } + + override fun onBeginOfSpeech() { + // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入 + } + + override fun onEndOfSpeech() { + // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入 + } + + override fun onResult(results: RecognizerResult?, isLast: Boolean) { + results?.let { + printResult(it) + } + } + + override fun onError(p0: SpeechError?) { + // Tips: + // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。 + } + + override fun onEvent(p0: Int, p1: Int, p2: Int, p3: Bundle?) { + // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因 + // 若使用本地能力,会话id为null + // if (SpeechEvent.EVENT_SESSION_ID == eventType) { + // String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID); + // Log.d(TAG, "session id =" + sid); + // } + } + + } + + /** + * 显示结果 + */ + @SuppressLint("SetTextI18n") + private fun printResult(results: RecognizerResult) { + val text: String = JsonParser.parseIatResult(results.resultString) + Log.i(TAG, "语音内容=$text") + if(text.isNotEmpty()){ + if(et_describe_input.text.toString().isEmpty()){ + et_describe_input.setText(text) + et_describe_input.setSelection(text.length) + }else{ + val startStr = et_describe_input.text.toString().substring(0,et_describe_input.selectionStart) + val endStr = et_describe_input.text.toString().substring(et_describe_input.selectionEnd,et_describe_input.text.toString().length) + et_describe_input.setText(startStr+text+endStr) + et_describe_input.setSelection(startStr.length+text.length) + } + + } + } + + override fun workOrderReportSuccess() { + ToastUtils.showShort("工单上报成功") + ThreadUtils.runOnUiThread { + this@WorkOrderView.visibility = View.GONE + } + } + + override fun workOrderReportError() { + ToastUtils.showShort("工单上报失败") + } + +} \ 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 673b975272..31e17a63ae 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 @@ -13,6 +13,7 @@ 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.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.bone.toolkit.custom.ToolDriverRomaView import com.mogo.eagle.core.function.hmi.bone.toolkit.custom.ToolRestartSystemView @@ -161,7 +162,8 @@ object ToolKitDataManager : IToolKitItemClickListener { ToolTypeEnum.OPERATION_PANEL.name -> { ctx?.also { - SopView.sopView.toggle(it) +// SopView.sopView.toggle(it) + CallerHmiManager.toggleOperatePanel(true) } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/map/MapContainerLayout.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/map/MapContainerLayout.kt index ea0536e19b..722d9bf66e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/map/MapContainerLayout.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/map/MapContainerLayout.kt @@ -11,6 +11,8 @@ import android.view.animation.AccelerateDecelerateInterpolator import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintSet import com.mogo.eagle.core.data.map.MogoLatLng +import com.mogo.eagle.core.function.api.order.IOrderListener +import com.mogo.eagle.core.function.call.order.CallerOrderListenerManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.util.ConstraintUtil import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener @@ -20,13 +22,15 @@ import kotlinx.android.synthetic.main.view_map_container.view.mapBizView import kotlinx.android.synthetic.main.view_map_container.view.overMapView import kotlinx.android.synthetic.main.view_map_container.view.parentLayout import kotlinx.android.synthetic.main.view_map_container.view.shadowView +import kotlinx.android.synthetic.main.view_map_container.view.visualAngleToggle class MapContainerLayout @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr), IMogoMapListener { +) : ConstraintLayout(context, attrs, defStyleAttr), IMogoMapListener, IOrderListener { + @Volatile private var isScaled = false private var isPlayingAnim = false private var constraintUtil: ConstraintUtil? = null @@ -71,6 +75,7 @@ class MapContainerLayout @JvmOverloads constructor( override fun onAttachedToWindow() { super.onAttachedToWindow() MogoMapListenerHandler.mogoMapListenerHandler.registerHostMapListener("${TAG}${this.hashCode()}",this) + CallerOrderListenerManager.addListener("${TAG}${this.hashCode()}", this) } override fun onDetachedFromWindow() { @@ -90,6 +95,15 @@ class MapContainerLayout @JvmOverloads constructor( super.onMapClick(latLng) } + override fun onUpdateOrderStatus(inOrder: Boolean) { + super.onUpdateOrderStatus(inOrder) + if (!inOrder) {// 订单结束 + if (isScaled) {// 行程总览地图 + overMapView.clearAllMarkersAndPolyline() + } + } + } + private fun swapViewsWithAnim() { if (isPlayingAnim) return if (constraintUtil == null) { @@ -124,6 +138,11 @@ class MapContainerLayout @JvmOverloads constructor( overMapView.swapSettings() updateShadowBg(isScaled) isScaled = !isScaled + if (isScaled) { + visualAngleToggle?.takeIf { it.visibility == View.VISIBLE }?.visibility = View.GONE + } else { + visualAngleToggle?.takeIf { it.visibility != View.VISIBLE }?.visibility = View.VISIBLE + } } override fun onTransitionCancel(transition: Transition?) { 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 a4c2ba44e4..a72bdad6c9 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 @@ -2,14 +2,15 @@ package com.mogo.eagle.core.function.hmi.ui import android.content.Context 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 android.view.ViewStub import androidx.lifecycle.ProcessLifecycleOwner import androidx.lifecycle.lifecycleScope +import androidx.transition.Slide +import androidx.transition.TransitionManager import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.commons.module.status.MogoStatusManager import com.mogo.commons.voice.AIAssist @@ -36,6 +37,7 @@ 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 +import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.bone.status.fsm.FSMStatusDetailWindowManager import com.mogo.eagle.core.function.hmi.bone.toolkit.ToolKitDataManager import com.mogo.eagle.core.function.hmi.ui.camera.RoadVideoDialog @@ -66,8 +68,6 @@ import com.zhjt.service_biz.BizConfig import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import me.jessyan.autosize.utils.AutoSizeUtils -import java.lang.ref.WeakReference import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicReference @@ -95,8 +95,6 @@ class MoGoHmiProvider : IMoGoHmiProvider { private val xiaozhi by lazy { XiaoZhiStateManager() } - private val operatePanel by lazy { AtomicReference>(null) } - override fun init(context: Context?) { this.context = context } @@ -355,7 +353,7 @@ class MoGoHmiProvider : IMoGoHmiProvider { /** * 展示 FSM 异常状态弹框 */ - override fun showFSMExceptionStatusWindow(errorMsg: ArrayList) { + override fun showFSMExceptionStatusWindow(errorMsg: List) { context?.let { FSMStatusDetailWindowManager.fsmStatusDetailWindowManager.showExceptionStatus(it, errorMsg)} } @@ -451,26 +449,22 @@ class MoGoHmiProvider : IMoGoHmiProvider { return } if (show) { - if (operatePanel.get()?.get()?.isShowing() == true) { - return + var target = activity.findViewById(R.id.id_operate_panel) + if (target == null) { + val vs = activity.findViewById(R.id.vs_operate_panel) ?: throw AssertionError() + target = vs.inflate() + } + if (target != null && target.visibility != View.VISIBLE) { + TransitionManager.beginDelayedTransition(target.parent as ViewGroup, Slide(Gravity.START).also { it.duration = 150; it.addTarget(target) }) + target.visibility = View.VISIBLE + target.post { target.bringToFront() } } - MoGoPopWindow.Builder() - .attachToActivity(activity) - .gravityInActivity(Gravity.START or Gravity.TOP) - .contentView(OperatePanelLayout(activity)) - .width(AutoSizeUtils.dp2px(activity, 1000.0f)) - .height(WindowManager.LayoutParams.MATCH_PARENT) - .transition(Slide(Gravity.START), Slide(Gravity.START)) - .onDismissed { - operatePanel.set(null) - } - .build() - .also { - operatePanel.set(WeakReference(it)) - } - .show() } else { - operatePanel.get()?.get()?.hide() + val operatePanelView = activity.findViewById(R.id.id_operate_panel) + if (operatePanelView != null && operatePanelView.visibility == View.VISIBLE) { + TransitionManager.beginDelayedTransition(operatePanelView.parent as ViewGroup, Slide(Gravity.START).also { it.duration = 150; it.addTarget(operatePanelView) }) + operatePanelView.visibility = View.GONE + } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt index 3d8708f210..79fba3c154 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt @@ -5,99 +5,1024 @@ import android.os.Bundle import android.util.AttributeSet import android.util.Log import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup import android.widget.LinearLayout +import androidx.annotation.CallSuper import androidx.core.content.ContextCompat +import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import androidx.preference.PreferenceGroup import androidx.preference.PreferenceHeaderFragmentCompat +import androidx.preference.SwitchPreferenceCompat +import androidx.preference.TwoStatePreference +import androidx.preference.forEach +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.config.HmiBuildConfig +import com.mogo.eagle.core.data.multidisplay.TelematicConstant +import com.mogo.eagle.core.data.obu.MogoObuConst +import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangProvider +import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener +import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_DEMO +import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_RAIN +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager +import com.mogo.eagle.core.function.call.obu.CallerObuApiManager +import com.mogo.eagle.core.function.call.setting.CallerSopSettingManager +import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager +import com.mogo.eagle.core.function.call.unmanned.CallerUnmannedListenerManager import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.ui.operate.preferences.PreferenceWithMoFang +import com.mogo.eagle.core.function.hmi.ui.operate.preferences.PreferenceWithSpeedSetting +import com.mogo.eagle.core.function.hmi.ui.operate.preferences.PreferenceWithUnmanInterval +import com.mogo.eagle.core.function.hmi.ui.operate.preferences.PreferenceWithWelcomeWords +import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog.Companion.hmiAction +import com.mogo.eagle.core.function.hmi.ui.utils.SOPAnalyticsManager.clickEventAnalytics import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.rv.divider.CommonDividerItemDecoration +import com.mogo.eagle.core.utilcode.util.ToastUtils import kotlinx.android.synthetic.main.layout_operate_panel.view.iv_operate_panel_close +import me.jessyan.autosize.utils.AutoSizeUtils -class OperatePanelLayout: LinearLayout { +class OperatePanelLayout : LinearLayout { companion object { private const val TAG = "OperatePanelLayout" } - class PreferenceHeaderFragmentCompatImpl: PreferenceHeaderFragmentCompat() { + class PreferenceHeaderFragmentCompatImpl : PreferenceHeaderFragmentCompat() { + + private var header: PreferenceFragmentCompat? = null override fun onCreatePreferenceHeader(): PreferenceFragmentCompat { - Log.d(TAG, "--- onCreatePreferenceHeader ---") - return PreferenceHeader() + return PreferenceHeader().also { header = it } + } + + override fun onPrimaryNavigationFragmentChanged(isPrimaryNavigationFragment: Boolean) { + super.onPrimaryNavigationFragmentChanged(isPrimaryNavigationFragment) + val screen = header?.preferenceScreen + val count = screen?.preferenceCount ?: 0 + var curr = 0 + var perf: Preference? = null + while (curr < count) { + perf = screen?.getPreference(curr) + if (perf?.fragment != null) { + break + } + curr++ + } + if (perf != null) { + handleNaviBackground(perf) + } + } + + + override fun onPreferenceStartFragment(caller: PreferenceFragmentCompat, pref: Preference): Boolean { + try { + return super.onPreferenceStartFragment(caller, pref) + } finally { + handleNaviBackground(pref) + } + } + + private fun handleNaviBackground(pref: Preference) { + val position = (header?.listView?.adapter as? PreferenceGroup.PreferencePositionCallback)?.getPreferenceAdapterPosition(pref) + ?: RecyclerView.NO_POSITION + val prev = header?.listView?.getTag(R.id.operate_panel_header_last_selected) as? Int + ?: -1 + if (prev == position) { + return + } + if (position != RecyclerView.NO_POSITION) { + if (prev >= 0) { + header?.listView?.layoutManager?.findViewByPosition(prev)?.isSelected = false + } + header?.listView?.layoutManager?.findViewByPosition(position)?.isSelected = true + header?.listView?.setTag(R.id.operate_panel_header_last_selected, position) + } } } - class PreferenceHeader: PreferenceFragmentCompat() { + class PreferenceHeader : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - Log.d(TAG, "PreferenceHeader --- onCreatePreferences ---") - setPreferencesFromResource(R.xml.operate_preference_headers, rootKey) + setPreferencesFromResource(R.xml.operate_panel_preference_headers, rootKey) } } - class V2XPreferenceFragmentCompat: PreferenceFragmentCompat() { - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - Log.d(TAG, "V2XPreferenceFragmentCompat --- onCreatePreferences ---") - setPreferencesFromResource(R.xml.operate_preference_details_v2x, rootKey) + abstract class OperatePanelDetailBase : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setPreferenceChangeListener(preferenceScreen) + setPreferenceClickListener(preferenceScreen) + setDefaultVal(preferenceScreen) + setEnabled(preferenceScreen) + } + + protected open fun getDefaultVal(pref: Preference): Any? { + return null + } + + protected open fun isEnabled(pref: Preference): Boolean { + return true + } + + private fun setDefaultVal(pref: Preference) { + if (pref is PreferenceGroup) { + pref.forEach { + setDefaultVal(it) + } + } else { + if (!pref.isPersistent) { + val defVal = getDefaultVal(pref) + if (defVal != null) { + if (pref is TwoStatePreference) { + changeValue(pref, defVal as Boolean) + } else { + pref.setDefaultValue(defVal) + } + } + } else { //TODO renwj 处理持久化存储时,将持久化的值重新赋给业务层的静态变量 + } + } + } + + private fun setEnabled(pref: Preference) { + if (pref is PreferenceGroup) { + pref.forEach { + setEnabled(it) + } + } else { + val curr = isEnabled(pref) + val prev = pref.isEnabled + if (curr != prev) { + pref.isEnabled = curr + } + } + } + + private fun setPreferenceChangeListener(pref: Preference) { + if (pref is PreferenceGroup) { + pref.forEach { setPreferenceChangeListener(it) } + } else { + pref.onPreferenceChangeListener = this + } + } + + private fun setPreferenceClickListener(pref: Preference) { + if (pref is PreferenceGroup) { + pref.forEach { + setPreferenceClickListener(it) + } + } else { + pref.onPreferenceClickListener = this + } + } + + @Suppress("UNCHECKED_CAST") + fun Preference.findPreferenceReal(key: String): T? { + if (this is PreferenceGroup) { + this.forEach { + val find = it.findPreferenceReal(key) + if (find != null) { + return find + } + } + return null + } else { + return if (this.key == key) this as T else null + } + } + + fun changeValue(pref: TwoStatePreference, isChecked: Boolean) { + if (pref.isChecked != isChecked) { + pref.isChecked = isChecked + pref.callChangeListener(isChecked) + } + } + + @CallSuper + override fun onCreateRecyclerView(inflater: LayoutInflater, parent: ViewGroup, savedInstanceState: Bundle?): RecyclerView { + val rv = inflater.inflate(R.layout.layout_operate_panel_detail_recyclerview, parent, false) as RecyclerView + rv.addItemDecoration(CommonDividerItemDecoration.Builder().spanCountTBCare(false).verticalExternalSpace(AutoSizeUtils.dp2px(parent.context, 20.0f)).verticalInnerSpace(AutoSizeUtils.dp2px(parent.context, 30.0f)).externalSpaceEnd(true).build()) + rv.background = ContextCompat.getDrawable(parent.context, R.drawable.bg_operate_panel_preference_detail) + rv.layoutManager = onCreateLayoutManager() + return rv + } + + override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { + return !preference.isPersistent + } + + override fun onPreferenceClick(preference: Preference): Boolean { + return !preference.isPersistent } } + class V2XPreferenceFragmentCompat : OperatePanelDetailBase() { + + companion object { + private const val KEY_V2X_TOTAL_SWITCH = "v2x_total_switch" + private const val KEY_V2N_TOTAL_SWITCH = "v2n_total_switch" + private const val KEY_V2N_NEW_LINKED = "v2n_new_linked" + private const val KEY_V2N_NEW_LINKED_TO_PNC = "v2n_new_linked_to_pnc" + private const val KEY_V2N_NEW_LINKED_GREEN_WAVE = "v2n_new_linked_green_wave" + private const val KEY_V2I_TOTAL_SWITCH = "v2i_total_switch" + private const val KEY_V2I_TO_PNC = "v2i_to_pnc" + private const val KEY_V2I_RED_LIGHT_WARNING = "v2i_red_light_warning" + private const val KEY_V2I_WEAKNESS_TRAFFIC = "v2i_weakness_traffic" + private const val KEY_V2V_TOTAL_SWITCH = "v2v_total_switch" + private const val KEY_OBU_TOTAL_SWITCH = "obu_total_switch" + } - class DemoPreferenceFragmentCompat: PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - Log.d(TAG, "DemoPreferenceFragmentCompat --- onCreatePreferences ---") - setPreferencesFromResource(R.xml.operate_preference_details_demo, rootKey) + setPreferencesFromResource(R.xml.operate_panel_preference_details_v2x, rootKey) + } + + override fun getDefaultVal(pref: Preference): Any? { + when (pref.key) { + KEY_V2X_TOTAL_SWITCH -> { + return FunctionBuildConfig.v2xTotalSwitch + } + KEY_V2N_TOTAL_SWITCH -> { + return FunctionBuildConfig.v2nTotalSwitch + } + KEY_V2N_NEW_LINKED -> { + return FunctionBuildConfig.v2nNewLinked + } + KEY_V2N_NEW_LINKED_TO_PNC -> { + return FunctionBuildConfig.v2nNewLinkedToPNC + } + KEY_V2N_NEW_LINKED_GREEN_WAVE -> { + return FunctionBuildConfig.v2nGreenWave + } + KEY_V2I_TOTAL_SWITCH -> { + return HmiBuildConfig.v2iTotalSwitch + } + KEY_V2I_TO_PNC -> { + return FunctionBuildConfig.v2iToPNC + } + KEY_V2I_RED_LIGHT_WARNING -> { + return HmiBuildConfig.v2iRedLightWarning + } + KEY_V2I_WEAKNESS_TRAFFIC -> { + return HmiBuildConfig.v2iWeaknessTraffic + } + KEY_V2V_TOTAL_SWITCH -> { + return HmiBuildConfig.v2vTotalSwitch + } + KEY_OBU_TOTAL_SWITCH -> { + return CallerObuApiManager.isConnected() + } + } + return super.getDefaultVal(pref) + } + + override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { + Log.d(TAG, "-- onPreferenceChange:($preference, $newValue)") + when (preference.key) { + KEY_V2X_TOTAL_SWITCH -> { + val isChecked = newValue as? Boolean ?: false + FunctionBuildConfig.v2xTotalSwitch = isChecked + hmiAction("V2X总开关, ", isChecked) + clickEventAnalytics("V2X总开关", isChecked) + if (isChecked) { + preferenceScreen.findPreferenceReal(KEY_V2N_TOTAL_SWITCH)?.also { changeValue(it, FunctionBuildConfig.v2nTotalSwitch) } // V2N总开关 + preferenceScreen.findPreferenceReal(KEY_V2I_TOTAL_SWITCH)?.also { changeValue(it, HmiBuildConfig.v2iTotalSwitch) } // V2I总开关 + preferenceScreen.findPreferenceReal(KEY_V2V_TOTAL_SWITCH)?.also { changeValue(it, HmiBuildConfig.v2vTotalSwitch) } // V2V总开关 + preferenceScreen.findPreferenceReal(KEY_OBU_TOTAL_SWITCH)?.also { changeValue(it, CallerObuApiManager.isConnected()) } // OBU总开关 + } else { + preferenceScreen.findPreferenceReal(KEY_V2N_TOTAL_SWITCH)?.also { changeValue(it, false) } // V2N总开关 + preferenceScreen.findPreferenceReal(KEY_V2I_TOTAL_SWITCH)?.also { changeValue(it, false) } // V2I总开关 + preferenceScreen.findPreferenceReal(KEY_V2V_TOTAL_SWITCH)?.also { changeValue(it, false) } // V2V总开关 + preferenceScreen.findPreferenceReal(KEY_OBU_TOTAL_SWITCH)?.also { changeValue(it, false) } // OBU总开关 + } + return true + } + KEY_V2N_TOTAL_SWITCH -> { + val isChecked = newValue as? Boolean ?: false + FunctionBuildConfig.v2nTotalSwitch = isChecked + hmiAction("V2N总开关, ", isChecked) + clickEventAnalytics("V2N总开关", isChecked) + if (!isChecked) { + preferenceScreen.findPreferenceReal(KEY_V2N_NEW_LINKED)?.also { changeValue(it, false) } + preferenceScreen.findPreferenceReal(KEY_V2N_NEW_LINKED_TO_PNC)?.also { changeValue(it, false) } + preferenceScreen.findPreferenceReal(KEY_V2N_NEW_LINKED_GREEN_WAVE)?.also { changeValue(it, false) } + } + return true + } + KEY_V2N_NEW_LINKED -> { + val isChecked = newValue as? Boolean ?: false + FunctionBuildConfig.v2nNewLinked = isChecked + hmiAction("V2N新链路", isChecked) + clickEventAnalytics("V2N新链路", isChecked) + return true + } + KEY_V2N_NEW_LINKED_TO_PNC -> { + val isChecked = newValue as? Boolean ?: false + FunctionBuildConfig.v2nNewLinkedToPNC = isChecked + clickEventAnalytics("V2N场景进PNC", isChecked) + hmiAction("V2N场景进PNC, ", isChecked) + CallerAutoPilotControlManager.sendV2nToPncCmd(isChecked) + return true + } + KEY_V2N_NEW_LINKED_GREEN_WAVE -> { + val isChecked = newValue as? Boolean ?: false + FunctionBuildConfig.v2nGreenWave = isChecked + hmiAction("绿波通行", isChecked) + clickEventAnalytics("绿波通行", isChecked) + CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_GREENWAVE_WARNING, (if (isChecked) "1" else "0").toByteArray()) + return true + } + KEY_V2I_TOTAL_SWITCH -> { + val isChecked = newValue as? Boolean ?: false + HmiBuildConfig.v2iTotalSwitch = isChecked + hmiAction("V2I总开关, ", isChecked) + clickEventAnalytics("V2I总开关", isChecked) + return true + } + KEY_V2I_TO_PNC -> { + val isChecked = newValue as? Boolean ?: false + FunctionBuildConfig.v2iToPNC = isChecked + CallerAutoPilotControlManager.sendV2iToPncCmd(isChecked) + hmiAction("V2I场景进PNC, ", isChecked) + clickEventAnalytics("V2I场景进PNC", isChecked) + return true + } + KEY_V2I_RED_LIGHT_WARNING -> { + val isChecked = newValue as? Boolean ?: false + HmiBuildConfig.v2iRedLightWarning = isChecked + CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_RUNREDLIGHT_WARNING, (if (isChecked) "1" else "0").toByteArray()) + clickEventAnalytics("V2I闯红灯预警", isChecked) + hmiAction("V2I闯红灯预警, ", isChecked) + return true + } + KEY_V2I_WEAKNESS_TRAFFIC -> { + val isChecked = newValue as? Boolean ?: false + HmiBuildConfig.v2iWeaknessTraffic = isChecked + clickEventAnalytics("V2I弱势交通参与者", isChecked) + hmiAction("V2I弱势交通参与者, ", isChecked) + return true + } + KEY_V2V_TOTAL_SWITCH -> { + val isChecked = newValue as? Boolean ?: false + HmiBuildConfig.v2vTotalSwitch = isChecked + clickEventAnalytics("V2V总开关", isChecked) + hmiAction("V2V总开关, ", isChecked) + return true + } + KEY_OBU_TOTAL_SWITCH -> { + val isChecked = newValue as? Boolean ?: false + if (!isChecked) { + CallerObuApiManager.disConnectObu() // 断开OBU连接 + } else { + val isObuConnected = CallerObuApiManager.isConnected() + if (isObuConnected) { + CallerObuApiManager.resetObuIpAddress(MogoObuConst.OBU_DEFAULT_IP) + } + } + clickEventAnalytics("OBU控制总开关", isChecked) + hmiAction("OBU控制总开关, ", isChecked) + return true + } + } + return super.onPreferenceChange(preference, newValue) } } - class HdMapPreferenceFragmentCompat: PreferenceFragmentCompat() { + class DemoPreferenceFragmentCompat : OperatePanelDetailBase() { + + companion object { + private const val KEY_DEMO_SWITCH = "demo_switch" + private const val KEY_RECORD_BAG_DIALOG = "record_bag_dialog" + private const val KEY_TAKE_OVER_WAKE = "take_over_wake" + } + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - Log.d(TAG, "HdMapPreferenceFragmentCompat --- onCreatePreferences ---") - setPreferencesFromResource(R.xml.operate_preference_details_hdmap, rootKey) + setPreferencesFromResource(R.xml.operate_panel_preference_details_demo, rootKey) + } + + override fun getDefaultVal(pref: Preference): Any? { + when (pref.key) { + KEY_DEMO_SWITCH -> { + return FunctionBuildConfig.isDemoMode + } + KEY_RECORD_BAG_DIALOG -> { + return FunctionBuildConfig.isShowBagRecordWindow + } + KEY_TAKE_OVER_WAKE -> { + return FunctionBuildConfig.isTakeoverRemind + } + } + return super.getDefaultVal(pref) + } + + override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { + when (preference.key) { + KEY_DEMO_SWITCH -> { + val isChecked = newValue as? Boolean ?: false + hmiAction("SOP 演示模式开关, ", !FunctionBuildConfig.isDemoMode) + clickEventAnalytics("美化模式", isChecked) + FunctionBuildConfig.isDemoMode = !FunctionBuildConfig.isDemoMode + CallerAutoPilotControlManager.setDemoMode(FunctionBuildConfig.isDemoMode) + CallerHmiViewControlListenerManager.invokeFuncMode(FUNC_MODE_DEMO, FunctionBuildConfig.isDemoMode) + CallerSopSettingManager.invokeDemoModeListener(isChecked) + if (!FunctionBuildConfig.isDemoMode) { //关闭美化模式时,通知工控机 + CallerAutoPilotControlManager.setIPCDemoMode(FunctionBuildConfig.isDemoMode) + } + } + KEY_RECORD_BAG_DIALOG -> { + val isChecked = newValue as? Boolean ?: false + FunctionBuildConfig.isShowBagRecordWindow = isChecked + hmiAction("SOP 是否展示录包弹窗, ", isChecked) + clickEventAnalytics("录包弹窗", isChecked) + } + KEY_TAKE_OVER_WAKE -> { + val isChecked = newValue as? Boolean ?: false + FunctionBuildConfig.isTakeoverRemind = isChecked + hmiAction("SOP 是否展示接管提醒, ", isChecked) + clickEventAnalytics("接管提醒", isChecked) + } + } + return super.onPreferenceChange(preference, newValue) } } - class BusinessPreferenceFragmentCompat: PreferenceFragmentCompat() { + class HdMapPreferenceFragmentCompat : OperatePanelDetailBase() { + companion object { + private const val KEY_DANGER_OBSTACLES_COLOR_MARK = "danger_obstacles_color_mark" + private const val KEY_ROUTE_GUIDE_LINE_DYNAMIC_EFFECT = "route_guide_line_dynamic_effect" + private const val KEY_POINT_CLOUD_EFFECT = "point_cloud_effect" + private const val KEY_SELF_CAR_APERTURE = "self_car_aperture" + } + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - Log.d(TAG, "BusinessPreferenceFragmentCompat --- onCreatePreferences ---") - setPreferencesFromResource(R.xml.operate_preference_details_business, rootKey) + setPreferencesFromResource(R.xml.operate_panel_preference_details_hdmap, rootKey) + } + + override fun getDefaultVal(pref: Preference): Any? { + when (pref.key) { + KEY_DANGER_OBSTACLES_COLOR_MARK -> { + return FunctionBuildConfig.isPNCWarning + } + KEY_POINT_CLOUD_EFFECT -> { + return FunctionBuildConfig.isDrawPointCloudData + } + KEY_ROUTE_GUIDE_LINE_DYNAMIC_EFFECT -> { + return HmiBuildConfig.isShowRouteStrategy + } + KEY_SELF_CAR_APERTURE -> { + return FunctionBuildConfig.isDrawPointCloudData || FunctionBuildConfig.isDisplayAnimEnable + } + } + return super.getDefaultVal(pref) + } + + override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { + when (preference.key) { + KEY_DANGER_OBSTACLES_COLOR_MARK -> { + val isChecked = newValue as? Boolean ?: false + hmiAction("SOP 危险障碍物颜色标记开关, ", isChecked) + clickEventAnalytics("危险障碍物颜色标记", isChecked) + FunctionBuildConfig.isPNCWarning = isChecked + return true + } + KEY_ROUTE_GUIDE_LINE_DYNAMIC_EFFECT -> { + val isChecked = newValue as? Boolean ?: false + hmiAction("SOP 引导线动态效果, ", isChecked) + clickEventAnalytics("引导线动态效果", isChecked) + HmiBuildConfig.isShowRouteStrategy = isChecked + CallerDevaToolsManager.setRouteDynamicColorEnable(isChecked) + return true + } + KEY_POINT_CLOUD_EFFECT -> { + val isChecked = newValue as? Boolean + ?: false //打开点云效果时,如果自车光圈是关闭状态,则自动打开自车光圈(点云是跟随光圈的 默认没有光圈就不显示点云的) + if (isChecked && !FunctionBuildConfig.isDisplayAnimEnable) { + preferenceScreen.findPreferenceReal(KEY_SELF_CAR_APERTURE)?.also { changeValue(it, true) } + } else { + preferenceScreen.findPreferenceReal(KEY_SELF_CAR_APERTURE)?.also { changeValue(it, FunctionBuildConfig.isDisplayAnimEnable) } + } + CallerAutoPilotControlManager.setIsDrawPointCloud(isChecked) + FunctionBuildConfig.isDrawPointCloudData = isChecked + CallerMapUIServiceManager.getMapUIController()?.setIsDrawPointCloud(isChecked) + CallerSopSettingManager.invokePointCloudListener(isChecked) + hmiAction("SOP 是否渲染点云数据, ", isChecked) + clickEventAnalytics("点云效果", isChecked) + return true + } + KEY_SELF_CAR_APERTURE -> { + val isChecked = newValue as? Boolean ?: false + CallerMapUIServiceManager.getMapUIController()?.setDisplayAnimEnable(isChecked) + CallerSopSettingManager.invokeCarApertureListener(isChecked) + hmiAction("SOP 是否展示自车光圈,", isChecked) + FunctionBuildConfig.isDisplayAnimEnable = isChecked + clickEventAnalytics("自车光圈", isChecked) + return true + } + } + return super.onPreferenceChange(preference, newValue) } } - class MoFangPreferenceFragmentCompat: PreferenceFragmentCompat() { + class BusinessPreferenceFragmentCompat : OperatePanelDetailBase() { + + companion object { + private const val KEY_RED_OR_GREEN_LIGHT_MARKER = "red_or_green_light_marker" + private const val KEY_RED_OR_GREEN_LIGHT_MERGE_MARKER = "red_or_green_light_merge_marker" + private const val KEY_FAULT_REPORT_TIP = "fault_report_tip" + private const val KEY_LIMIT_SPEED_MARKER = "limit_speed_marker" + private const val KEY_SELF_ROUTING_VERIFY_MODE = "self_routing_verify_mode" + private const val KEY_LOOK_AROUND_360 = "look_around_360" + private const val KEY_WEATHER_EFFECT_SWITCH = "weather_effect_switch" + private const val KEY_SYSTEM_BOOT_STATUS_SHOW = "system_boot_status_show" + private const val KEY_UNMANNED_DEMO_PULL_INTERVAL = "unmanned_demo_pull_interval" + } + + override fun getDefaultVal(pref: Preference): Any? { + when (pref.key) { + KEY_RED_OR_GREEN_LIGHT_MARKER -> { + return HmiBuildConfig.isShowTrafficLightView + } + KEY_RED_OR_GREEN_LIGHT_MERGE_MARKER -> { + return HmiBuildConfig.isShowCarSourceTrafficLightView + } + KEY_FAULT_REPORT_TIP -> { + return FunctionBuildConfig.isReportWarning + } + KEY_LIMIT_SPEED_MARKER -> { + return HmiBuildConfig.isShowLimitingVelocityView + } + KEY_SELF_ROUTING_VERIFY_MODE -> { + return CallerHmiManager.isTaxiUnmanedDriverLineRoutingVerifyMode() + } + KEY_LOOK_AROUND_360 -> { + return CallerHmiManager.isM1360LookAroundShowing() + } + KEY_WEATHER_EFFECT_SWITCH -> { + return FunctionBuildConfig.weatherEffectSwitch + } + KEY_SYSTEM_BOOT_STATUS_SHOW -> { + return HmiBuildConfig.isShowConnectionProgressView + } + KEY_UNMANNED_DEMO_PULL_INTERVAL -> { + return CallerUnmannedListenerManager.getVirtualTaskPullTaskIntervalF() + } + } + return super.getDefaultVal(pref) + } + + override fun isEnabled(pref: Preference): Boolean { + return when (pref.key) { + KEY_SELF_ROUTING_VERIFY_MODE -> { + AppIdentityModeUtils.isTaxiDriver(FunctionBuildConfig.appIdentityMode) + } + KEY_LOOK_AROUND_360 -> { + AppIdentityModeUtils.isM1(FunctionBuildConfig.appIdentityMode) + } + KEY_WEATHER_EFFECT_SWITCH -> { + AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) + } + else -> super.isEnabled(pref) + } + } + + override fun onPreferenceClick(preference: Preference): Boolean { + if (preference.key == KEY_UNMANNED_DEMO_PULL_INTERVAL) { + val interval = PreferenceWithUnmanInterval.Interval.values().find { it.ordinal == preference.extras.getInt(PreferenceWithUnmanInterval.KEY_BUNDLE_CURRENT_INTERVAL) } + Log.d(TAG, "业务类->onPreferenceClick: $interval") + if (interval != null) { + when (interval) { + PreferenceWithUnmanInterval.Interval.FIVE_SECOND -> CallerUnmannedListenerManager.dispatchVirtualTaskPullTaskInterval(5) + PreferenceWithUnmanInterval.Interval.FIFTEEN_SECOND -> CallerUnmannedListenerManager.dispatchVirtualTaskPullTaskInterval(15) + PreferenceWithUnmanInterval.Interval.THIRTY_SECOND -> CallerUnmannedListenerManager.dispatchVirtualTaskPullTaskInterval(30) + PreferenceWithUnmanInterval.Interval.FORTY_FIVE_SECOND -> CallerUnmannedListenerManager.dispatchVirtualTaskPullTaskInterval(45) + PreferenceWithUnmanInterval.Interval.NEVER -> CallerUnmannedListenerManager.dispatchVirtualTaskPullTaskInterval(-1) + } + clickEventAnalytics("Taxi无人化演练任务拉取时间间隔",true) + } + } + return super.onPreferenceClick(preference) + } + + override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { + when (preference.key) { + KEY_RED_OR_GREEN_LIGHT_MARKER -> { + val isChecked = newValue as? Boolean ?: false + hmiAction("SOP 红绿灯标识开关, ", isChecked) + clickEventAnalytics("红绿灯标识", isChecked) + if (isChecked) { + CallerHmiManager.showTrafficLightView() + } else { + CallerHmiManager.hideTrafficLightView() + } + return true + } + KEY_RED_OR_GREEN_LIGHT_MERGE_MARKER -> { + val isChecked = newValue as? Boolean ?: false + hmiAction("SOP 红绿灯车端来源标识开关, ", isChecked) + clickEventAnalytics("红绿灯车端融合标识", isChecked) + HmiBuildConfig.isShowCarSourceTrafficLightView = isChecked + return true + } + KEY_FAULT_REPORT_TIP -> { + val isChecked = newValue as? Boolean ?: false + hmiAction("SOP 是否开启异常上报, ", isChecked) + clickEventAnalytics("异常上报提示", isChecked) + FunctionBuildConfig.isReportWarning = isChecked + return true + } + KEY_LIMIT_SPEED_MARKER -> { + val isChecked = newValue as? Boolean ?: false + hmiAction("SOP 限速标识开关, ", isChecked) + clickEventAnalytics("限速标识", isChecked) + if (isChecked) { + HmiBuildConfig.isShowLimitingVelocityView = true + CallerHmiViewControlListenerManager.invokeVisible(IViewControlListener.LimitingVelocityView_TAG, View.VISIBLE) + } else { + HmiBuildConfig.isShowLimitingVelocityView = false + CallerHmiViewControlListenerManager.invokeVisible(IViewControlListener.LimitingVelocityView_TAG, View.GONE) + } + return true + } + KEY_SELF_ROUTING_VERIFY_MODE -> { + val isChecked = newValue as? Boolean ?: false + if (isChecked) { + if (CallerHmiManager.isTaxiUnmanedDriverPerformTask()) { + ToastUtils.showLong("请先结束当前任务") + preferenceScreen.findPreferenceReal(KEY_SELF_ROUTING_VERIFY_MODE)?.also { changeValue(it, false) } + return true + } + if (CallerHmiManager.isTaxiUnmanedDriverTakingOrders()) { + ToastUtils.showLong("请先结束接单状态") + preferenceScreen.findPreferenceReal(KEY_SELF_ROUTING_VERIFY_MODE)?.also { changeValue(it, false) } + return true + } + CallerHmiManager.setTaxiUnmanedDriverLineRoutingVerifyMode(true) + } else { + if (CallerHmiManager.isTaxiUnmanedDriverLineRoutingPerformTask()) { + ToastUtils.showLong("请先结束当前任务") + preferenceScreen.findPreferenceReal(KEY_SELF_ROUTING_VERIFY_MODE)?.also { changeValue(it, true) } + return true + } + CallerHmiManager.setTaxiUnmanedDriverLineRoutingVerifyMode(false) + } + clickEventAnalytics("自主算路验证模式", isChecked) + return true + } + KEY_LOOK_AROUND_360 -> { + val isChecked = newValue as? Boolean ?: false + if (isChecked) { + CallerHmiManager.showM1360LookAround() + } else { + CallerHmiManager.hidM1360LookAround() + } + clickEventAnalytics("360环视", isChecked) + return true + } + KEY_WEATHER_EFFECT_SWITCH -> { + val isChecked = newValue as? Boolean ?: false + FunctionBuildConfig.weatherEffectSwitch = isChecked + CallerLogger.d(TAG, "发送开关数据:${isChecked}到乘客屏") + CallerTelematicManager.sendMsgToAllClients(TelematicConstant.WEATHER_SWITCH_STATUS, (if (isChecked) "1" else "0").toByteArray()) + clickEventAnalytics("天气效果开关", isChecked) + } + KEY_SYSTEM_BOOT_STATUS_SHOW -> { + val isChecked = newValue as? Boolean ?: false + hmiAction("SOP 系统启动状态展示, ", isChecked) + clickEventAnalytics("系统启动状态展示", isChecked) + HmiBuildConfig.isShowConnectionProgressView = isChecked + CallerHmiViewControlListenerManager.updateConnectionProgressView(isChecked) + } + } + return super.onPreferenceChange(preference, newValue) + } + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - Log.d(TAG, "MoFangPreferenceFragmentCompat --- onCreatePreferences ---") - setPreferencesFromResource(R.xml.operate_preference_details_mofang, rootKey) + setPreferencesFromResource(R.xml.operate_panel_preference_details_business, rootKey) } } - class VehiclesPreferenceFragmentCompat: PreferenceFragmentCompat() { - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - Log.d(TAG, "VehiclesPreferenceFragmentCompat --- onCreatePreferences ---") - setPreferencesFromResource(R.xml.operate_preference_details_vehicles, rootKey) + class MoFangPreferenceFragmentCompat : OperatePanelDetailBase(), IMoGoMoFangProvider.OnMoFangStatusListener { + + companion object { + private const val TAG = "MoFangPreferenceFragmentCompat" + private const val KEY_MOFANG_CONNECT = "mofang_connect" + private const val KEY_MOFANG_COMMAND_TEST = "mofang_command_test" } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + CallerDevaToolsManager.mofang()?.registerMoFangStatusListener(TAG, this) + } + + override fun onDestroyView() { + super.onDestroyView() + CallerDevaToolsManager.mofang()?.unRegisterMoFangStatusListener(this) + } + + override fun onMoFangConnected() { + preferenceScreen.findPreferenceReal(KEY_MOFANG_CONNECT)?.updateStatus(PreferenceWithMoFang.MoFangConnectStatus.CONNECTED) + } + + override fun onMoFangDisconnected() { + preferenceScreen.findPreferenceReal(KEY_MOFANG_CONNECT)?.updateStatus(PreferenceWithMoFang.MoFangConnectStatus.CONNECT_START) + } + + override fun onPreferenceClick(preference: Preference): Boolean { + Log.d(TAG, "mofang -> onPreferenceClick -> $preference") + when (preference.key) { + KEY_MOFANG_CONNECT -> { + val status = PreferenceWithMoFang.MoFangConnectStatus.values().find { it.ordinal == preference.extras.getInt(PreferenceWithMoFang.KEY_CURRENT_CONNECT_STATUS) } + when (status) { + PreferenceWithMoFang.MoFangConnectStatus.CONNECT_START -> { + CallerDevaToolsManager.mofang()?.connect() + } + PreferenceWithMoFang.MoFangConnectStatus.CONNECTED -> { + CallerDevaToolsManager.mofang()?.disconnect() + } + else -> { + Log.d(TAG, "-- onPreferenceClick else --:pref -> $preference") + } + } + return true + } + } + return super.onPreferenceClick(preference) + } + + override fun getDefaultVal(pref: Preference): Any? { + if (pref.key == KEY_MOFANG_CONNECT) { + val provider = CallerDevaToolsManager.mofang() + if (provider != null) { + return if (provider.isConnected()) { + PreferenceWithMoFang.MoFangConnectStatus.CONNECTED.ordinal + } else { + PreferenceWithMoFang.MoFangConnectStatus.CONNECT_START.ordinal + } + } + } else if (pref.key == KEY_MOFANG_COMMAND_TEST) { + return CallerDevaToolsManager.mofang()?.isEnableTest() ?: false + } + return super.getDefaultVal(pref) + } + + override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { + if (preference.key == KEY_MOFANG_COMMAND_TEST) { + val isChecked = newValue as? Boolean ?: false + CallerDevaToolsManager.mofang()?.enableTest(isChecked) + return true + } + return super.onPreferenceChange(preference, newValue) + } + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + setPreferencesFromResource(R.xml.operate_panel_preference_details_mofang, rootKey) + } + } + + class VehiclesPreferenceFragmentCompat : OperatePanelDetailBase() { + companion object { + private const val KEY_PNC_PARK_INTERSECTION_CAR = "pnc_park_intersection_car" + private const val KEY_PNC_PARK_OVERTAKE_CAR = "pnc_park_overtake_car" + private const val KEY_DETOUR_RETARD_PARK = "detour_retard_park" + private const val KEY_RAIN_DAY = "rain_day" + private const val KEY_FAULT_DECELERATION_PARK = "fault_deceleration_park" + private const val KEY_WEAK_NET_DECELERATION_PARK = "weak_net_deceleration_park" + private const val KEY_EXAM_FUNCTION_PANEL = "exam_function_panel" + private const val KEY_ALL_MERGE_MODE = "all_merge_mode" + private const val KEY_BLIND_AREA_MODE = "blind_area_mode" + private const val KEY_BEYOND_VISUAL_RANGE_MODE = "beyond_visual_range_mode" + private const val KEY_TRANSPARENT_TRANSFER_MODE = "transparent_transfer_mode" + private const val KEY_PURE_OBU_MODE = "pure_obu_mode" + private const val KEY_AUTO_PILOT_SPEED_THRESHOLDS = "auto_pilot_speed_thresholds" + private const val KEY_CHANGE_LANE_SPEED_THRESHOLDS = "change_lane_speed_thresholds" + private const val KEY_OVERTAKE_SPEED_THRESHOLDSS = "overtake_speed_thresholds" + } + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + setPreferencesFromResource(R.xml.operate_panel_preference_details_vehicles, rootKey) + } + + override fun isEnabled(pref: Preference): Boolean { + when (pref.key) { + KEY_AUTO_PILOT_SPEED_THRESHOLDS, KEY_OVERTAKE_SPEED_THRESHOLDSS -> { + return !AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) + } + } + return super.isEnabled(pref) + } + + override fun getDefaultVal(pref: Preference): Any? { + when (pref.key) { + KEY_PNC_PARK_INTERSECTION_CAR -> { + return FunctionBuildConfig.isOpenParkVehCross + } + KEY_PNC_PARK_OVERTAKE_CAR -> { + return FunctionBuildConfig.isOpenOvertake + } + KEY_DETOUR_RETARD_PARK -> { + return FunctionBuildConfig.isDetouring + } + KEY_RAIN_DAY -> { + return FunctionBuildConfig.isRainMode + } + KEY_WEAK_NET_DECELERATION_PARK -> { + return FunctionBuildConfig.isWeakNetSlowDown + } + KEY_FAULT_DECELERATION_PARK -> { + return FunctionBuildConfig.isFaultSlowDown + } + KEY_ALL_MERGE_MODE -> { + return FunctionBuildConfig.fusionMode == 1 + } + KEY_BLIND_AREA_MODE -> { + return FunctionBuildConfig.fusionMode == 2 + } + KEY_BEYOND_VISUAL_RANGE_MODE -> { + return FunctionBuildConfig.fusionMode == 3 + } + KEY_TRANSPARENT_TRANSFER_MODE -> { + return FunctionBuildConfig.fusionMode == 4 + } + KEY_PURE_OBU_MODE -> { + return FunctionBuildConfig.fusionMode == 5 + } + KEY_CHANGE_LANE_SPEED_THRESHOLDS -> { + return setOf("3.0", "7.0", "${FunctionBuildConfig.detouringSpeed}", "0.5") + } + KEY_OVERTAKE_SPEED_THRESHOLDSS -> { + return setOf("3.0", "12.5", "${FunctionBuildConfig.overTakeSpeed}", "0.5") + } + KEY_AUTO_PILOT_SPEED_THRESHOLDS -> { //TODO renwj 自动驾驶速度阈值,旧版本没有看到 + } + } + return super.getDefaultVal(pref) + } + + override fun onPreferenceClick(preference: Preference): Boolean { + Log.d(TAG, "-- onPreferenceClick --:pref -> $preference") + when (preference.key) { + KEY_AUTO_PILOT_SPEED_THRESHOLDS -> { + FunctionBuildConfig.detouringSpeed = preference.extras.getFloat(PreferenceWithSpeedSetting.KEY_BUNDLE_CURRENT_VALUE, FunctionBuildConfig.detouringSpeed.toFloat()).toInt() + hmiAction("SOP 变道绕障的目标障碍物速度阈值", FunctionBuildConfig.detouringSpeed) + val isSuccess = CallerAutoPilotControlManager.sendDetouringSpeed(FunctionBuildConfig.detouringSpeed.toDouble()) + if (isSuccess == true) { + ToastUtils.showShort("变道绕障的目标障碍物速度阈值设置成功") + hmiAction("SOP 变道绕障的目标障碍物速度阈值设置", "成功") + } else { + ToastUtils.showShort("变道绕障的目标障碍物速度阈值设置失败") + hmiAction("SOP 变道绕障的目标障碍物速度阈值设置", "失败") + } + clickEventAnalytics("变道速度阈值", true) + } + KEY_OVERTAKE_SPEED_THRESHOLDSS -> { + FunctionBuildConfig.overTakeSpeed = preference.extras.getFloat(PreferenceWithSpeedSetting.KEY_BUNDLE_CURRENT_VALUE, FunctionBuildConfig.overTakeSpeed) + val isSuccess = CallerAutoPilotControlManager.sendOvertakeMaxSpeed(FunctionBuildConfig.overTakeSpeed.toDouble()) + if (isSuccess == true) { + ToastUtils.showShort("SOP 超车目标障碍物速度阈值设置成功") + hmiAction("SOP 超车目标障碍物速度阈值设置", "成功") + } else { + ToastUtils.showShort("SOP 超车目标障碍物速度阈值设置失败") + hmiAction("SOP 超车目标障碍物速度阈值设置", "失败") + } + clickEventAnalytics("超车速度阈值", true) + } + } + return super.onPreferenceClick(preference) + } + + override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { + when (preference.key) { + KEY_PNC_PARK_INTERSECTION_CAR -> { + val isChecked = newValue as? Boolean ?: false + hmiAction("SOP PNC-park-会车, ", isChecked) + CallerAutoPilotControlManager.sendParkVehCross(isChecked) + FunctionBuildConfig.isOpenParkVehCross = isChecked + } + KEY_PNC_PARK_OVERTAKE_CAR -> { + val isChecked = newValue as? Boolean ?: false + hmiAction("SOP PNC-park-超车, ", isChecked) + CallerAutoPilotControlManager.sendParkVehOvertake(isChecked) + FunctionBuildConfig.isOpenOvertake = isChecked + } + KEY_DETOUR_RETARD_PARK -> { + val isChecked = newValue as? Boolean ?: false + hmiAction("SOP 绕障类功能开关, ", isChecked) + CallerAutoPilotControlManager.sendDetouring(isChecked) + FunctionBuildConfig.isDetouring = isChecked + clickEventAnalytics("绕障类功能", isChecked) + } + KEY_RAIN_DAY -> { + val isChecked = newValue as? Boolean ?: false + hmiAction("SOP 雨天模式开关, ", isChecked) + clickEventAnalytics("雨天模式", isChecked) + FunctionBuildConfig.isRainMode = isChecked + CallerAutoPilotControlManager.setRainMode(isChecked) + CallerHmiViewControlListenerManager.invokeFuncMode(FUNC_MODE_RAIN, isChecked) + CallerSopSettingManager.invokeRainModeListener(isChecked) + } + KEY_WEAK_NET_DECELERATION_PARK -> { + val isChecked = newValue as? Boolean ?: false + FunctionBuildConfig.isWeakNetSlowDown = isChecked + CallerAutoPilotControlManager.sendWeakNetSlowDown(isChecked) + hmiAction("SOP 弱网减速停车, ", isChecked) + clickEventAnalytics("弱网减速停车", isChecked) + } + KEY_FAULT_DECELERATION_PARK -> { + val isChecked = newValue as? Boolean ?: false + FunctionBuildConfig.isFaultSlowDown = isChecked + CallerAutoPilotControlManager.sendBreakdownSlowDown(isChecked) + hmiAction("SOP 故障减速停车, ", isChecked) + clickEventAnalytics("故障减速停车", isChecked) + } + KEY_EXAM_FUNCTION_PANEL -> { + val isChecked = newValue as? Boolean ?: false + FunctionBuildConfig.isShowExamWindow = isChecked + CallerDevaToolsManager.showExamControlWindow(isChecked) + hmiAction("SOP 考试功能面板, ", isChecked) + clickEventAnalytics("考试功能面板", isChecked) + } + KEY_ALL_MERGE_MODE -> { + FunctionBuildConfig.fusionMode = 1 + hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode) + clickEventAnalytics("融合模式", true) + CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode) + } + KEY_BLIND_AREA_MODE -> { + FunctionBuildConfig.fusionMode = 2 + hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode) + clickEventAnalytics("融合模式", true) + CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode) + } + KEY_BEYOND_VISUAL_RANGE_MODE -> { + FunctionBuildConfig.fusionMode = 3 + hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode) + clickEventAnalytics("融合模式", true) + CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode) + } + KEY_TRANSPARENT_TRANSFER_MODE -> { + FunctionBuildConfig.fusionMode = 4 + hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode) + clickEventAnalytics("融合模式", true) + CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode) + } + KEY_PURE_OBU_MODE -> { + FunctionBuildConfig.fusionMode = 5 + hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode) + clickEventAnalytics("融合模式", true) + CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode) + } + } + return super.onPreferenceChange(preference, newValue) + } + } + + class WelcomeWordsPreferenceCompat : OperatePanelDetailBase() { + + + companion object { + private const val KEY_WELCOME_WORDS = "welcome_words" + } + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + setPreferencesFromResource(R.xml.operate_panel_preference_details_welcome_words, rootKey) + } + + override fun getDefaultVal(pref: Preference): Any? { + if (pref.key == KEY_WELCOME_WORDS) { + return FunctionBuildConfig.welcomeWords + } + return super.getDefaultVal(pref) + } + + override fun onPreferenceClick(preference: Preference): Boolean { + if (preference.key == KEY_WELCOME_WORDS) { + FunctionBuildConfig.welcomeWords = preference.extras.getString(PreferenceWithWelcomeWords.KEY_BUNDLE_CURRENT_EDIT_TEXT_VALUE) + hmiAction("外屏欢迎语", FunctionBuildConfig.welcomeWords ?: "") + clickEventAnalytics("外屏欢迎语", true) + } + return super.onPreferenceClick(preference) + } + } constructor(context: Context) : this(context, null) constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { orientation = VERTICAL - Log.d(TAG, "--- init ----") LayoutInflater.from(context).inflate(R.layout.layout_operate_panel, this, true) background = ContextCompat.getDrawable(context, R.drawable.bg_operate_panel) iv_operate_panel_close?.onClick { CallerHmiManager.toggleOperatePanel(false) } - } - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - Log.d(TAG, "--- onAttachedToWindow ---") - } - - override fun onDetachedFromWindow() { - super.onDetachedFromWindow() - Log.d(TAG, "--- onDetachedFromWindow ---") + isClickable = true } } \ 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/ui/operate/preferences/PreferenceWithMoFang.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/preferences/PreferenceWithMoFang.kt new file mode 100644 index 0000000000..9c8cc6b8e2 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/preferences/PreferenceWithMoFang.kt @@ -0,0 +1,69 @@ +package com.mogo.eagle.core.function.hmi.ui.operate.preferences + +import android.content.Context +import android.util.AttributeSet +import androidx.core.content.ContextCompat +import androidx.preference.Preference +import androidx.preference.PreferenceViewHolder +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.kotlin.onClick + +class PreferenceWithMoFang: Preference { + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) + constructor(context: Context) : super(context) + + companion object { + const val KEY_CURRENT_CONNECT_STATUS = "key_mofang_connect_status" + } + + enum class MoFangConnectStatus { + CONNECT_START, + CONNECTED, + CONNECTING + } + + private var status: MoFangConnectStatus? = null + + override fun setDefaultValue(defaultValue: Any?) { + super.setDefaultValue(defaultValue) + status = MoFangConnectStatus.values().find { it.ordinal == defaultValue } + notifyChanged() + } + + fun updateStatus(status: MoFangConnectStatus) { + this.status = status + notifyChanged() + } + + override fun onBindViewHolder(holder: PreferenceViewHolder) { + super.onBindViewHolder(holder) + val stats = this.status ?: return + val btConnect = holder.findViewById(R.id.bt_mofang) + btConnect.setOnClickListener(null) + when(stats) { + MoFangConnectStatus.CONNECT_START -> { + btConnect.isEnabled = true + btConnect.background = ContextCompat.getDrawable(holder.itemView.context, R.drawable.icon_operate_panel_mofang_connect_start) + btConnect.onClick { + extras.putInt(KEY_CURRENT_CONNECT_STATUS, stats.ordinal) + onPreferenceClickListener?.onPreferenceClick(this) + } + } + MoFangConnectStatus.CONNECTED -> { + btConnect.isEnabled = true + btConnect.background = ContextCompat.getDrawable(holder.itemView.context, R.drawable.icon_operate_panel_mofang_disconnect) + btConnect.onClick { + extras.putInt(KEY_CURRENT_CONNECT_STATUS, stats.ordinal) + onPreferenceClickListener?.onPreferenceClick(this) + } + } + MoFangConnectStatus.CONNECTING -> { + btConnect.isEnabled = false + btConnect.background = ContextCompat.getDrawable(holder.itemView.context, R.drawable.icon_operate_panel_mofang_connect_doing) + } + } + } +} \ 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/ui/operate/preferences/PreferenceWithSpeedSetting.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/preferences/PreferenceWithSpeedSetting.kt new file mode 100644 index 0000000000..aa5d4c529d --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/preferences/PreferenceWithSpeedSetting.kt @@ -0,0 +1,95 @@ +package com.mogo.eagle.core.function.hmi.ui.operate.preferences + +import android.content.Context +import android.util.AttributeSet +import android.widget.TextView +import androidx.preference.Preference +import androidx.preference.PreferenceViewHolder +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.util.ToastUtils +import kotlin.math.max + +class PreferenceWithSpeedSetting : Preference { + + companion object { + const val KEY_BUNDLE_CURRENT_VALUE = "key_bundle_current_val" + } + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) + constructor(context: Context) : super(context) + + private var mDefaultValueSet: Any? = null + + override fun setDefaultValue(defaultValue: Any?) { + super.setDefaultValue(defaultValue) + mDefaultValueSet = defaultValue + notifyChanged() + } + + override fun onBindViewHolder(holder: PreferenceViewHolder) { + super.onBindViewHolder(holder) + val defaultSet = mDefaultValueSet ?: return + if (defaultSet !is Set<*> || defaultSet.size != 4) { + throw AssertionError() + } + val min = (defaultSet.elementAt(0) as String).toFloat() + val max = (defaultSet.elementAt(1) as String).toFloat() + var cur = (defaultSet.elementAt(2) as String).toFloat() + val step = (defaultSet.elementAt(3) as String).toFloat() + if (min > max) { + throw AssertionError() + } + if (min > cur) { + throw AssertionError() + } + if (cur > max) { + throw AssertionError() + } + val ll = holder.findViewById(R.id.ll_speed) + val btnOk = holder.findViewById(R.id.bt_ok) + val speedLimit = holder.findViewById(R.id.tv_speed_limit) as? TextView + if (speedLimit?.tag != null && speedLimit.tag is Float) { + cur = max(cur, speedLimit.tag as Float) + } + speedLimit?.text = cur.toString() + val minus = holder.findViewById(R.id.iv_speed_minus) + minus.setOnClickListener(null) + minus.onClick { + val minusAfter = cur - step + if (minusAfter < min) { + ToastUtils.showShort("阈值最小可为${min}m/s") + return@onClick + } + cur = minusAfter + btnOk.isEnabled = true + ll.isSelected = true + speedLimit?.tag = minusAfter + speedLimit?.text = minusAfter.toString() + } + val add = holder.findViewById(R.id.iv_speed_add) + add.setOnClickListener(null) + add.onClick { + val addAfter = cur + step + if (addAfter > max) { + ToastUtils.showShort("阈值最大可为${max}m/s") + return@onClick + } + cur = addAfter + ll.isSelected = true + btnOk.isEnabled = true + speedLimit?.tag = addAfter + speedLimit?.text = addAfter.toString() + } + btnOk.isEnabled = false + btnOk.setOnClickListener(null) + btnOk.onClick { + onPreferenceClickListener?.also { + extras.putFloat(KEY_BUNDLE_CURRENT_VALUE, cur) + it.onPreferenceClick(this) + } + } + } +} \ 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/ui/operate/preferences/PreferenceWithUnmanInterval.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/preferences/PreferenceWithUnmanInterval.kt new file mode 100644 index 0000000000..70672af2b0 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/preferences/PreferenceWithUnmanInterval.kt @@ -0,0 +1,103 @@ +package com.mogo.eagle.core.function.hmi.ui.operate.preferences + +import android.content.Context +import android.util.AttributeSet +import android.util.Log +import android.widget.CompoundButton +import android.widget.RadioButton +import android.widget.RadioGroup +import androidx.preference.Preference +import androidx.preference.PreferenceViewHolder +import com.mogo.eagle.core.function.hmi.R + +class PreferenceWithUnmanInterval: Preference, RadioGroup.OnCheckedChangeListener { + + companion object { + const val KEY_BUNDLE_CURRENT_INTERVAL = "key_bundle_unman_interval" + private const val TAG = "PreferenceWithUnmanInterval" + } + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) + constructor(context: Context) : super(context) + + enum class Interval { + FIVE_SECOND, + FIFTEEN_SECOND, + THIRTY_SECOND, + FORTY_FIVE_SECOND, + NEVER + } + + + private var interval: Interval? = null + + override fun setDefaultValue(defaultValue: Any?) { + super.setDefaultValue(defaultValue) + Log.d(TAG, "--- setDefaultValue 1 ---:defaultValue -> $defaultValue") + if (defaultValue is Int) { + interval = when(defaultValue) { + 5 -> Interval.FIVE_SECOND + 15 -> Interval.FIFTEEN_SECOND + 30 -> Interval.THIRTY_SECOND + 45 -> Interval.FORTY_FIVE_SECOND + else -> Interval.NEVER + } + } + } + + override fun onBindViewHolder(holder: PreferenceViewHolder) { + super.onBindViewHolder(holder) + Log.d(TAG, "--- onBindViewHolder 1 ---:interval -> $interval") + val temp = interval?: return + Log.d(TAG, "--- onBindViewHolder 2 --- ") + val five = holder.findViewById(R.id.rb_5s) as? RadioButton + val fifteen = holder.findViewById(R.id.rb_15s) as? RadioButton + val thirty = holder.findViewById(R.id.rb_30s) as? RadioButton + val forty_five = holder.findViewById(R.id.rb_45s) as? RadioButton + val never = holder.findViewById(R.id.rb_never) as? RadioButton + when(temp) { + Interval.FIVE_SECOND -> five?.isChecked = true + Interval.FIFTEEN_SECOND -> fifteen?.isChecked = true + Interval.THIRTY_SECOND -> thirty?.isChecked = true + Interval.FORTY_FIVE_SECOND -> forty_five?.isChecked = true + Interval.NEVER -> never?.isChecked = true + } + + (holder.findViewById(R.id.rg_root) as? RadioGroup)?.also { + it.setOnCheckedChangeListener(this) + } + } + + override fun onCheckedChanged(group: RadioGroup?, checkedId: Int) { + Log.d(TAG, "--- onCheckedChanged --- ") + when(checkedId) { + R.id.rb_5s -> { + Log.d(TAG, "--- onCheckedChanged 5s--- ") + extras.putInt(KEY_BUNDLE_CURRENT_INTERVAL, Interval.FIVE_SECOND.ordinal) + onPreferenceClickListener?.onPreferenceClick(this) + } + R.id.rb_15s -> { + Log.d(TAG, "--- onCheckedChanged 15s--- ") + extras.putInt(KEY_BUNDLE_CURRENT_INTERVAL, Interval.FIFTEEN_SECOND.ordinal) + onPreferenceClickListener?.onPreferenceClick(this) + } + R.id.rb_30s -> { + Log.d(TAG, "--- onCheckedChanged 30s--- ") + extras.putInt(KEY_BUNDLE_CURRENT_INTERVAL, Interval.THIRTY_SECOND.ordinal) + onPreferenceClickListener?.onPreferenceClick(this) + } + R.id.rb_45s -> { + Log.d(TAG, "--- onCheckedChanged 45s--- ") + extras.putInt(KEY_BUNDLE_CURRENT_INTERVAL, Interval.FORTY_FIVE_SECOND.ordinal) + onPreferenceClickListener?.onPreferenceClick(this) + } + R.id.rb_never -> { + Log.d(TAG, "--- onCheckedChanged never--- ") + extras.putInt(KEY_BUNDLE_CURRENT_INTERVAL, Interval.NEVER.ordinal) + onPreferenceClickListener?.onPreferenceClick(this) + } + } + } +} \ 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/ui/operate/preferences/PreferenceWithWelcomeWords.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/preferences/PreferenceWithWelcomeWords.kt new file mode 100644 index 0000000000..cb6cd99e79 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/preferences/PreferenceWithWelcomeWords.kt @@ -0,0 +1,56 @@ +package com.mogo.eagle.core.function.hmi.ui.operate.preferences + +import android.content.Context +import android.text.TextUtils +import android.util.AttributeSet +import android.widget.EditText +import androidx.core.widget.doOnTextChanged +import androidx.preference.Preference +import androidx.preference.PreferenceViewHolder +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.kotlin.onClick + +class PreferenceWithWelcomeWords: Preference { + + companion object { + const val KEY_BUNDLE_CURRENT_EDIT_TEXT_VALUE = "key_bundle_current_edit_text" + } + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) + constructor(context: Context) : super(context) + + + private var mCurrentWelcomeWords: String? = null + + override fun setDefaultValue(defaultValue: Any?) { + super.setDefaultValue(defaultValue) + if (defaultValue is String) { + mCurrentWelcomeWords = defaultValue + notifyChanged() + } + } + + override fun onBindViewHolder(holder: PreferenceViewHolder) { + super.onBindViewHolder(holder) + val currentWelcomeWords = mCurrentWelcomeWords + val et = holder.findViewById(R.id.et_welcome_words) as? EditText + val btn_ok = holder.findViewById(R.id.bt_ok) + btn_ok.isEnabled = false + et?.doOnTextChanged { text, _, _, _ -> + if (!TextUtils.isEmpty(text)) { + btn_ok?.isEnabled = true + } else { + btn_ok?.isEnabled = false + } + } + if (!TextUtils.isEmpty(currentWelcomeWords)) { + et?.setText(currentWelcomeWords) + } + btn_ok.onClick { + extras.putString(KEY_BUNDLE_CURRENT_EDIT_TEXT_VALUE, et?.text.toString()) + onPreferenceClickListener?.onPreferenceClick(this) + } + } +} \ 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/ui/setting/SOPSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt index c5acc363ee..d131746232 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt @@ -143,21 +143,21 @@ internal class SOPSettingView @JvmOverloads constructor( */ private fun v2xSetting() { //V2X总开关 - scV2XSwitch.isChecked = FunctionBuildConfig.v2xMainSwitch + scV2XSwitch.isChecked = FunctionBuildConfig.v2xTotalSwitch scV2XSwitch.setOnCheckedChangeListener { _, isChecked -> - FunctionBuildConfig.v2xMainSwitch = isChecked + FunctionBuildConfig.v2xTotalSwitch = isChecked hmiAction("SOP V2X总开关, ", isChecked) clickEventAnalytics("V2X总开关",isChecked) if (isChecked) { //V2N总开关 - scV2NSwitch.isChecked = FunctionBuildConfig.v2nMainSwitch - hmiAction("SOP V2N总开关, ", FunctionBuildConfig.v2nMainSwitch) + scV2NSwitch.isChecked = FunctionBuildConfig.v2nTotalSwitch + hmiAction("SOP V2N总开关, ", FunctionBuildConfig.v2nTotalSwitch) //V2I总开关 - scV2ISwitch.isChecked = HmiBuildConfig.isShowObuV2iView - hmiAction("SOP V2I总开关, ", HmiBuildConfig.isShowObuV2iView) + scV2ISwitch.isChecked = HmiBuildConfig.v2iTotalSwitch + hmiAction("SOP V2I总开关, ", HmiBuildConfig.v2iTotalSwitch) //V2V总开关 - scObuV2vView.isChecked = HmiBuildConfig.isShowObuV2vView - hmiAction("SOP V2V总开关, ", HmiBuildConfig.isShowObuV2vView) + scObuV2vView.isChecked = HmiBuildConfig.v2vTotalSwitch + hmiAction("SOP V2V总开关, ", HmiBuildConfig.v2vTotalSwitch) //obu总开关 scObu.isChecked = obuConnectStatus hmiAction("SOP obu总开关, ", obuConnectStatus) @@ -187,24 +187,24 @@ internal class SOPSettingView @JvmOverloads constructor( } //V2N总开关 - scV2NSwitch.isChecked = FunctionBuildConfig.v2nMainSwitch + scV2NSwitch.isChecked = FunctionBuildConfig.v2nTotalSwitch //根据V2N状态设置子开关是否可以点击 //V2N新链路 - scNewV2NData.isEnabled = FunctionBuildConfig.v2nMainSwitch + scNewV2NData.isEnabled = FunctionBuildConfig.v2nTotalSwitch //V2N场景进PNC - scV2nPnc.isEnabled = FunctionBuildConfig.v2nMainSwitch + scV2nPnc.isEnabled = FunctionBuildConfig.v2nTotalSwitch //绿波通行(默认关闭) - scGreenWaveSop.isEnabled = FunctionBuildConfig.v2nMainSwitch + scGreenWaveSop.isEnabled = FunctionBuildConfig.v2nTotalSwitch scV2NSwitch.setOnCheckedChangeListener { compoundButton, isChecked -> clickEventAnalytics("V2N总开关",isChecked) if (isChecked) { //V2N新链路 - scNewV2NData.isChecked = FunctionBuildConfig.isNewV2NData - hmiAction("SOP 是否是V2N新链路(云->工控机->App)", FunctionBuildConfig.isNewV2NData) + scNewV2NData.isChecked = FunctionBuildConfig.v2nNewLinked + hmiAction("SOP 是否是V2N新链路(云->工控机->App)", FunctionBuildConfig.v2nNewLinked) //V2N场景进PNC - scV2nPnc.isChecked = FunctionBuildConfig.isV2NPnc - hmiAction("SOP V2N场景进PNC, ", FunctionBuildConfig.isV2NPnc) - CallerAutoPilotControlManager.sendV2nToPncCmd(FunctionBuildConfig.isV2NPnc) + scV2nPnc.isChecked = FunctionBuildConfig.v2nNewLinkedToPNC + hmiAction("SOP V2N场景进PNC, ", FunctionBuildConfig.v2nNewLinkedToPNC) + CallerAutoPilotControlManager.sendV2nToPncCmd(FunctionBuildConfig.v2nNewLinkedToPNC) //绿波通行 scGreenWaveSop.isChecked = HmiBuildConfig.isShowGreenWaveView hmiAction("SOP obu绿波通行, ", HmiBuildConfig.isShowGreenWaveView) @@ -234,37 +234,37 @@ internal class SOPSettingView @JvmOverloads constructor( if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } - FunctionBuildConfig.v2nMainSwitch = isChecked + FunctionBuildConfig.v2nTotalSwitch = isChecked val map = HashMap().also { it["f1"] = isChecked - it["f2"] = FunctionBuildConfig.isNewV2NData + it["f2"] = FunctionBuildConfig.v2nNewLinked } CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_NEW_LINK_SWITCH, GsonUtils.toJson(map).toByteArray()) } //V2I总开关 - scV2ISwitch.isChecked = HmiBuildConfig.isShowObuV2iView //是否展示obu的v2i + scV2ISwitch.isChecked = HmiBuildConfig.v2iTotalSwitch //是否展示obu的v2i //根据V2I状态设置子开关是否可以点击 - scV2iPnc.isEnabled = HmiBuildConfig.isShowObuV2iView - scRunRedLightSop.isEnabled = HmiBuildConfig.isShowObuV2iView - scObuWeaknessTrafficSop.isEnabled = HmiBuildConfig.isShowObuV2iView + scV2iPnc.isEnabled = HmiBuildConfig.v2iTotalSwitch + scRunRedLightSop.isEnabled = HmiBuildConfig.v2iTotalSwitch + scObuWeaknessTrafficSop.isEnabled = HmiBuildConfig.v2iTotalSwitch scV2ISwitch.setOnCheckedChangeListener { compoundButton, isChecked -> clickEventAnalytics("V2I总开关",isChecked) if (isChecked) { //V2I场景进PNC - scV2iPnc.isChecked = FunctionBuildConfig.isV2IPnc - hmiAction("SOP V2I场景进PNC, ", FunctionBuildConfig.isV2IPnc) - CallerAutoPilotControlManager.sendV2iToPncCmd(FunctionBuildConfig.isV2IPnc) + scV2iPnc.isChecked = FunctionBuildConfig.v2iToPNC + hmiAction("SOP V2I场景进PNC, ", FunctionBuildConfig.v2iToPNC) + CallerAutoPilotControlManager.sendV2iToPncCmd(FunctionBuildConfig.v2iToPNC) //闯红灯预警 - scRunRedLightSop.isChecked = HmiBuildConfig.isShowRunRedLightView - hmiAction("SOP obu闯红灯预警, ", HmiBuildConfig.isShowRunRedLightView) + scRunRedLightSop.isChecked = HmiBuildConfig.v2iRedLightWarning + hmiAction("SOP obu闯红灯预警, ", HmiBuildConfig.v2iRedLightWarning) CallerTelematicManager.sendMsgToAllClients( TelematicConstant.OBU_RUNREDLIGHT_WARNING, "1".toByteArray() ) //路侧弱势交通参与者 - scObuWeaknessTrafficSop.isChecked = HmiBuildConfig.isShowObuWeaknessTrafficView - hmiAction("SOP obu弱势交通控制, ", HmiBuildConfig.isShowObuWeaknessTrafficView) + scObuWeaknessTrafficSop.isChecked = HmiBuildConfig.v2iWeaknessTraffic + hmiAction("SOP obu弱势交通控制, ", HmiBuildConfig.v2iWeaknessTraffic) } else { //V2I场景进PNC scV2iPnc.isChecked = false @@ -287,28 +287,28 @@ internal class SOPSettingView @JvmOverloads constructor( if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } - HmiBuildConfig.isShowObuV2iView = isChecked + HmiBuildConfig.v2iTotalSwitch = isChecked } //V2N新链路 - scNewV2NData.isChecked = FunctionBuildConfig.isNewV2NData + scNewV2NData.isChecked = FunctionBuildConfig.v2nNewLinked scNewV2NData.setOnCheckedChangeListener { compoundButton, isChecked -> if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } clickEventAnalytics("V2N新链路",isChecked) hmiAction("SOP 是否是V2N新链路(云->工控机->App)", isChecked) - FunctionBuildConfig.isNewV2NData = isChecked + FunctionBuildConfig.v2nNewLinked = isChecked val map = HashMap().also { - it["f1"] = FunctionBuildConfig.v2nMainSwitch + it["f1"] = FunctionBuildConfig.v2nTotalSwitch it["f2"] = isChecked } CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_NEW_LINK_SWITCH, GsonUtils.toJson(map).toByteArray()) } //V2N场景进PNC - scV2nPnc.isChecked = FunctionBuildConfig.isV2NPnc + scV2nPnc.isChecked = FunctionBuildConfig.v2nNewLinkedToPNC scV2nPnc.setOnCheckedChangeListener { compoundButton, isChecked -> if (!compoundButton.isPressed) { return@setOnCheckedChangeListener @@ -316,7 +316,7 @@ internal class SOPSettingView @JvmOverloads constructor( clickEventAnalytics("V2N场景进PNC",isChecked) hmiAction("SOP V2N场景进PNC, ", isChecked) CallerAutoPilotControlManager.sendV2nToPncCmd(isChecked) - FunctionBuildConfig.isV2NPnc = isChecked + FunctionBuildConfig.v2nNewLinkedToPNC = isChecked } //绿波通行(默认关闭) @@ -342,7 +342,7 @@ internal class SOPSettingView @JvmOverloads constructor( } //V2I场景进PNC - scV2iPnc.isChecked = FunctionBuildConfig.isV2IPnc + scV2iPnc.isChecked = FunctionBuildConfig.v2iToPNC scV2iPnc.setOnCheckedChangeListener { compoundButton, isChecked -> if (!compoundButton.isPressed) { return@setOnCheckedChangeListener @@ -350,19 +350,19 @@ internal class SOPSettingView @JvmOverloads constructor( clickEventAnalytics("V2I场景进PNC",isChecked) hmiAction("SOP V2I场景进PNC, ", isChecked) CallerAutoPilotControlManager.sendV2iToPncCmd(isChecked) - FunctionBuildConfig.isV2IPnc = isChecked + FunctionBuildConfig.v2iToPNC = isChecked } //闯红灯预警(默认关闭) - scRunRedLightSop.isChecked = HmiBuildConfig.isShowRunRedLightView + scRunRedLightSop.isChecked = HmiBuildConfig.v2iRedLightWarning scRunRedLightSop.setOnCheckedChangeListener { compoundButton, isChecked -> if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } clickEventAnalytics("闯红灯预警",isChecked) hmiAction("SOP obu闯红灯预警, ", isChecked) - HmiBuildConfig.isShowRunRedLightView = isChecked - if (HmiBuildConfig.isShowRunRedLightView) { + HmiBuildConfig.v2iRedLightWarning = isChecked + if (HmiBuildConfig.v2iRedLightWarning) { CallerTelematicManager.sendMsgToAllClients( TelematicConstant.OBU_RUNREDLIGHT_WARNING, "1".toByteArray() @@ -376,25 +376,25 @@ internal class SOPSettingView @JvmOverloads constructor( } //路侧弱势交通参与者(默认开启) - scObuWeaknessTrafficSop.isChecked = HmiBuildConfig.isShowObuWeaknessTrafficView + scObuWeaknessTrafficSop.isChecked = HmiBuildConfig.v2iWeaknessTraffic scObuWeaknessTrafficSop.setOnCheckedChangeListener { compoundButton, isChecked -> if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } clickEventAnalytics("路侧弱势交通参与者",isChecked) hmiAction("SOP obu弱势交通控制, ", isChecked) - HmiBuildConfig.isShowObuWeaknessTrafficView = isChecked + HmiBuildConfig.v2iWeaknessTraffic = isChecked } //V2V总开关(默认关闭) - scObuV2vView.isChecked = HmiBuildConfig.isShowObuV2vView + scObuV2vView.isChecked = HmiBuildConfig.v2vTotalSwitch scObuV2vView.setOnCheckedChangeListener { compoundButton, isChecked -> if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } clickEventAnalytics("V2V总开关",isChecked) hmiAction("SOP obuV2V开关, ", isChecked) - HmiBuildConfig.isShowObuV2vView = isChecked + HmiBuildConfig.v2vTotalSwitch = isChecked } //obu总开关 @@ -599,7 +599,7 @@ internal class SOPSettingView @JvmOverloads constructor( scExamControl.isChecked = FunctionBuildConfig.isShowExamWindow scExamControl.setOnCheckedChangeListener { _, isChecked -> FunctionBuildConfig.isShowExamWindow = isChecked - CallerDevaToolsManager.showExamControlWindow(this,isChecked) + CallerDevaToolsManager.showExamControlWindow(isChecked) hmiAction("SOP 考试功能面板, ", isChecked) clickEventAnalytics("考试功能面板",isChecked) } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryAdapter.kt index 15f0de63a3..f40c3b66fb 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryAdapter.kt @@ -34,29 +34,24 @@ class StatusSummaryAdapter(private val ctx: Context, var data: ArrayList { - ivFuncView.setImageResource(R.drawable.driver_server) + ivFuncView.setImageResource(if (entity.isException) R.drawable.icon_over_driver_start_error else R.drawable.icon_over_driver_start_ok) } 1 -> { - ivFuncView.setImageResource(R.drawable.gps) + ivFuncView.setImageResource(if (entity.isException) R.drawable.icon_over_gps_error else R.drawable.icon_over_gps_ok) } 2 -> { - ivFuncView.setImageResource(R.drawable.cloud_socket) + ivFuncView.setImageResource(if (entity.isException) R.drawable.icon_over_socket_error else R.drawable.icon_over_socket_ok) } 3 -> { - ivFuncView.setImageResource(R.drawable.tracing) + ivFuncView.setImageResource(if (entity.isException) R.drawable.icon_over_route_error else R.drawable.icon_over_route_ok) } 4 -> { - ivFuncView.setImageResource(R.drawable.controller) + ivFuncView.setImageResource(if (entity.isException) R.drawable.icon_over_ipc_error else R.drawable.icon_over_ipc_ok) } 5 -> { - ivFuncView.setImageResource(R.drawable.ssl_check) + ivFuncView.setImageResource(if (entity.isException) R.drawable.icon_over_auth_error else R.drawable.icon_over_auth_ok) } } - if (entity.isException) { - tvStatusDesc.setTextColor(Color.parseColor("#FF4444")) - } else { - tvStatusDesc.setTextColor(Color.parseColor("#FFFFFF")) - } tvStatusDesc.text = entity.desc } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt index 4255d48076..3239ff5131 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt @@ -32,21 +32,12 @@ import com.mogo.eagle.core.utilcode.kotlin.PX import com.mogo.eagle.core.utilcode.rv.divider.CommonDividerItemDecoration import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.zhjt.mogo.adas.data.AdasConstants +import me.jessyan.autosize.utils.AutoSizeUtils /** * 状态汇总View控件 */ -class StatusSummaryView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : FrameLayout( - context, - attrs, - defStyleAttr -), IConnectStatusListener, IMogoStatusChangedListener, - IMoGoDevaToolsListener, IMoGoAutopilotStatusListener, IMoGoAutopilotCarConfigListener, - IMoGoCloudListener { +class StatusSummaryView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : FrameLayout(context, attrs, defStyleAttr), IConnectStatusListener, IMogoStatusChangedListener, IMoGoDevaToolsListener, IMoGoAutopilotStatusListener, IMoGoAutopilotCarConfigListener, IMoGoCloudListener { companion object { private const val TAG = "SummaryStatusView" } @@ -61,13 +52,7 @@ class StatusSummaryView @JvmOverloads constructor( it.add(StatusSummaryEntity(2)) it.add(StatusSummaryEntity(3)) it.add(StatusSummaryEntity(4, "域控未连接", true)) - it.add( - StatusSummaryEntity( - 5, - CallerAutopilotCarConfigListenerManager.getCertFileResult(), - CallerCloudCertManager.getRootCrtF().isNullOrEmpty() - ) - ) + it.add(StatusSummaryEntity(5, CallerAutopilotCarConfigListenerManager.getCertFileResult(), CallerCloudCertManager.getRootCrtF().isNullOrEmpty())) } } @@ -78,12 +63,9 @@ class StatusSummaryView @JvmOverloads constructor( override fun onAttachedToWindow() { super.onAttachedToWindow() - CallerDevaToolsListenerManager.addListener(TAG, this) - // 司机屏Server服务是否开启的状态 - CallerTelematicStatusListenerManager.addListener(TAG, this) - // 云socket连接状态 - MogoStatusManager.getInstance() - .registerStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) + CallerDevaToolsListenerManager.addListener(TAG, this) // 司机屏Server服务是否开启的状态 + CallerTelematicStatusListenerManager.addListener(TAG, this) // 云socket连接状态 + MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) CallerAutoPilotStatusListenerManager.addListener(TAG, this) CallerAutopilotCarConfigListenerManager.addListener(TAG, this) CallerCloudListenerManager.addListener(TAG, this) @@ -99,12 +81,7 @@ class StatusSummaryView @JvmOverloads constructor( removeDuration = 0 } it.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) - it.addItemDecoration( - CommonDividerItemDecoration.Builder() - .spanCountTBCare(false) - .horizontalInnerSpace(10.PX) - .build() - ) + it.addItemDecoration(CommonDividerItemDecoration.Builder().spanCountTBCare(false).verticalInnerSpace(AutoSizeUtils.dp2px(context, 20.0f)).build()) StatusSummaryAdapter(context, data).apply { adapter = this it.adapter = this @@ -121,13 +98,10 @@ class StatusSummaryView @JvmOverloads constructor( } override fun onDetachedFromWindow() { - super.onDetachedFromWindow() - // 司机屏Server服务是否开启的状态 + super.onDetachedFromWindow() // 司机屏Server服务是否开启的状态 CallerTelematicStatusListenerManager.removeListener(TAG) - CallerDevaToolsListenerManager.removeListener(TAG) - // 云socket连接状态 - MogoStatusManager.getInstance() - .unregisterStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) + CallerDevaToolsListenerManager.removeListener(TAG) // 云socket连接状态 + MogoStatusManager.getInstance().unregisterStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) CallerAutoPilotStatusListenerManager.removeListener(TAG) CallerAutopilotCarConfigListenerManager.removeListener(TAG) CallerCloudListenerManager.removeListener(TAG) @@ -171,8 +145,7 @@ class StatusSummaryView @JvmOverloads constructor( } override fun tracingStatus(status: Boolean) { - super.tracingStatus(status) - // 发送事件前限制了频率 + super.tracingStatus(status) // 发送事件前限制了频率 UiThreadHandler.post({ if (data.size < 4) return@post data[3].desc = "寻迹算路${if (status) "正常" else "异常"}" @@ -181,10 +154,7 @@ class StatusSummaryView @JvmOverloads constructor( }, UiThreadHandler.MODE.QUEUE) } - override fun onAutopilotIpcConnectStatusChanged( - status: AdasConstants.IpcConnectionStatus, - reason: String? - ) { + override fun onAutopilotIpcConnectStatusChanged(status: AdasConstants.IpcConnectionStatus, reason: String?) { super.onAutopilotIpcConnectStatusChanged(status, reason) var pair: Pair? = null when (status) { @@ -238,8 +208,8 @@ class StatusSummaryView @JvmOverloads constructor( override fun authCrtFile(device: String, root: String) { super.authCrtFile(device, root) - UiThreadHandler.post ({ - if(CallerAutopilotCarConfigListenerManager.getCertFileResult()!= "未开启认证"){ + UiThreadHandler.post({ + if (CallerAutopilotCarConfigListenerManager.getCertFileResult() != "未开启认证") { return@post } if (data.size < 6) return@post @@ -251,7 +221,7 @@ class StatusSummaryView @JvmOverloads constructor( override fun authCrtError(errorMsg: String) { super.authCrtError(errorMsg) - UiThreadHandler.post ({ + UiThreadHandler.post({ if (data.size < 6) return@post data[5].desc = "本机证书下载异常:$errorMsg" data[5].isException = true @@ -262,14 +232,10 @@ class StatusSummaryView @JvmOverloads constructor( override fun onCertificationResult(msg: String) { super.onCertificationResult(msg) hmiAction("证书验证状态", msg, true) - if (!SharedPrefsMgr.getInstance().getBoolean( - "${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", - MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE - ) - ) { + if (!SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) { return } - UiThreadHandler.post ({ + UiThreadHandler.post({ if (data.size < 6) return@post data[5].desc = msg data[5].isException = !msg.contains("成功校验") diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/viewport/VisualAngleToggleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/viewport/VisualAngleToggleView.kt index 4c49110a97..8cb7971cd9 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/viewport/VisualAngleToggleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/viewport/VisualAngleToggleView.kt @@ -15,7 +15,6 @@ import com.mogo.eagle.core.function.angle.scenes.Default import com.mogo.eagle.core.function.angle.scenes.LongSight import com.mogo.eagle.core.function.api.map.angle.IMoGoVisualAngleChangeProvider import com.mogo.eagle.core.function.api.map.angle.Scene -import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.kotlin.scope @@ -85,8 +84,6 @@ class VisualAngleToggleView : FrameLayout, IMoGoVisualAngleChangeProvider.OnMoGo override fun onAnimationEnd(animation: Animator, isReverse: Boolean) { super.onAnimationEnd(animation, isReverse) iv_toggle_block?.isEnabled = true - //TODO renwj - CallerHmiManager.toggleOperatePanel(false) } }) animator.interpolator = AccelerateDecelerateInterpolator() @@ -114,8 +111,6 @@ class VisualAngleToggleView : FrameLayout, IMoGoVisualAngleChangeProvider.OnMoGo override fun onAnimationEnd(animation: Animator, isReverse: Boolean) { iv_toggle_block?.isEnabled = true - //TODO renwj - CallerHmiManager.toggleOperatePanel(true) } }) animator.interpolator = AccelerateDecelerateInterpolator() diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WrapRadioGroup.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WrapRadioGroup.java new file mode 100644 index 0000000000..e35630455f --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WrapRadioGroup.java @@ -0,0 +1,120 @@ +package com.mogo.eagle.core.function.hmi.ui.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.RadioGroup; + +public class WrapRadioGroup extends RadioGroup { + + public WrapRadioGroup(Context context) { + super(context); + } + + public WrapRadioGroup(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + int heightSize = MeasureSpec.getSize(heightMeasureSpec); + int heightMode = MeasureSpec.getMode(heightMeasureSpec); + + //调用ViewGroup的方法,测量子view + measureChildren(widthMeasureSpec, heightMeasureSpec); + + //最大的宽 + int maxWidth = 0; + //累计的高 + int totalHeight = 0; + + //当前这一行的累计行宽 + int lineWidth = 0; + //当前这行的最大行高 + int maxLineHeight = 0; + //用于记录换行前的行宽和行高 + int oldHeight; + int oldWidth; + + int count = getChildCount(); + //假设 widthMode和heightMode都是AT_MOST + for (int i = 0; i < count; i++) { + View child = getChildAt(i); + MarginLayoutParams params = (MarginLayoutParams) child.getLayoutParams(); + //得到这一行的最高 + oldHeight = maxLineHeight; + //当前最大宽度 + oldWidth = maxWidth; + + int deltaX = child.getMeasuredWidth() + params.leftMargin + params.rightMargin; + if (lineWidth + deltaX + getPaddingLeft() + getPaddingRight() > widthSize) {//如果折行,height增加 + //和目前最大的宽度比较,得到最宽。不能加上当前的child的宽,所以用的是oldWidth + maxWidth = Math.max(lineWidth, oldWidth); + //重置宽度 + lineWidth = deltaX; + //累加高度 + totalHeight += oldHeight; + //重置行高,当前这个View,属于下一行,因此当前最大行高为这个child的高度加上margin + maxLineHeight = child.getMeasuredHeight() + params.topMargin + params.bottomMargin; +// Log.v(TAG, "maxHeight:" + totalHeight + "---" + "maxWidth:" + maxWidth); + + } else { + //不换行,累加宽度 + lineWidth += deltaX; + //不换行,计算行最高 + int deltaY = child.getMeasuredHeight() + params.topMargin + params.bottomMargin; + maxLineHeight = Math.max(maxLineHeight, deltaY); + } + if (i == count - 1) { + //前面没有加上下一行的搞,如果是最后一行,还要再叠加上最后一行的最高的值 + totalHeight += maxLineHeight; + //计算最后一行和前面的最宽的一行比较 + maxWidth = Math.max(lineWidth, oldWidth); + } + } + + //加上当前容器的padding值 + maxWidth += getPaddingLeft() + getPaddingRight(); + totalHeight += getPaddingTop() + getPaddingBottom(); + setMeasuredDimension(widthMode == MeasureSpec.EXACTLY ? widthSize : maxWidth, + heightMode == MeasureSpec.EXACTLY ? heightSize : totalHeight); + + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + int count = getChildCount(); + //pre为前面所有的child的相加后的位置 + int preLeft = getPaddingLeft(); + int preTop = getPaddingTop(); + //记录每一行的最高值 + int maxHeight = 0; + for (int i = 0; i < count; i++) { + View child = getChildAt(i); + MarginLayoutParams params = (MarginLayoutParams) child.getLayoutParams(); + //r-l为当前容器的宽度。如果子view的累积宽度大于容器宽度,就换行。 + if (preLeft + params.leftMargin + child.getMeasuredWidth() + params.rightMargin + getPaddingRight() > (r - l)) { + //重置 + preLeft = getPaddingLeft(); + //要选择child的height最大的作为设置 + preTop = preTop + maxHeight; + maxHeight = getChildAt(i).getMeasuredHeight() + params.topMargin + params.bottomMargin; + } else { //不换行,计算最大高度 + maxHeight = Math.max(maxHeight, child.getMeasuredHeight() + params.topMargin + params.bottomMargin); + } + //left坐标 + int left = preLeft + params.leftMargin; + //top坐标 + int top = preTop + params.topMargin; + int right = left + child.getMeasuredWidth(); + int bottom = top + child.getMeasuredHeight(); + //为子view布局 + child.layout(left, top, right, bottom); + //计算布局结束后,preLeft的值 + preLeft += params.leftMargin + child.getMeasuredWidth() + params.rightMargin; + } + } + +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_fault_des_input.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_fault_des_input.png new file mode 100644 index 0000000000..49264822a1 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_fault_des_input.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_status_overview.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_status_overview.png new file mode 100644 index 0000000000..cd0cfd0fa7 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_status_overview.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_tab_report_type.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_tab_report_type.png new file mode 100644 index 0000000000..4c380fa3b6 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_tab_report_type.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fault_time_add.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fault_time_add.png new file mode 100644 index 0000000000..a51b2fc152 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fault_time_add.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fault_time_reduce.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fault_time_reduce.png new file mode 100644 index 0000000000..0ca15baef2 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fault_time_reduce.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_add.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_add.png new file mode 100644 index 0000000000..57787b8786 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_add.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_checkbox_checked.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_checkbox_checked.png new file mode 100644 index 0000000000..70f4ea6db7 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_checkbox_checked.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_checkbox_disabled.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_checkbox_disabled.png new file mode 100644 index 0000000000..796b2bbb7a Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_checkbox_disabled.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_checkbox_unchecked.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_checkbox_unchecked.png new file mode 100644 index 0000000000..0473f102b7 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_checkbox_unchecked.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_minus.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_minus.png new file mode 100644 index 0000000000..d0da98e7c1 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_minus.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_mofang_connect_doing.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_mofang_connect_doing.png new file mode 100644 index 0000000000..3595ab50cb Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_mofang_connect_doing.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_mofang_connect_failed.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_mofang_connect_failed.png new file mode 100644 index 0000000000..b4c1d1cc6d Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_mofang_connect_failed.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_mofang_connect_start.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_mofang_connect_start.png new file mode 100644 index 0000000000..7bc3fadcd4 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_mofang_connect_start.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_mofang_disconnect.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_mofang_disconnect.png new file mode 100644 index 0000000000..abcb2e456f Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_mofang_disconnect.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_ok_disabled.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_ok_disabled.png new file mode 100644 index 0000000000..59d336f99f Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_ok_disabled.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_ok_enabled.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_ok_enabled.png new file mode 100644 index 0000000000..bc2217f62d Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_ok_enabled.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_ok_pressed.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_ok_pressed.png new file mode 100644 index 0000000000..570a86bf07 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_ok_pressed.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_switch_compat_checked.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_switch_compat_checked.png new file mode 100644 index 0000000000..d9585a9f2f Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_switch_compat_checked.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_switch_compat_disabled.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_switch_compat_disabled.png new file mode 100644 index 0000000000..0acf98a8d6 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_switch_compat_disabled.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_switch_compat_unchecked.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_switch_compat_unchecked.png new file mode 100644 index 0000000000..60b809f4e6 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_switch_compat_unchecked.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_unman_interval_checked.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_unman_interval_checked.png new file mode 100644 index 0000000000..73cbdabb31 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_operate_panel_unman_interval_checked.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_auth_error.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_auth_error.png new file mode 100644 index 0000000000..a1998a95a8 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_auth_error.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_auth_ok.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_auth_ok.png new file mode 100644 index 0000000000..50cc73c9c6 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_auth_ok.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_driver_start_error.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_driver_start_error.png new file mode 100644 index 0000000000..233b58eb8f Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_driver_start_error.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_driver_start_ok.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_driver_start_ok.png new file mode 100644 index 0000000000..8413fc97ba Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_driver_start_ok.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_gps_error.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_gps_error.png new file mode 100644 index 0000000000..9b814da2a4 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_gps_error.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_gps_ok.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_gps_ok.png new file mode 100644 index 0000000000..ba77e3716b Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_gps_ok.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_ipc_error.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_ipc_error.png new file mode 100644 index 0000000000..e2abecd8ec Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_ipc_error.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_ipc_ok.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_ipc_ok.png new file mode 100644 index 0000000000..4ed1556da5 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_ipc_ok.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_route_error.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_route_error.png new file mode 100644 index 0000000000..951e111d2a Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_route_error.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_route_ok.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_route_ok.png new file mode 100644 index 0000000000..643f1e55bc Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_route_ok.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_socket_error.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_socket_error.png new file mode 100644 index 0000000000..67eb31442f Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_socket_error.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_socket_ok.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_socket_ok.png new file mode 100644 index 0000000000..72f6a0db66 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_over_socket_ok.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_fault_cancel.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_fault_cancel.xml new file mode 100644 index 0000000000..37cc7acefc --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_fault_cancel.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_fault_reason_title_label.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_fault_reason_title_label.xml new file mode 100644 index 0000000000..e086586d69 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_fault_reason_title_label.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_fault_report.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_fault_report.xml new file mode 100644 index 0000000000..aed5a20c8a --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_fault_report.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_checkbox.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_checkbox.xml new file mode 100644 index 0000000000..a09689403e --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_checkbox.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_edit.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_edit.xml new file mode 100644 index 0000000000..6b64c07192 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_edit.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_edit_button.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_edit_button.xml new file mode 100644 index 0000000000..5e2f41f142 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_edit_button.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_preference_detail.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_preference_detail.xml new file mode 100644 index 0000000000..21d5075519 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_preference_detail.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_preference_header.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_preference_header.xml index b6ab109307..d5e8dae0d7 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_preference_header.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_preference_header.xml @@ -6,5 +6,5 @@ - + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_switch_compat.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_switch_compat.xml new file mode 100644 index 0000000000..a00fe5a714 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_switch_compat.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_welcome_words_edit.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_welcome_words_edit.xml new file mode 100644 index 0000000000..2972712b93 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_operate_panel_welcome_words_edit.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_radio_button_operate_panel_unman_interval.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_radio_button_operate_panel_unman_interval.xml new file mode 100644 index 0000000000..f1d2a57c5b --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_radio_button_operate_panel_unman_interval.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_radio_group_operate_panel_unman_interval.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_radio_group_operate_panel_unman_interval.xml new file mode 100644 index 0000000000..3cc871f759 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_radio_group_operate_panel_unman_interval.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_status_summary_layout.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_status_summary_layout.xml index b4577984db..8c253ac4a2 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_status_summary_layout.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_status_summary_layout.xml @@ -1,35 +1,26 @@ - + + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + tools:src="@drawable/icon_over_driver_start_ok"/> + - - \ No newline at end of file + android:layout_gravity="center_vertical" + android:layout_marginStart="@dimen/dp_20" + android:textSize="@dimen/dp_28" + android:textColor="#ffffff" + tools:text="已连接xxxxxxxxxxxxxxxx" /> + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_detail_recyclerview.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_detail_recyclerview.xml new file mode 100644 index 0000000000..8ff0d51233 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_detail_recyclerview.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_holder.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_holder.xml new file mode 100644 index 0000000000..6ecee10c27 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_holder.xml @@ -0,0 +1,5 @@ + + diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_category_title.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_category_title.xml index dde2caa791..0f15e27692 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_category_title.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_category_title.xml @@ -9,5 +9,7 @@ android:textSize="@dimen/dp_30" android:paddingTop="@dimen/dp_30" android:paddingStart="@dimen/dp_30" + android:background="@android:color/transparent" tools:text="地图效果" - android:gravity="start" /> \ No newline at end of file + android:gravity="start" + tools:ignore="RtlSymmetry,SpUsage" /> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_checkbox_compat.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_checkbox_compat.xml index 18f7a152e0..ff6172eb3b 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_checkbox_compat.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_checkbox_compat.xml @@ -6,6 +6,7 @@ android:layout_height="wrap_content" android:paddingStart="@dimen/dp_30" android:paddingEnd="@dimen/dp_30" + android:background="@android:color/transparent" android:orientation="horizontal" tools:background="#83000000"> diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_header.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_header.xml index a6ed4b8461..78d511e5e8 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_header.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_header.xml @@ -10,5 +10,8 @@ android:paddingTop="@dimen/dp_25" android:paddingBottom="@dimen/dp_25" android:paddingStart="@dimen/dp_30" + android:layout_marginEnd="@dimen/dp_30" + android:background="@drawable/bg_operate_panel_preference_header" tools:text="地图效果" - android:gravity="start" /> \ No newline at end of file + android:gravity="start" + tools:ignore="RtlSymmetry,SpUsage" /> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_switch_compat.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_switch_compat.xml index 18f7a152e0..919de4480e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_switch_compat.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_switch_compat.xml @@ -7,6 +7,7 @@ android:paddingStart="@dimen/dp_30" android:paddingEnd="@dimen/dp_30" android:orientation="horizontal" + android:background="@android:color/transparent" tools:background="#83000000"> + tools:text="V2X总开关" + tools:ignore="SpUsage" /> + tools:text="V2X总开关" + tools:ignore="SpUsage" /> + android:clickable="false" + android:button="@null" + android:background="@drawable/bg_operate_panel_checkbox"/> diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_widget_edit_with_button.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_widget_edit_with_button.xml index 6a19ddfa51..fde0695380 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_widget_edit_with_button.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_widget_edit_with_button.xml @@ -1,6 +1,72 @@ - + android:orientation="horizontal" + android:layout_marginTop="@dimen/dp_20" + tools:background="#83000000"> + + + + + + + + + + + + + + +