Merge branch 'tmp_6.7.0_arrow' into dev_robotaxi-d_240912_6.7.0

This commit is contained in:
EmArrow
2024-09-13 02:54:44 +08:00
79 changed files with 1381 additions and 101 deletions

View File

@@ -20,6 +20,7 @@ import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_AD
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_ROUTE
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_STATUS
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_STATUS_QUERY_RESP
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_SYSTEM_STATUS
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_TRAJECTORY
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_V2N_EVENT
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_VEHICLE
@@ -444,9 +445,16 @@ class MoGoAdasListenerImpl : OnAdasListener {
} else {
CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().ssmAutoPilotReady = false
}
invokeAutopilotStatusRespByQuery(statusInfo)
}
@ChainLog(
linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT,
linkCode = CHAIN_SOURCE_ADAS,
nodeAliasCode = CHAIN_CODE_ADAS_SYSTEM_STATUS,
paramIndexes = [0, 1]
)
override fun onSystemStatus(header: MessagePad.Header?, statusInf: SsmInfo.SsmStatusInf?) {
if (statusInf != null && statusInf.hasAutoPilotReady()) {
CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().ssmAutoPilotReady =

View File

@@ -166,6 +166,8 @@ class FSMStatus(var state: FSMStateCode, var desc: String = ""): Status(), IAuto
}
override fun isException(): Boolean = state == FSMStateCode.ExistError
fun hasFSMModule(): Boolean = (state == FSMStateCode.ExistNormal) || (state == FSMStateCode.ExistError)
}
/**

View File

@@ -36,12 +36,12 @@ internal class StatusView(private val model: StatusModel, ctx: Context): Constra
override fun onAttachedToWindow() {
super.onAttachedToWindow()
val adapter = model.status.value?.let { data -> StatusAdapter(context, data.second.filter { (it !is IAutopilotPreLaunchStatus) || (it is FSMStatus)}) }?.also { adapter -> rv.adapter = adapter }
val adapter = model.status.value?.let { data -> StatusAdapter(context, data.second.filter { it !is IAutopilotPreLaunchStatus }) }?.also { adapter -> rv.adapter = adapter }
adapter?.let { _ ->
observer?.also { model.status.removeObserver(it) }
model.status.observeForever(Observer<Pair<Status?, ArrayList<Status>>> { data ->
val old = adapter.data
val update = data.second.filter { (it !is IAutopilotPreLaunchStatus) || (it is FSMStatus) }
val update = data.second.filter { it !is IAutopilotPreLaunchStatus }
val result = DiffUtil.calculateDiff(StatusDiffCallback(old, update))
adapter.data = update
result.dispatchUpdatesTo(adapter)

View File

@@ -69,6 +69,7 @@ dependencies {
// releaseImplementation rootProject.ext.dependencies.releaseleakcanary
implementation rootProject.ext.dependencies.arouter
implementation project(path: ':core:function-impl:mogo-core-function-map')
implementation project(':core:function-impl:mogo-core-function-devatools')
kapt rootProject.ext.dependencies.aroutercompiler
implementation rootProject.ext.dependencies.android_start_up

View File

@@ -0,0 +1,25 @@
package com.mogo.eagle.core.function.hmi.bone
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.function.hmi.R
class BoneContainerView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
init {
LayoutInflater.from(context).inflate(R.layout.view_bone_container, this, true)
initView()
}
private fun initView() {
}
}

View File

@@ -0,0 +1,111 @@
package com.mogo.eagle.core.function.hmi.bone
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
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.scene.SceneConstant.Companion.M_HMI
import kotlinx.android.synthetic.main.view_bone_tab.view.carInfoTabView
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 kotlin.properties.Delegates
class BoneTabLayout @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
companion object{
private const val TAG = "BoneTabLayout"
}
private enum class TabType {
NONE,
CAR_INFO,
MSG_INFO,
REPORT_INFO,
MORE_INFO
}
private var tabType by Delegates.observable(TabType.NONE) { _, oldValue, newValue ->
CallerLogger.i("$M_HMI$TAG", "tabType old:$oldValue , new:$newValue")
if (oldValue != newValue) {
updateTab(oldValue, false)
updateTab(newValue, true)
} else {
updateTab(oldValue, false)
}
}
init {
LayoutInflater.from(context).inflate(R.layout.view_bone_tab, this, true)
initView()
}
private fun initView() {
tabSwitchCarInfo.setOnClickListener {
updateTabType(TabType.CAR_INFO)
}
tabSwitchMsgBox.setOnClickListener {
updateTabType(TabType.MSG_INFO)
}
tabSwitchReport.setOnClickListener {
updateTabType(TabType.REPORT_INFO)
}
tabSwitchMore.setOnClickListener {
updateTabType(TabType.MORE_INFO)
}
}
private fun updateTabType(changeType: TabType) {
tabType = if (tabType == changeType) {
TabType.NONE
} else {
changeType
}
}
private fun updateTab(tabType: TabType, check: Boolean) {
CallerLogger.i("$M_HMI$TAG", "updateTab tabType:$tabType , check:$check")
when (tabType) {
TabType.CAR_INFO -> {
tabSwitchCarInfo.switchTab(check)
carInfoTabView.visibility = if (check) VISIBLE else GONE
}
TabType.MSG_INFO -> {
tabSwitchMsgBox.switchTab(check)
if (check) {
} else {
}
}
TabType.REPORT_INFO -> {
tabSwitchReport.switchTab(check)
if (check) {
} else {
}
}
TabType.MORE_INFO -> {
tabSwitchMore.switchTab(check)
if (check) {
} else {
}
}
else -> {}
}
}
}

View File

@@ -0,0 +1,51 @@
package com.mogo.eagle.core.function.hmi.bone
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.bone.status.StartAutoPilotStatusView
import kotlinx.android.synthetic.main.view_bone_top_status.view.topStatusContainer
class BoneTopStatusLayout @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr),
StartAutoPilotStatusView.IStartAutoPilotStatusChanged {
companion object {
const val TAG = "BoneTopStatusLayout"
}
init {
LayoutInflater.from(context).inflate(R.layout.view_bone_top_status, this, true)
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
StartAutoPilotStatusView.addStatusChangedListener(TAG, this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
StartAutoPilotStatusView.removeStatusChangedListener(TAG)
}
override fun onStatusError() {
super.onStatusError()
context?.also {
topStatusContainer.background = ContextCompat.getDrawable(
it, R.drawable.bg_top_status_layout_error
)
}
}
override fun onStatusNormal() {
super.onStatusNormal()
context?.also {
topStatusContainer.background =
ContextCompat.getDrawable(it, R.drawable.bg_top_status_layout_normal)
}
}
}

View File

@@ -0,0 +1,62 @@
package com.mogo.eagle.core.function.hmi.bone
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.function.hmi.R
import kotlinx.android.synthetic.main.view_tab_switch.view.ivTabClick
import kotlinx.android.synthetic.main.view_tab_switch.view.ivTabClickBg
import kotlinx.android.synthetic.main.view_tab_switch.view.ivTabDefault
class TabSwitchView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
private var tabDefaultRes = -1
private var tabClickRes = -1
private var tabClickBgRes = -1
private var isCheck = false
init {
LayoutInflater.from(context).inflate(R.layout.view_tab_switch, this, true)
try {
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.TabSwitch)
tabDefaultRes = typedArray.getResourceId(R.styleable.TabSwitch_defaultRes, -1)
tabClickRes = typedArray.getResourceId(R.styleable.TabSwitch_clickRes, -1)
tabClickBgRes = typedArray.getResourceId(R.styleable.TabSwitch_clickBgRes, -1)
typedArray.recycle()
} catch (e: Exception) {
e.printStackTrace()
}
initView()
}
private fun initView() {
ivTabDefault.setImageResource(tabDefaultRes)
ivTabClick.setImageResource(tabClickRes)
ivTabClickBg.setImageResource(tabClickBgRes)
}
fun switchTab(isCheck: Boolean) {
if (isCheck != this.isCheck) {
this.isCheck = isCheck
notifyView()
}
}
private fun notifyView() {
if (isCheck) {
ivTabClick.visibility = View.VISIBLE
ivTabClickBg.visibility = View.VISIBLE
} else {
ivTabClick.visibility = View.GONE
ivTabClickBg.visibility = View.GONE
}
}
}

View File

@@ -0,0 +1,264 @@
package com.mogo.eagle.core.function.hmi.bone.status
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import chassis.Chassis
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.zhjt.mogo_core_function_devatools.status.StatusManager
import com.zhjt.mogo_core_function_devatools.status.entity.AcceleratorStatus
import com.zhjt.mogo_core_function_devatools.status.entity.BrakeStatus
import com.zhjt.mogo_core_function_devatools.status.entity.DoubleFlashStatus
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
import kotlinx.android.synthetic.main.view_start_autopilot_status.view.iv_accelerator
import kotlinx.android.synthetic.main.view_start_autopilot_status.view.iv_brake
import kotlinx.android.synthetic.main.view_start_autopilot_status.view.iv_double_flash
import kotlinx.android.synthetic.main.view_start_autopilot_status.view.iv_steer
import kotlinx.android.synthetic.main.view_start_autopilot_status.view.tv_gear
import kotlinx.android.synthetic.main.view_start_autopilot_status.view.withoutFSMStatusLayout
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.atomic.AtomicBoolean
/**
* 自动驾驶相关的状态展示view
* 1, 有 FSM 模块:展示 FSM 的当前状态,启动自驾时人工干预主要由 FSM 拦截,非自驾/自驾 状态都展示异常
* 2无 FSM 模块:展示 启动前 档位/方向盘/油门/刹车/双闪 等状态,人工干预由鹰眼判断拦截,鹰眼数据源为 CanAdapter,
* 如果当前在自动驾驶状态 则不显示人工干预异常状态
*/
class StartAutoPilotStatusView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), StatusManager.IStatusListener {
companion object {
private const val TAG = "StartAutoPilotStatusView"
private val statusChangedListeners by lazy { ConcurrentHashMap<String, IStartAutoPilotStatusChanged>() }
fun addStatusChangedListener(tag: String, listener: IStartAutoPilotStatusChanged) {
if (statusChangedListeners.containsKey(tag)) {
statusChangedListeners.remove(tag)
}
statusChangedListeners[tag] = listener
}
fun removeStatusChangedListener(tag: String) {
statusChangedListeners.remove(tag)
}
}
private val hasFSM by lazy { AtomicBoolean(false) }
init {
LayoutInflater.from(context).inflate(R.layout.view_start_autopilot_status, this, true)
initView()
}
private fun initView() {
// 默认展示 有 FSM 的情况,未知状态
changeStatusContainer(true)
handleFSM(FSMStatus(FSMStateCode.UnKnown, "未知"))
}
/**
* 根据是否有 FSM 切换展示的容器
*/
private fun changeStatusContainer(hasFSMModule: Boolean) {
CallerLogger.i(TAG, "changeStatusContainer 切换展示hasFSM=$hasFSMModule")
if (hasFSMModule) {
fSMStatusLayout?.visibility = View.VISIBLE
withoutFSMStatusLayout?.visibility = View.GONE
} else {
fSMStatusLayout?.visibility = View.GONE
withoutFSMStatusLayout?.visibility = View.VISIBLE
}
}
private fun handleFSM(status: FSMStatus) {
Logger.d(TAG, "--- handleFSM ---:${status.isException()}")
val lastHasFSM = hasFSM.get()
val newHasFSM = status.hasFSMModule()
hasFSM.set(newHasFSM)
if (lastHasFSM != newHasFSM) {
changeStatusContainer(status.hasFSMModule())
}
when (status.state) {
FSMStateCode.UnKnown -> {
fSMStatusLayout?.setOnClickListener(null)
fSMStatusLayout?.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.icon_fsm_status_bg_unknown
)
)
}
FSMStateCode.NotExist -> {
fSMStatusLayout?.setOnClickListener(null)
fSMStatusLayout?.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.icon_fsm_status_bg_unknown
)
)
}
FSMStateCode.ExistNormal -> {
fSMStatusLayout?.setOnClickListener(null)
fSMStatusLayout?.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.icon_fsm_status_bg_normal
)
)
}
FSMStateCode.ExistError -> {
// TODO
fSMStatusLayout?.onClick {
ToastUtils.showLong("onClick")
}
fSMStatusLayout?.setImageDrawable(
ContextCompat.getDrawable(
context,
R.drawable.icon_fsm_status_bg_error
)
)
}
}
notifyStatus(status.isException())
}
private fun handleWithoutFSM(status: Status) {
val isError =
status.isException() && CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
Logger.d(TAG, "--- handleWithoutFSM ---: $isError")
when (status) {
is GearStatus -> {
val position = try {
Chassis.GearPosition.valueOf(status.value)
} catch (ignore: Throwable) {
Chassis.GearPosition.GEAR_NONE
}
if (tv_gear?.isEnabled == true) {
tv_gear?.isEnabled = false
}
when (position) {
Chassis.GearPosition.GEAR_N -> {
tv_gear.isEnabled = isError
tv_gear.text = "N"
}
Chassis.GearPosition.GEAR_R -> {
tv_gear.isEnabled = isError
tv_gear.text = "R"
}
Chassis.GearPosition.GEAR_P -> {
tv_gear.isEnabled = isError
tv_gear.text = "P"
}
Chassis.GearPosition.GEAR_D -> {
tv_gear.isEnabled = isError
tv_gear.text = "D"
}
Chassis.GearPosition.GEAR_NONE -> {
tv_gear.isEnabled = false
tv_gear.text = ""
}
else -> {}
}
}
is AcceleratorStatus -> {
iv_accelerator?.isSelected = isError
}
is BrakeStatus -> {
iv_brake?.isSelected = isError
}
is DoubleFlashStatus -> {
iv_double_flash?.isSelected = isError
}
is SteerStatus -> {
iv_steer?.isSelected = isError
}
is SpeedStatus -> {
// TODO
}
else -> {
Logger.d(TAG, "other state: $status")
}
}
notifyStatus(isError)
}
private fun notifyStatus(isError: Boolean) {
statusChangedListeners.values.forEach { itx ->
if (isError) {
itx.onStatusError()
} else {
itx.onStatusNormal()
}
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
StatusManager.addListener(TAG, this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
StatusManager.removeListener(TAG)
}
/**
* @param changed: 变化的数据
* @param all: 所有状态数据
*/
override fun onStatusChanged(changed: List<Status>, all: List<Status>) {
changed.filter { it is IAutopilotPreLaunchStatus }.forEach { status ->
when (status) {
is FSMStatus -> {
handleFSM(status)
}
else -> {
handleWithoutFSM(status)
}
}
}
}
interface IStartAutoPilotStatusChanged {
fun onStatusNormal() {}
fun onStatusError() {}
}
}

View File

@@ -0,0 +1,243 @@
package com.mogo.eagle.core.function.hmi.bone.tab
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.commons.storage.SharedPrefsMgr
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener
import com.mogo.eagle.core.function.api.hmi.autopilot.IMoGoCheckAutoPilotBtnListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager
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.hmi.CallerHmiListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.tools.OfflineMapDialog
import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
import com.mogo.eagle.core.utilcode.util.AppUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.map.MogoData
import kotlinx.android.synthetic.main.view_car_info_tab.view.tvADMapVersion
import kotlinx.android.synthetic.main.view_car_info_tab.view.tvADVersion
import kotlinx.android.synthetic.main.view_car_info_tab.view.tvCarExit
import kotlinx.android.synthetic.main.view_car_info_tab.view.tvCarLoginInfo
import kotlinx.android.synthetic.main.view_car_info_tab.view.tvCarNo
import kotlinx.android.synthetic.main.view_car_info_tab.view.tvHDMapUpdate
import kotlinx.android.synthetic.main.view_car_info_tab.view.tvPADUpdate
import kotlinx.android.synthetic.main.view_car_info_tab.view.tvPadVersion
import kotlinx.android.synthetic.main.view_car_info_tab.view.tvSnInfo
import mogo.telematics.pad.MessagePad
import system_master.SsmInfo
import system_master.SystemStatusInfo
private fun String.parsePlateNo(): String {
return substring(0, 2) + " " + substring(2)
}
private fun String.parsePhoneNo(): String {
return take(3) + "****" + takeLast(4)
}
class CarInfoTabView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoCheckAutoPilotBtnListener,
IMoGoAutopilotStatusListener, IMoGoDevaToolsListener, IMoGoAutopilotCarConfigListener {
companion object {
private const val TAG = "CarInfoTabView"
}
private var loginOut: (() -> Unit)? = null
@Volatile
private var isHDCached = false
init {
LayoutInflater.from(context).inflate(R.layout.view_car_info_tab, this, true)
initView()
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerHmiListenerManager.addListener(TAG, this)
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
CallerAutopilotCarConfigListenerManager.addListener(TAG, this)
CallerDevaToolsListenerManager.addListener(TAG, this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerHmiListenerManager.removeListener(TAG)
CallerAutoPilotStatusListenerManager.removeListener(TAG)
CallerDevaToolsListenerManager.removeListener(TAG)
}
private fun initView() {
showCurrentPadVersion()
showCurrentAdVersion()
updateAdHdMapVersion()
tvSnInfo.text = SharedPrefsMgr.getInstance().sn
if (AppConfigInfo.plateNumber.isNotEmpty()) {
val plateNo = AppConfigInfo.plateNumber
tvCarNo.text = plateNo.parsePlateNo()
}
tvCarExit.setOnClickListener {
loginOut?.invoke()
}
//鹰眼版本 检查更新
tvPADUpdate.setOnClickListener {
HmiActionLog.hmiAction(
"${SceneConstant.M_HMI}${TAG}",
"pad version view clicked"
)
val provider = CallerDevaToolsManager.upgradeProvider()
if (provider?.isDownloading() == true) {
ToastUtils.showShort("正在下载最新版本,请稍候再试...")
return@setOnClickListener
}
CallerDevaToolsManager.queryAppUpgrade()
}
//高精地图 检查更新
tvHDMapUpdate.setOnClickListener {
HmiActionLog.hmiAction(
"${SceneConstant.M_HMI}${TAG}",
mapOf("isHDCached" to isHDCached)
)
if (isHDCached) { // 已缓存
ToastUtils.showShort(resources.getString(R.string.offline_had_downloaded))
} else {// 未缓存
if (CallerMapUIServiceManager.getCityCode().isNullOrEmpty()) {// 未拿到高德的cityCode
if ((CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().longitude <= 0.0 && CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().latitude <= 0.0)) {// 未拿到高精的经纬度
ToastUtils.showShort(resources.getString(R.string.location_try_again))
} else { // 拿到了高精的经纬度
val dialog = OfflineMapDialog(context)
dialog.location =
CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84()
dialog.show()
}
} else {// 拿到高德的cityCode
OfflineMapDialog(context).show()
}
}
}
MogoData.mogoMapData.get()?.isCityDataCached {
updateHDDataCacheStatus(it)
}
}
private fun showCurrentPadVersion() {
tvPadVersion.text = tvPadVersion.text.toString() + AppUtils.getAppVersionName()
}
fun setLoginInfo(loginNo: String) {
if (loginNo.isNotEmpty()) {
tvCarLoginInfo.text = loginNo.parsePhoneNo()
} else {
tvCarLoginInfo.text = ""
}
}
fun setCarNo(carNo: String) {
// 监听工控的车牌信息,防止调试跳过无车牌内容(链接先后顺序不一致也会导致数据显示异常)
if (carNo.isNotEmpty()) {
if (tvCarNo.text.isNotEmpty() && tvCarNo.text == carNo) {
CallerLogger.i("$M_HMI$TAG", "已存在车牌号")
return
}
tvCarNo.visibility = VISIBLE
tvCarNo.text = carNo.parsePlateNo()
} else {
tvCarNo.visibility = GONE
tvCarNo.text = ""
}
}
override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) {
super.onAutopilotCarConfig(carConfigResp)
carConfigResp.plateNumber?.let {
if (tvCarNo.text.isNotEmpty() && tvCarNo.text == it) {
return
}
tvCarNo.visibility = VISIBLE
tvCarNo.text = it.parsePlateNo()
}
}
fun loginOut(loginOut: (() -> Unit)) {
this.loginOut = loginOut
}
override fun updateHDDataCacheStatus(isCached: Boolean) {
isHDCached = isCached
}
private fun showCurrentAdVersion() {
UiThreadHandler.post {
CallerAutoPilotStatusListenerManager.getDockerVersion()?.let {
tvADVersion.text = tvADVersion.text.toString() + it
}
}
}
override fun onAutopilotDockerInfo(dockerVersion: String) {
super.onAutopilotDockerInfo(dockerVersion)
showCurrentAdVersion()
}
private fun updateAdHdMapVersion() {
if (AppConfigInfo.adHdMapVersion.isNotEmpty()) {
tvADMapVersion.text = tvADMapVersion.text.toString() + AppConfigInfo.adHdMapVersion
}
}
override fun onAutopilotStatusRespByQuery(status: SystemStatusInfo.StatusInfo) {
CallerLogger.i(SceneConstant.M_HMI + TAG, "hdMapVer=" + status.hdMapVer)
//hdMapVer返回示例/home/mogo/autopilot/share/hadmap_engine/data/hadmap_data/db.sqlite|bj|2.2.7|对bus路线上的junction进行修改对原609场景修改为6091、6092、6201、 6202四种细分场景并对通往园区路口改为619
if (status.hdMapVer != null && status.hdMapVer.isNotEmpty()) {
//对地图版本进行截取
val city = status.hdMapVer.substringAfter(".sqlite|").substringBefore("|")
val version = status.hdMapVer.substringAfter("$city|").substringBefore("|")
AppConfigInfo.adHdMapVersion = "${city}_${version}"
updateAdHdMapVersion()
}
}
/**
* 定频SSM接口
* 1hz hq m1 MAP350开始支持其他车型MAP360开始支持
* 定频SSM接入后 onStatusQueryResp 状态查询应答接口将弃用
* @param statusInf 数据
*/
override fun onSystemStatus(statusInf: SsmInfo.SsmStatusInf) {
CallerLogger.i(SceneConstant.M_HMI + TAG, "hdMapVer=" + statusInf.hdMapVer)
//hdMapVer返回示例/home/mogo/autopilot/share/hadmap_engine/data/hadmap_data/db.sqlite|bj|2.2.7|对bus路线上的junction进行修改对原609场景修改为6091、6092、6201、 6202四种细分场景并对通往园区路口改为619
if (statusInf.hdMapVer != null && statusInf.hdMapVer.isNotEmpty()) {
//对地图版本进行截取
val city = statusInf.hdMapVer.substringAfter(".sqlite|").substringBefore("|")
val version = statusInf.hdMapVer.substringAfter("$city|").substringBefore("|")
AppConfigInfo.adHdMapVersion = "${city}_${version}"
updateAdHdMapVersion()
}
}
}

View File

@@ -1,11 +1,9 @@
package com.mogo.eagle.core.function.hmi.ui
import android.content.Context
import android.telecom.Call
import android.text.TextUtils
import android.view.Gravity
import android.view.ViewGroup
import android.view.WindowManager
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.lifecycle.lifecycleScope
import com.alibaba.android.arouter.facade.annotation.Route
@@ -32,7 +30,6 @@ 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.ui.camera.RoadVideoDialog
import com.mogo.eagle.core.function.hmi.ui.greenwave.GreenWaveView
import com.mogo.eagle.core.function.hmi.ui.lookaround.M1LookAroundView
import com.mogo.eagle.core.function.hmi.ui.notice.DispatchDialogManager
import com.mogo.eagle.core.function.hmi.ui.notice.NoticeCheckDialog
@@ -49,7 +46,6 @@ import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog
import com.mogo.eagle.core.function.hmi.ui.widget.StatusBarView
import com.mogo.eagle.core.function.hmi.xiaozhi.XiaoZhiStateManager
import com.mogo.eagle.core.utilcode.floating.MoGoPopWindow
import com.mogo.eagle.core.utilcode.kotlin.lifeCycleScope
import com.mogo.eagle.core.utilcode.kotlin.safeCancel
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger

View File

@@ -1,30 +0,0 @@
package com.mogo.eagle.core.function.hmi.ui.switch
import android.content.Context
import android.util.AttributeSet
import android.view.View
import com.mogo.eagle.core.data.config.FunctionBuildConfig
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
class DemoModeHiddenSwitch(context: Context, attrs: AttributeSet?) : View(context, attrs) {
init {
isClickable = true
setOnClickListener {
//只在司机端设置美化模式开关功能
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
//单次查询,是否有行程信息(订单进行中时点击不生效),autopilotControlParameters为null代表不处于自动驾驶状态下
if (CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().autopilotControlParameters == null) {
FunctionBuildConfig.isDemoMode = !FunctionBuildConfig.isDemoMode
CallerAutoPilotControlManager.setDemoMode(FunctionBuildConfig.isDemoMode)
if (!FunctionBuildConfig.isDemoMode) {
//关闭美化模式时,通知工控机
CallerAutoPilotControlManager.setIPCDemoMode(FunctionBuildConfig.isDemoMode)
}
}
}
}
}
}

