[8.4.0] 司机屏无人化所有功能(除更改成D6任务相关)

This commit is contained in:
xinfengkun
2026-02-03 14:37:03 +08:00
parent 137aa60752
commit c8fd926c26
195 changed files with 18770 additions and 57 deletions

View File

@@ -17,13 +17,15 @@ 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.hmi.R
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.CockpitType
import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp
import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform
import com.mogo.eagle.core.utilcode.util.ResourceUtils.getDrawable
import com.mogo.eagle.core.utilcode.util.StringUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat
import com.mogo.eagle.core.utilcode.util.ToastUtils
import java.text.SimpleDateFormat
/**
* 司机端Tab类型的消息盒子适配器
@@ -180,6 +182,9 @@ class MsgBoxTabAdapter(private val activity: Activity) :
}
}
private fun getHourMinFormat(): SimpleDateFormat {
return if (AppIdentityModeUtils.getCockpitType() == CockpitType.UNMANNED) TimeUtils.getHourMinSecondFormat() else TimeUtils.getHourMinFormat()
}
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {

View File

@@ -0,0 +1,66 @@
package com.mogo.eagle.core.function.hmi.bone.unmanned
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.function.call.och.CallerOchCustomViewManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.zhjt.mogo_core_function_devatools.status.StatusManager
import com.zhjt.mogo_core_function_devatools.status.entity.SpeedStatus
import com.zhjt.mogo_core_function_devatools.status.entity.Status
import kotlinx.android.synthetic.main.view_bone_top_status.view.speed_custom
import kotlinx.android.synthetic.main.view_bone_top_status.view.startAutoPilotContainer
//无人化司机端速度状态展示
class UnmannedBoneStatusLayout @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), StatusManager.IStatusListener {
companion object {
const val TAG = "UnmannedRightBottomStatusLayout"
}
init {
LayoutInflater.from(context).inflate(R.layout.view_unmanned_bone_status, this, true)
addStartAutoPilotView()
}
private fun addStartAutoPilotView() {
if (context == null) {
CallerLogger.e(TAG, "addStartAutoPilotView context==null")
return
}
kotlin.runCatching {
startAutoPilotContainer?.also { container ->
container.removeAllViews()
val view = CallerOchCustomViewManager.getStartAutopilotView(context)
Logger.d(TAG, "$view ${Thread.currentThread().name}")
view?.also {
container.addView(it)
}
}
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
StatusManager.addListener(TAG, this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
StatusManager.removeListener(TAG)
}
override fun onStatusChanged(changed: List<Status>, all: List<Status>) {
changed.find { it is SpeedStatus }?.also {
val speed = it as SpeedStatus
speed_custom?.updateSpeed(speed.speed)
}
}
}

View File

@@ -0,0 +1,442 @@
package com.mogo.eagle.core.function.hmi.bone.unmanned
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.view.animation.LinearInterpolator
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import com.mogo.commons.voice.AIAssist
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.data.enums.EventTypeEnumNew
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.V2XMsg
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoReceiveReceivedAckListener
import com.mogo.eagle.core.function.api.devatools.IPowerOffListener
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.CallerReceiveReceivedAckListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.devatools.CallerPowerOffManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager.saveMsgBox
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog.Companion.hmiAction
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
import com.mogo.eagle.core.utilcode.util.ParseVersionUtils
import com.mogo.eagle.core.utilcode.util.StringUtils
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.zhjt.mogo.adas.common.MessageType
import com.zhjt.mogo.adas.data.AdasConstants
import com.zhjt.mogo.adas.data.bean.ReceivedAck
import kotlinx.android.synthetic.main.unmanned_view_tool_stop_service.view.tvCheckShutDown
import kotlinx.android.synthetic.main.unmanned_view_tool_stop_service.view.tvCountDown
import kotlinx.android.synthetic.main.unmanned_view_tool_stop_service.view.tvCountDownUnit
import kotlinx.android.synthetic.main.unmanned_view_tool_stop_service.view.viewCheckShutDown
import kotlinx.android.synthetic.main.unmanned_view_tool_stop_service.view.viewProgress
import kotlinx.android.synthetic.main.unmanned_view_tool_stop_service.view.viewProgressBackground
/**
* 一件停服
*/
class UnmannedToolStopServiceView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener,
IPowerOffListener, IMoGoReceiveReceivedAckListener {
companion object {
const val TAG = "UnmannedToolStopServiceView"
}
//重启系统对话框
private var connectStatus: Boolean = false //与工控机的连接状态
private var isExecutingPowerOff: Boolean = false //是否正在下发一键停服命令
private var isPowerOffCountDown: Boolean = false //一键停服是否处于1分钟倒计时
private var powerOffMsgId: Long = -1 //一键停服命令下发Id
private var progressAnimator: ObjectAnimator? = null //一键停服命令倒计时
/**
* 停止域控服务状态
* 0准备停服 1停服命令下发中 2停服命令下发成功 3停服命令下发失败
* 4停服命令下发超时 5停服中 6停服成功 7停服成功不可点击
*/
private var powerOffStatus: Int = 0
init {
LayoutInflater.from(context).inflate(R.layout.unmanned_view_tool_stop_service, this, true)
initView()
}
private fun initView() {
//一键停服
viewCheckShutDown.setOnClickListener {
powerOff()
}
tvCheckShutDown.setOnClickListener {
powerOff()
}
CallerDevaToolsManager.getPowerOffStatus()?.let {
powerOffStatus = it
}
when (powerOffStatus) {
//准备停服
0 -> {
viewCheckShutDown.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.icon_toolkit_item_stop_service
)
)
viewCheckShutDown.isClickable = true
}
//停服命令下发中
1 -> {
isExecutingPowerOff = true
}
//停服命令下发成功
2 -> {
viewProgressBackground.visibility = View.VISIBLE
viewProgress.visibility = View.VISIBLE
tvCountDown.visibility = View.VISIBLE
tvCountDownUnit.visibility = View.VISIBLE
//开始旋转动画
if (progressAnimator == null) {
progressAnimator = ObjectAnimator.ofFloat(viewProgress, "rotation", 0f, 360f)
}
progressAnimator?.interpolator = LinearInterpolator()
progressAnimator?.repeatCount = ValueAnimator.INFINITE //无限循环
progressAnimator?.duration = 10000 //设置持续时间
progressAnimator?.startDelay = 0
progressAnimator?.start()
//一键停服倒计时中
isPowerOffCountDown = true
}
//停服命令下发失败
3 -> {
viewCheckShutDown.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.icon_toolkit_item_stop_service_fail
)
)
}
//停服命令下发超时
4 -> {
//将图标改为失败
viewCheckShutDown.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.icon_toolkit_item_stop_service_fail
)
)
}
//停服中
5 -> {
isPowerOffCountDown = true
viewCheckShutDown.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.icon_toolkit_item_stop_service_background
)
)
viewProgressBackground.visibility = View.VISIBLE
viewProgress.visibility = View.VISIBLE
tvCountDown.visibility = View.VISIBLE
tvCountDownUnit.visibility = View.VISIBLE
//开始旋转动画
if (progressAnimator == null) {
progressAnimator = ObjectAnimator.ofFloat(viewProgress, "rotation", 0f, 360f)
}
progressAnimator?.interpolator = LinearInterpolator()
progressAnimator?.repeatCount = ValueAnimator.INFINITE //无限循环
progressAnimator?.duration = 10000 //设置持续时间
progressAnimator?.startDelay = 0
progressAnimator?.start()
}
//停服成功
6 -> {
//停止一键停服进度属性动画
progressAnimator?.cancel()
//隐藏一键停服进度视图
viewProgressBackground.visibility = View.GONE
viewProgress.visibility = View.GONE
tvCountDown.visibility = View.GONE
tvCountDownUnit.visibility = View.GONE
//一键停服命令倒计时结束变为成功状态并且发送1s倒计时
viewCheckShutDown.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.icon_toolkit_item_stop_service_success
)
)
isPowerOffCountDown = false
}
//停服成功不可点击
7 -> {
//将倒计时内容隐藏
viewProgressBackground.visibility = View.GONE
viewProgress.visibility = View.GONE
tvCountDown.visibility = View.GONE
tvCountDownUnit.visibility = View.GONE
//停服成功,将按钮置为不可点击状态
viewCheckShutDown.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.icon_toolkit_item_stop_service_complete
)
)
viewCheckShutDown.isClickable = false
isPowerOffCountDown = false
}
}
}
/**
* 一键停服
*/
private fun powerOff() {
if (!connectStatus) {
// ToastUtils.showShort("尚未连接工控机,无法下发一键停服命令")
ToastUtils.showShort(R.string.module_mogo_core_function_hmi_not_sent_shutdown_ipc)
return
}
if (AppConfigInfo.dockerVersion.isEmpty()) {
// ToastUtils.showShort("尚未连接工控机,无法下发一键停服命令")
ToastUtils.showShort(R.string.module_mogo_core_function_hmi_not_sent_shutdown_ipc)
return
}
if (ParseVersionUtils.parseVersion(true, AppConfigInfo.dockerVersion) < 40100) {
// ToastUtils.showShort("此域控版本不支持一键停服功能最低支持版本为4.1.0")
ToastUtils.showShort(R.string.module_mogo_core_function_hmi_ipc_version_nonsupport_shutdown_ipc)
return
}
if (CallerAutoPilotStatusListenerManager.getState() == 2) {
//当前处于自动驾驶状态不可进行重启Toast提示
// ToastUtils.showShort("请先退出自动驾驶状态")
ToastUtils.showShort(R.string.module_mogo_core_function_hmi_please_exit_autopilot_state)
return
}
if (isExecutingPowerOff) {
//一键停服命令下发执行中
// ToastUtils.showShort("一键停服命令下发中,请勿重复点击")
ToastUtils.showShort(R.string.module_mogo_core_function_hmi_sending_shutdown_ipc)
return
}
if (isPowerOffCountDown) {
//系统停服中
// ToastUtils.showShort("系统停服中,请勿重复点击")
ToastUtils.showShort(R.string.module_mogo_core_function_hmi_shutdowning_ipc)
return
}
//将是否正在下发一键停服命令标签改为true
isExecutingPowerOff = true
CallerDevaToolsManager.setPowerOffStatus(1)
hmiAction("$M_HMI$TAG", mapOf("powerOff" to true))
//系统命令请求 关机
powerOffMsgId = CallerAutoPilotControlManager.sendIpcPowerOff()
hmiAction("$M_HMI$TAG", mapOf("powerOffID" to powerOffMsgId))
//开始执行10秒等待倒计时
CallerDevaToolsManager.startCommandWaitCountDown()
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
CallerPowerOffManager.addListener(TAG, this)
CallerReceiveReceivedAckListenerManager.addListener(TAG, this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerAutoPilotStatusListenerManager.removeListener(TAG)
CallerPowerOffManager.removeListener(TAG)
CallerReceiveReceivedAckListenerManager.removeListener(TAG)
}
override fun onAutopilotIpcConnectStatusChanged(
status: AdasConstants.IpcConnectionStatus,
reason: String?
) {
super.onAutopilotIpcConnectStatusChanged(status, reason)
ThreadUtils.runOnUiThread {
setViewStatus(status == AdasConstants.IpcConnectionStatus.CONNECTED)
}
}
private fun setViewStatus(connectInfo: Boolean) {
connectStatus = connectInfo
//下发一键停服命令后又和域控重新连接
if ((powerOffStatus == 6 || powerOffStatus == 7) && connectStatus) {
CallerDevaToolsManager.setPowerOffStatus(0)
viewCheckShutDown.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.icon_toolkit_item_stop_service
)
)
viewCheckShutDown.isClickable = true
}
}
/**
* 一键停服调用SSM停服命令超时
*/
override fun commandTimeout() {
//停止命令超时倒计时
CallerDevaToolsManager.stopCommandWaitCountDown()
/**
* 如果点击一键停服按钮10秒后是否正在执行命令的标签仍为true代表域控未返回执行结果
* 此时应该将按钮状态短暂置为失败之后再置为常态并将此标签置为false
*/
if (isExecutingPowerOff) {
//更改标签状态
isExecutingPowerOff = false
CallerDevaToolsManager.setPowerOffStatus(4)
//将图标改为失败
viewCheckShutDown.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.icon_toolkit_item_stop_service_fail
)
)
//执行1秒倒计时命令
CallerDevaToolsManager.statusChangeCountDown(false)
}
}
/**
* 一键停服车辆下电等待倒计时
*/
override fun powerDownTick(second: Int) {
tvCountDown.text = second.toString()
CallerDevaToolsManager.setPowerOffStatus(5)
}
/**
* 一键停服车辆下电等待倒计时结束
*/
override fun powerDownFinish() {
CallerDevaToolsManager.setPowerOffStatus(6)
//停止一键停服进度属性动画
progressAnimator?.cancel()
//隐藏一键停服进度视图
viewProgressBackground.visibility = View.GONE
viewProgress.visibility = View.GONE
tvCountDown.visibility = View.GONE
tvCountDownUnit.visibility = View.GONE
//一键停服命令倒计时结束变为成功状态并且发送1s倒计时
viewCheckShutDown.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.icon_toolkit_item_stop_service_success
)
)
isPowerOffCountDown = false
//执行1秒倒计时命令
CallerDevaToolsManager.statusChangeCountDown(true)
}
/**
* 一键停服状态按钮变更通知
*/
override fun statusChange(isSuccess: Boolean) {
CallerDevaToolsManager.stopStatusCountDown()
if (isSuccess) {
//将倒计时内容隐藏
viewProgressBackground.visibility = View.GONE
viewProgress.visibility = View.GONE
tvCountDown.visibility = View.GONE
tvCountDownUnit.visibility = View.GONE
//停服成功,将按钮置为不可点击状态
viewCheckShutDown.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.icon_toolkit_item_stop_service_complete
)
)
viewCheckShutDown.isClickable = false
CallerDevaToolsManager.setPowerOffStatus(7)
} else {
//停服命令下发失败,将按钮置为常态,可点击
viewCheckShutDown.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.icon_toolkit_item_stop_service
)
)
viewCheckShutDown.isClickable = true
}
}
/**
* 命令下发回执
*/
override fun onReceiveReceivedAck(receivedAck: ReceivedAck) {
ThreadUtils.runOnUiThread {
if (receivedAck.messageType == MessageType.TYPE_SEND_SYSTEM_CMD_REQ && receivedAck.msgId == powerOffMsgId) {
isExecutingPowerOff = false
//停止命令超时倒计时
CallerDevaToolsManager.stopCommandWaitCountDown()
if (receivedAck.status == ReceivedAck.Status.NORMAL) {
//一键停服命令回执成功则正常进入停服阶段中1分钟倒计时并且TTS和消息盒子提示
CallerDevaToolsManager.setPowerOffStatus(2)
// AIAssist.getInstance(context).speakTTSVoice("请等待1分钟再执行车辆下电")
AIAssist.getInstance(context).speakTTSVoice(StringUtils.getString(R.string.module_core_one_minute_later_power_off))
saveMsgBox(
MsgBoxBean(
MsgBoxType.V2X, V2XMsg(
EventTypeEnumNew.TYPE_POWER_OFF_TIP.poiType,
EventTypeEnumNew.TYPE_POWER_OFF_TIP.content,
EventTypeEnumNew.TYPE_POWER_OFF_TIP.tts
)
)
)
viewCheckShutDown.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.icon_toolkit_item_stop_service_background
)
)
viewProgressBackground.visibility = View.VISIBLE
viewProgress.visibility = View.VISIBLE
tvCountDown.visibility = View.VISIBLE
tvCountDownUnit.visibility = View.VISIBLE
//开始旋转动画
if (progressAnimator == null) {
progressAnimator =
ObjectAnimator.ofFloat(viewProgress, "rotation", 0f, 360f)
}
progressAnimator?.interpolator = LinearInterpolator()
progressAnimator?.repeatCount = ValueAnimator.INFINITE //无限循环
progressAnimator?.duration = 2500 //设置持续时间
progressAnimator?.startDelay = 0
progressAnimator?.start()
//开始60S倒计时
CallerDevaToolsManager.startPowerDownCountDown()
//一键停服倒计时中
isPowerOffCountDown = true
} else {
//一键停服命令回执失败,则走失败流程
CallerDevaToolsManager.setPowerOffStatus(3)
viewCheckShutDown.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.icon_toolkit_item_stop_service_fail
)
)
//执行1秒倒计时命令
CallerDevaToolsManager.statusChangeCountDown(false)
}
}
}
}
}

View File

@@ -97,6 +97,7 @@ import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager
import com.mogo.eagle.core.function.call.obu.CallerObuApiManager
import com.mogo.eagle.core.function.call.obu.CallerObuConnectListenerManager
import com.mogo.eagle.core.function.call.obu.CallerObuInfoListenerManager
import com.mogo.eagle.core.function.call.och.CallerOchBizFunctionCall4EagleManager
import com.mogo.eagle.core.function.call.setting.CallerMapShowNameManager
import com.mogo.eagle.core.function.call.setting.CallerMoGoUiSettingManager
import com.mogo.eagle.core.function.call.setting.CallerSopSettingManager
@@ -110,6 +111,7 @@ import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.kotlin.scope
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.CockpitType
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
@@ -262,6 +264,7 @@ import kotlinx.android.synthetic.main.view_debug_setting.view.tbIsStrictMode
import kotlinx.android.synthetic.main.view_debug_setting.view.tbLanguage
import kotlinx.android.synthetic.main.view_debug_setting.view.tbLogCatch
import kotlinx.android.synthetic.main.view_debug_setting.view.tbLogcatCenter
import kotlinx.android.synthetic.main.view_debug_setting.view.tbLoginLogout
import kotlinx.android.synthetic.main.view_debug_setting.view.tbNetLog
import kotlinx.android.synthetic.main.view_debug_setting.view.tbObuController
import kotlinx.android.synthetic.main.view_debug_setting.view.tbObuLog
@@ -882,6 +885,22 @@ internal class DebugSettingView @JvmOverloads constructor(
else -> {}
}
if (AppIdentityModeUtils.getCockpitType() == CockpitType.UNMANNED) {
tbLoginLogout.visibility = if (CallerOchBizFunctionCall4EagleManager.isLogin()) View.VISIBLE else View.GONE
} else {
tbLoginLogout.visibility = View.GONE
}
//退出登录
tbLoginLogout.setOnCheckedChangeListener { buttonView, isChecked ->
if (CallerOchBizFunctionCall4EagleManager.isLogin()) {
CallerOchBizFunctionCall4EagleManager.logout()
} else {
ToastUtils.showShort("无法退出,状态获取错误")
}
}
/**
* 语言
*/