View File

@@ -1,8 +1,7 @@
package com.mogo.eagle.core.function.hmi.ui.map
package com.mogo.eagle.core.function.hmi.ui.tools
import android.annotation.SuppressLint
import android.content.Context
import android.os.Looper
import android.view.View
import android.widget.ImageView
import android.widget.ProgressBar
@@ -13,12 +12,8 @@ import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.function.call.hmi.CallerHmiListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog
import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog.Companion.hmiAction
import com.mogo.eagle.core.function.hmi.ui.widget.SystemVersionView
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.map.MogoData.Companion.mogoMapData
import me.jessyan.autosize.utils.AutoSizeUtils

View File

@@ -1,4 +1,4 @@
package com.mogo.eagle.core.function.hmi.ui.greenwave
package com.mogo.eagle.core.function.hmi.ui.widget
import android.content.Context
import android.util.AttributeSet

View File

@@ -2,7 +2,6 @@ package com.mogo.eagle.core.function.hmi.ui.widget
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
@@ -19,15 +18,13 @@ import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.map.OfflineMapDialog
import com.mogo.eagle.core.function.hmi.ui.tools.OfflineMapDialog
import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog.Companion.hmiAction
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.*
import com.mogo.map.MogoData.Companion.mogoMapData
import kotlinx.android.synthetic.main.view_system_version.view.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import system_master.SsmInfo
import system_master.SystemStatusInfo
@@ -56,6 +53,7 @@ class SystemVersionView @JvmOverloads constructor(
private var previousProgress: Int = -1 //前一秒的下载进度,用于计算下载剩余时间
private var currentProgress: Int = -1 //当前已下载包体大小
@Volatile
private var isHDCached = false
init {
@@ -70,7 +68,7 @@ class SystemVersionView @JvmOverloads constructor(
//鹰眼版本视图点击事件
ivPadVersion.setOnClickListener {
hmiAction("$M_HMI$$TAG", "pad version view clicked")
hmiAction("$M_HMI$TAG", "pad version view clicked")
val provider = CallerDevaToolsManager.upgradeProvider()
if (provider?.isDownloading() == true) {
ToastUtils.showShort("正在下载最新版本,请稍候再试...")

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 381 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1019 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@drawable/icon_status_accelerator_error" />
<item android:drawable="@drawable/icon_status_accelerator_normal" />
</selector>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@drawable/icon_status_brake_error" />
<item android:drawable="@drawable/icon_status_brake_normal" />
</selector>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@drawable/icon_status_double_flash_error" />
<item android:drawable="@drawable/icon_status_double_flash_normal" />
</selector>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true" android:drawable="@drawable/icon_status_gear_bg_error" />
<item android:state_enabled="false" android:drawable="@drawable/icon_status_gear_bg_normal" />
</selector>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@drawable/icon_status_steer_error" />
<item android:drawable="@drawable/icon_status_steer_normal" />
</selector>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/color_B3_000000" />
<corners android:radius="@dimen/dp_10" />
</shape>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/icon_tab_car_info" android:state_checked="false" />
<item android:drawable="@drawable/icon_tab_car_info_click" android:state_checked="true"/>
</selector>

View File

@@ -0,0 +1,34 @@
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bone_bg"
android:layout_gravity="center">
<com.mogo.eagle.core.function.hmi.bone.BoneTopStatusLayout
android:id="@+id/boneTopStatusLayout"
android:layout_width="match_parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginStart="@dimen/dp_19"
android:layout_height="wrap_content"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clBoneBiz"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_385"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.mogo.eagle.core.function.hmi.bone.BoneTabLayout
android:id="@+id/clBoneTab"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/dp_385"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,82 @@
<?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:layout_width="@dimen/dp_960"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clBoneTabChild"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.mogo.eagle.core.function.hmi.bone.tab.CarInfoTabView
android:id="@+id/carInfoTabView"
android:layout_width="@dimen/dp_960"
android:layout_height="@dimen/dp_1137"
android:layout_marginStart="@dimen/dp_40"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dp_224"
android:layout_marginStart="@dimen/dp_20"
android:layout_marginBottom="@dimen/dp_m_2"
android:background="@drawable/bg_tab_switch"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent">
<com.mogo.eagle.core.function.hmi.bone.TabSwitchView
android:id="@+id/tabSwitchCarInfo"
android:layout_width="@dimen/dp_220"
android:layout_height="@dimen/dp_140"
android:layout_marginStart="@dimen/dp_40"
android:layout_marginTop="@dimen/dp_20"
app:clickBgRes="@drawable/icon_tab_click_bg"
app:clickRes="@drawable/icon_tab_car_info_click"
app:defaultRes="@drawable/icon_tab_car_info"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.mogo.eagle.core.function.hmi.bone.TabSwitchView
android:id="@+id/tabSwitchMsgBox"
android:layout_width="@dimen/dp_220"
android:layout_height="@dimen/dp_140"
android:layout_marginTop="@dimen/dp_20"
app:clickBgRes="@drawable/icon_tab_click_bg"
app:clickRes="@drawable/icon_tab_msg_box_click"
app:defaultRes="@drawable/icon_tab_msg_box"
app:layout_constraintLeft_toRightOf="@+id/tabSwitchCarInfo"
app:layout_constraintTop_toTopOf="parent" />
<com.mogo.eagle.core.function.hmi.bone.TabSwitchView
android:id="@+id/tabSwitchReport"
android:layout_width="@dimen/dp_220"
android:layout_height="@dimen/dp_140"
android:layout_marginTop="@dimen/dp_20"
app:clickBgRes="@drawable/icon_tab_click_bg"
app:clickRes="@drawable/icon_tab_report_click"
app:defaultRes="@drawable/icon_tab_report"
app:layout_constraintLeft_toRightOf="@+id/tabSwitchMsgBox"
app:layout_constraintTop_toTopOf="parent" />
<com.mogo.eagle.core.function.hmi.bone.TabSwitchView
android:id="@+id/tabSwitchMore"
android:layout_width="@dimen/dp_220"
android:layout_height="@dimen/dp_140"
android:layout_marginTop="@dimen/dp_20"
app:clickBgRes="@drawable/icon_tab_click_bg"
app:clickRes="@drawable/icon_tab_more_click"
app:defaultRes="@drawable/icon_tab_more"
app:layout_constraintLeft_toRightOf="@+id/tabSwitchReport"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,16 @@
<?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_357"
android:background="@drawable/bg_top_status_layout_normal">
<com.mogo.eagle.core.function.hmi.bone.status.StartAutoPilotStatusView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dp_59"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,230 @@
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_tab_item">
<View
android:id="@+id/topViewPos"
android:layout_width="@dimen/dp_856"
android:layout_height="@dimen/dp_100"
android:layout_marginTop="@dimen/dp_21"
android:layout_marginEnd="@dimen/dp_40"
android:background="@drawable/bg_tab_view_top"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="@dimen/dp_160"
android:layout_height="@dimen/dp_56"
android:layout_marginStart="@dimen/dp_104"
android:layout_marginTop="@dimen/dp_55"
android:text="@string/tab_car_info"
android:textColor="@color/color_CC_FFFFFF"
android:textSize="@dimen/dp_40"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="@dimen/dp_700"
android:layout_marginTop="@dimen/dp_75"
app:layout_constraintTop_toBottomOf="@+id/topViewPos">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_40"
android:layout_marginEnd="@dimen/dp_40">
<ImageView
android:id="@+id/ivCarType"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_280"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tvCarLoginPos"
android:layout_width="@dimen/dp_152"
android:layout_height="@dimen/dp_53"
android:layout_marginStart="@dimen/dp_60"
android:layout_marginTop="@dimen/dp_22"
android:text="@string/tab_car_login_info"
android:textColor="@color/white"
android:textSize="@dimen/dp_38"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ivCarType" />
<TextView
android:id="@+id/tvCarLoginInfo"
android:layout_width="@dimen/dp_185"
android:layout_height="@dimen/dp_45"
android:layout_marginStart="@dimen/dp_16"
android:gravity="center"
android:textColor="@color/white"
android:textSize="@dimen/dp_32"
app:layout_constraintBottom_toBottomOf="@+id/tvCarLoginPos"
app:layout_constraintLeft_toRightOf="@+id/tvCarLoginPos"
app:layout_constraintTop_toTopOf="@+id/tvCarLoginPos" />
<TextView
android:id="@+id/tvCarExit"
android:layout_width="@dimen/dp_64"
android:layout_height="@dimen/dp_45"
android:layout_marginEnd="@dimen/dp_60"
android:gravity="center"
android:text="@string/tab_car_exit"
android:textColor="@color/color_FF1943"
android:textSize="@dimen/dp_32"
app:layout_constraintBottom_toBottomOf="@+id/tvCarLoginInfo"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@+id/tvCarLoginInfo" />
<TextView
android:id="@+id/tvCarNoPos"
android:layout_width="@dimen/dp_152"
android:layout_height="@dimen/dp_53"
android:layout_marginStart="@dimen/dp_60"
android:layout_marginTop="@dimen/dp_49"
android:text="@string/tab_car_no"
android:textColor="@color/white"
android:textSize="@dimen/dp_38"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvCarLoginPos" />
<TextView
android:id="@+id/tvCarNo"
android:layout_width="@dimen/dp_185"
android:layout_height="@dimen/dp_72"
android:layout_marginStart="@dimen/dp_16"
android:background="@drawable/bg_tab_car_no"
android:textColor="@color/white"
android:textSize="@dimen/dp_32"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@+id/tvCarNoPos"
app:layout_constraintLeft_toRightOf="@+id/tvCarNoPos"
app:layout_constraintTop_toTopOf="@+id/tvCarNoPos" />
<TextView
android:id="@+id/tvVersionPos"
android:layout_width="@dimen/dp_152"
android:layout_height="@dimen/dp_53"
android:layout_marginStart="@dimen/dp_60"
android:layout_marginTop="@dimen/dp_68"
android:text="@string/tab_version_info"
android:textColor="@color/white"
android:textSize="@dimen/dp_38"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvCarNoPos" />
<TextView
android:id="@+id/tvPadVersion"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_45"
android:layout_marginStart="@dimen/dp_16"
android:gravity="center"
android:text="@string/tab_version_pad_info"
android:textColor="@color/white"
android:textSize="@dimen/dp_32"
app:layout_constraintBottom_toBottomOf="@+id/tvVersionPos"
app:layout_constraintLeft_toRightOf="@+id/tvVersionPos"
app:layout_constraintTop_toTopOf="@+id/tvVersionPos" />
<TextView
android:id="@+id/tvPADUpdate"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_45"
android:text="@string/tab_version_update"
android:textColor="@color/color_2EACFF"
android:textSize="@dimen/dp_32"
app:layout_constraintBottom_toBottomOf="@+id/tvPadVersion"
app:layout_constraintRight_toRightOf="@+id/tvCarExit"
app:layout_constraintTop_toTopOf="@+id/tvPadVersion" />
<TextView
android:id="@+id/tvADVersion"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_45"
android:layout_marginTop="@dimen/dp_20"
android:gravity="center"
android:text="@string/tab_version_ad_info"
android:textColor="@color/white"
android:textSize="@dimen/dp_32"
app:layout_constraintLeft_toLeftOf="@+id/tvPadVersion"
app:layout_constraintTop_toBottomOf="@+id/tvPadVersion" />
<TextView
android:id="@+id/tvADUpdate"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_45"
android:text="@string/tab_version_update"
android:textColor="@color/color_2EACFF"
android:textSize="@dimen/dp_32"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@+id/tvADVersion"
app:layout_constraintRight_toRightOf="@+id/tvCarExit"
app:layout_constraintTop_toTopOf="@+id/tvADVersion" />
<TextView
android:id="@+id/tvHDMapVersion"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_45"
android:layout_marginTop="@dimen/dp_20"
android:gravity="center"
android:text="@string/tab_version_hdmap_info"
android:textColor="@color/white"
android:textSize="@dimen/dp_32"
app:layout_constraintLeft_toLeftOf="@+id/tvADVersion"
app:layout_constraintTop_toBottomOf="@+id/tvADVersion" />
<TextView
android:id="@+id/tvHDMapUpdate"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_45"
android:text="@string/tab_version_update"
android:textColor="@color/color_2EACFF"
android:textSize="@dimen/dp_32"
app:layout_constraintBottom_toBottomOf="@+id/tvHDMapVersion"
app:layout_constraintRight_toRightOf="@+id/tvCarExit"
app:layout_constraintTop_toTopOf="@+id/tvHDMapVersion" />
<TextView
android:id="@+id/tvADMapVersion"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_45"
android:layout_marginTop="@dimen/dp_20"
android:gravity="center"
android:text="@string/tab_version_admap_info"
android:textColor="@color/white"
android:textSize="@dimen/dp_32"
app:layout_constraintLeft_toLeftOf="@+id/tvHDMapVersion"
app:layout_constraintTop_toBottomOf="@+id/tvHDMapVersion" />
<TextView
android:id="@+id/tvSnPos"
android:layout_width="@dimen/dp_152"
android:layout_height="@dimen/dp_53"
android:layout_marginStart="@dimen/dp_60"
android:layout_marginTop="@dimen/dp_232"
android:text="@string/tab_sn"
android:textColor="@color/white"
android:textSize="@dimen/dp_38"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvVersionPos" />
<TextView
android:id="@+id/tvSnInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_16"
android:textColor="@color/white"
android:textSize="@dimen/dp_32"
app:layout_constraintBottom_toBottomOf="@+id/tvSnPos"
app:layout_constraintLeft_toRightOf="@+id/tvSnPos"
app:layout_constraintTop_toTopOf="@+id/tvSnPos" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,67 @@
<?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:layout_width="@dimen/dp_865"
android:layout_height="@dimen/dp_102">
<ImageView
android:id="@+id/fSMStatusLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@drawable/icon_fsm_status_bg_normal"
tools:visibility="visible"/>
<LinearLayout
android:id="@+id/withoutFSMStatusLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingStart="@dimen/dp_34"
android:gravity="center_vertical"
android:visibility="gone"
tools:visibility="gone"
tools:background="@drawable/icon_no_fsm_status_bg_error">
<TextView
android:id="@+id/tv_gear"
android:layout_width="@dimen/dp_55"
android:layout_height="@dimen/dp_55"
android:gravity="center"
android:maxLines="1"
android:text="P"
android:textColor="#FFFFFF"
android:textSize="@dimen/dp_36"
android:layout_marginEnd="@dimen/dp_22"
android:background="@drawable/bg_autopilot_status_gear"
tools:text="P" />
<ImageView
android:id="@+id/iv_steer"
android:layout_width="@dimen/dp_55"
android:layout_height="@dimen/dp_55"
android:layout_marginEnd="@dimen/dp_22"
android:src="@drawable/bg_autopilot_status_steer" />
<ImageView
android:id="@+id/iv_accelerator"
android:layout_width="@dimen/dp_55"
android:layout_height="@dimen/dp_55"
android:layout_marginEnd="@dimen/dp_22"
android:src="@drawable/bg_autopilot_status_accelerator" />
<ImageView
android:id="@+id/iv_brake"
android:layout_width="@dimen/dp_55"
android:layout_height="@dimen/dp_55"
android:layout_marginEnd="@dimen/dp_22"
android:src="@drawable/bg_autopilot_status_brake" />
<ImageView
android:id="@+id/iv_double_flash"
android:layout_width="@dimen/dp_55"
android:layout_height="@dimen/dp_55"
android:src="@drawable/bg_autopilot_status_double_flash" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,48 @@
<?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:layout_width="@dimen/dp_220"
android:layout_height="@dimen/dp_140">
<ImageView
android:id="@+id/ivTabDefault"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/ivTabClick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:scaleType="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/ivTabClickBg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
tools:ignore="ContentDescription" />
<View
android:id="@+id/vTabNotice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -152,4 +152,10 @@
</attr>
</declare-styleable>
<declare-styleable name="TabSwitch" >
<attr name="defaultRes" format="reference"/>
<attr name="clickRes" format="reference"/>
<attr name="clickBgRes" format="reference"/>
</declare-styleable>
</resources>

View File

@@ -16,7 +16,9 @@
<color name="colorPrimaryDark">#3700B3</color>
<color name="colorAccent">#03DAC5</color>
<color name="color_000000">#000000</color>
<color name="color_B3_000000">#B3000000</color>
<color name="color_8F0005">#8F0005</color>
<color name="color_2EACFF">#2EACFF</color>
<color name="color_FF0006">#FF0006</color>
<color name="color_0099dd">#0099dd</color>
<color name="color_FFFFFF">#FFFFFF</color>
@@ -27,6 +29,7 @@
<color name="color_252B3F">#252B3F</color>
<color name="color_131415">#131415</color>
<color name="color_B2BED9">#B2BED9</color>
<color name="color_FF1943">#FF1943</color>
<color name="color_27FFFFFF">#27FFFFFF</color>
<color name="color_1E111111">#1E111111</color>
<color name="color_FF213757">#FF213757</color>
@@ -47,6 +50,7 @@
<color name="foreground_info">#FF333333</color>
<color name="foreground_warn">#FFCCCCCC</color>
<color name="color_80FFFFFF">#80FFFFFF</color>
<color name="color_CC_FFFFFF">#CCFFFFFF</color>

View File

@@ -2,6 +2,18 @@
<string name="app_name">mogo-core-function-hmi</string>
<string name="motice_push_check">查看</string>
<string name="tab_car_info">我的车辆</string>
<string name="tab_car_login_info">登陆信息</string>
<string name="tab_car_exit">退出</string>
<string name="tab_car_no">车辆绑定</string>
<string name="tab_version_info">版本信息</string>
<string name="tab_sn">设备SN</string>
<string name="tab_version_pad_info">PAD</string>
<string name="tab_version_ad_info">AD</string>
<string name="tab_version_hdmap_info">HDMAP</string>
<string name="tab_version_admap_info">ADMAP</string>
<string name="tab_version_update">检查更新</string>
<string name="log_min">最小化</string>
<string name="log_info">日志</string>
<string name="log_info_edt_hint">输入想要过滤的关键字</string>

View File

@@ -148,17 +148,20 @@ class HttpDnsStartUp : AndroidStartup<Boolean>(), IMoGoCloudListener {
} else {
clientConfig.serviceAppId = "com.mogo.launcher"
}
// 设置AI云平台分配给三方应用的签名密钥需要从AI云平台申请
// 设置AI云平台分配给三方应用的签名密钥需要从AI云平台申请ert
// 设置车机设备的唯一标识(这些表识必须是通过后台录入的设备)
// TODO 现在这块逻辑因为网约车业务那后台的限制,还没有更换,条件成熟后替换为 DeviceIdUtils.getWidevineIDWithMd5(context)
// 这里影响当前Activity的身份信息多进程先保持与原来一样主进程为司机端:passenger 进程为乘客端
if (ProcessUtils.getCurrentProcessName().contains(":passenger")) {
if (ProcessUtils.getCurrentProcessName().contains("passenger")) {
clientConfig.thirdPartyDeviceId = DeviceUtils.getDeviceSN() + "_passenger"
CallerLogger.i("$M_MAIN$TAG", "emArrow passenger sn : ${DeviceUtils.getDeviceSN()} + _passenger")
clientConfig.secretKey = "DLtjkFhV1lEZqLRnUs6OCFS0luP8S0mG"
} else {
clientConfig.thirdPartyDeviceId = DeviceUtils.getDeviceSN()
//设置长链接的secretKey 通过SHA1和包名找中台服务生成后续包名分渠道,需要做对应操作
CallerLogger.i("$M_MAIN$TAG", "emArrow sn : ${DeviceUtils.getDeviceSN()}")
clientConfig.secretKey = "YMj2VFDFxJ3Q4gNoZceJ"
}
//设置长链接的secretKey 通过SHA1和包名找中台服务生成后续包名分渠道,需要做对应操作
clientConfig.secretKey = "YMj2VFDFxJ3Q4gNoZceJ"
// clientConfig.secretKey = "n48AlVufihvMDWgzwHX42yzSgiWaad6v"
clientConfig.iHttpCurrentLocation = object : ICurrentLocation {