View File

@@ -1,5 +1,8 @@
package com.mogo.eagle.core.function.hmi.ui.widget
import android.animation.Animator
import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.app.Activity
import android.graphics.PixelFormat
import android.util.DisplayMetrics
@@ -7,15 +10,21 @@ import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
import android.view.animation.DecelerateInterpolator
import android.view.animation.LinearInterpolator
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.CockpitType
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.eagle.core.widget.media.video.SkinSimpleVideoPlayer
import com.mogo.skin.utils.SkinResources
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder
import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack
import com.zhjt.mogo_core_function_devatools.coldstart.ColdStartConfig
import me.jessyan.autosize.utils.AutoSizeUtils
/**
* 打开app后首次与域控链接或与域控断连1min后需要回到界面并呈现一遍流程
@@ -30,6 +39,9 @@ class ColdStartAgainWindow constructor(activity: Activity){
private lateinit var clColdStartAgain: ConstraintLayout
private lateinit var svpColdStart: SkinSimpleVideoPlayer
private lateinit var coldStart: ColdStartView
private lateinit var cl_welcome_info: View
private var showLoginInfoAnimator11: ObjectAnimator? = null
private var showLoginInfoAnimator22: ObjectAnimator? = null
private val gsyVideoOptionBuilder = GSYVideoOptionBuilder()
@@ -42,6 +54,7 @@ class ColdStartAgainWindow constructor(activity: Activity){
clColdStartAgain = mFloatLayout.findViewById(R.id.cl_cold_start_again)
svpColdStart = mFloatLayout.findViewById(R.id.svp_cold_start)
coldStart = mFloatLayout.findViewById(R.id.view_cold_start_again)
cl_welcome_info = mFloatLayout.findViewById(R.id.cl_welcome_info)
val videoUrl:String = if (AppIdentityModeUtils.isT1T2(FunctionBuildConfig.appIdentityMode)) {
svpColdStart.setBackgroundResource(R.drawable.biz_login_bg_taxi_start)
@@ -67,6 +80,46 @@ class ColdStartAgainWindow constructor(activity: Activity){
.setPlayTag("TaxiPassengerArrivedView")
.build(svpColdStart)
if (AppIdentityModeUtils.getCockpitType() == CockpitType.UNMANNED) {
if (showLoginInfoAnimator11 == null) {
showLoginInfoAnimator11 = ObjectAnimator.ofFloat(cl_welcome_info, "alpha", 0f, 1f)
showLoginInfoAnimator11?.interpolator = LinearInterpolator()
}
if (showLoginInfoAnimator22 == null) {
val dp2px = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(), -50f)
showLoginInfoAnimator22 = ObjectAnimator.ofFloat(cl_welcome_info, "translationY", 0f, dp2px.toFloat())
showLoginInfoAnimator22?.interpolator = DecelerateInterpolator()
}
UiThreadHandler.postDelayed({
cl_welcome_info.let {
val animatorSet = AnimatorSet()
animatorSet.playTogether(showLoginInfoAnimator11, showLoginInfoAnimator22)
animatorSet.duration = 500
animatorSet.addListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator) {
cl_welcome_info.visibility = View.VISIBLE
}
override fun onAnimationEnd(animation: Animator) {
}
override fun onAnimationCancel(animation: Animator) {
}
override fun onAnimationRepeat(animation: Animator) {
}
})
animatorSet.start()
}
}, 1_000, UiThreadHandler.MODE.QUEUE)
} else {
cl_welcome_info.visibility = View.GONE
}
svpColdStart.setVideoAllCallBack(object : GSYSampleCallBack() {
override fun onAutoComplete(url: String?, vararg objects: Any?) {
if (AppIdentityModeUtils.isT1T2(FunctionBuildConfig.appIdentityMode)) {

View File

@@ -14,6 +14,9 @@ import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import kotlinx.android.synthetic.main.view_status_bar_unmanned.view.viewTextClock
/**
* 无人化状司机屏态栏
*/
class StatusBarUnmannedView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
@@ -26,7 +29,7 @@ class StatusBarUnmannedView @JvmOverloads constructor(
init {
LayoutInflater.from(context).inflate(R.layout.view_status_bar_unmanned, this, true)
background = ColorDrawable(Color.parseColor("#A6000000")) // 黑色的65%
background = ColorDrawable(Color.parseColor("#00222222"))
}
override fun onAttachedToWindow() {

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

View File

@@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/clCheckSystem"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/viewCheckShutDown"
android:layout_width="@dimen/dp_100"
android:layout_height="@dimen/dp_100"
android:contentDescription="@string/check_system_shut_down"
android:scaleType="fitXY"
android:src="@drawable/icon_toolkit_item_stop_service"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@drawable/icon_toolkit_item_stop_service_background" />
<ImageView
android:id="@+id/viewProgressBackground"
android:layout_width="@dimen/dp_53"
android:layout_height="@dimen/dp_53"
android:layout_marginLeft="@dimen/dp_27"
android:layout_marginTop="@dimen/dp_19"
android:src="@drawable/icon_toolkit_item_stop_service_process_background"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="@id/viewCheckShutDown"
app:layout_constraintTop_toTopOf="@id/viewCheckShutDown"
tools:visibility="visible" />
<ImageView
android:id="@+id/viewProgress"
android:layout_width="@dimen/dp_53"
android:layout_height="@dimen/dp_53"
android:layout_marginLeft="@dimen/dp_27"
android:layout_marginTop="@dimen/dp_19"
android:src="@drawable/icon_toolkit_item_stop_service_process"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="@id/viewCheckShutDown"
app:layout_constraintTop_toTopOf="@id/viewCheckShutDown"
tools:visibility="visible" />
<TextView
android:id="@+id/tvCountDown"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="@dimen/sp_18"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/viewProgress"
app:layout_constraintEnd_toEndOf="@id/viewProgress"
app:layout_constraintStart_toStartOf="@id/viewProgress"
app:layout_constraintTop_toTopOf="@id/viewProgress"
tools:text="20"
tools:visibility="visible" />
<TextView
android:id="@+id/tvCountDownUnit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="s"
android:textColor="#B2FFFFFF"
android:textSize="@dimen/sp_13"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/tvCountDown"
app:layout_constraintStart_toEndOf="@id/tvCountDown"
tools:visibility="visible" />
<TextView
android:id="@+id/tvCheckShutDown"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_10"
android:ellipsize="end"
android:gravity="center"
android:maxLines="1"
android:text="@string/check_system_shut_down"
android:textColor="@color/color_FFFFFF"
android:textSize="@dimen/sp_40"
app:layout_constraintBottom_toBottomOf="@id/viewCheckShutDown"
app:layout_constraintStart_toEndOf="@id/viewCheckShutDown"
app:layout_constraintTop_toTopOf="@id/viewCheckShutDown" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -233,6 +233,18 @@
android:layout_height="1dp"
android:background="#F0F0F0" />
<ToggleButton
android:id="@+id/tbLoginLogout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_10"
android:background="@drawable/radio_button_normal_background_right"
android:padding="@dimen/dp_20"
android:textColor="#000"
android:textOff="退出"
android:textOn="退出"
android:textSize="@dimen/dp_24" />
<ToggleButton
android:id="@+id/tbLanguage"
android:layout_width="match_parent"
@@ -243,7 +255,8 @@
android:padding="@dimen/dp_20"
android:textOff="语言"
android:textOn="语言"
android:textSize="@dimen/dp_24" />
android:textSize="@dimen/dp_24"
android:visibility="gone" />
<LinearLayout
android:id="@+id/layoutLanguage"

View File

@@ -3,8 +3,8 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_status_bar_height"
tools:background="#A6000000"
android:layout_height="84dp"
tools:background="#222222"
tools:parentTag="android.widget.FrameLayout">
<LinearLayout
@@ -14,12 +14,13 @@
<TextClock
android:id="@+id/viewTextClock"
android:layout_width="wrap_content"
android:layout_width="190dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginStart="@dimen/dp_61"
android:layout_marginStart="@dimen/dp_40"
android:format12Hour="HH:mm:ss"
android:format24Hour="HH:mm:ss"
android:gravity="center_horizontal|start"
android:textColor="#ffffff"
android:textSize="@dimen/dp_45"
android:textStyle="bold" />
@@ -29,7 +30,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginStart="@dimen/dp_30" />
android:layout_marginStart="@dimen/dp_20"
app:wifi_show_title="true" />
<Space
android:layout_width="0dip"
@@ -37,18 +39,11 @@
android:layout_weight="1" />
<LinearLayout
android:id="@+id/viewStatusBarRight"
<com.mogo.eagle.core.function.hmi.ui.widget.BatteryGroupView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/dp_40"
android:orientation="horizontal">
<com.mogo.eagle.core.function.hmi.ui.widget.BatteryGroupView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
android:layout_gravity="center"
android:layout_marginEnd="@dimen/dp_40" />
</LinearLayout>
<ImageView

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/topStatusContainer"
android:layout_width="@dimen/dp_964"
android:layout_height="@dimen/dp_359"
android:background="@drawable/unmanned_bone_status_bg">
<com.mogo.eagle.core.function.hmi.bone.status.speed.SpeedView
android:id="@+id/speed_custom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_79"
android:layout_marginTop="@dimen/dp_10"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<FrameLayout
android:id="@+id/startAutoPilotContainer"
android:layout_width="@dimen/dp_282"
android:layout_height="@dimen/dp_282"
android:layout_marginTop="@dimen/dp_18_5"
android:layout_marginRight="@dimen/dp_43"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -14,6 +14,31 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:id="@+id/cl_welcome_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_166"
android:layout_marginTop="@dimen/dp_700"
android:orientation="vertical"
android:visibility="gone"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:layout_width="@dimen/dp_444"
android:layout_height="@dimen/dp_98"
android:text="@string/login_welcome_on"
android:textColor="#FF394047"
android:textSize="@dimen/sp_70" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_10"
android:src="@drawable/biz_login_robobus" />
</LinearLayout>
<com.mogo.eagle.core.function.hmi.ui.widget.ColdStartView
android:id="@+id/view_cold_start_again"
android:layout_width="match_parent"

View File

@@ -302,5 +302,5 @@
<string name="date_cannot_copy">Selected Date Unavailable</string>
<string name="common_traffic_light_status">Traffic Light Background</string>
<string name="login_welcome_on">Welcome on</string>
</resources>

View File

@@ -303,5 +303,5 @@
<string name="date_cannot_copy">所选日期无法拷贝</string>
<string name="common_traffic_light_status">红绿灯灯态背景</string>
<string name="login_welcome_on">欢迎乘坐</string>
</resources>