Merge branch 'dev_robotaxi-d_240401_6.4.0' into dev_robotaxi-d_240401_6.4.0_yyk

# Conflicts:
#	app/script/vehicleFlavors/C1.gradle
This commit is contained in:
yangyakun
2024-04-15 14:54:13 +08:00
82 changed files with 1803 additions and 968 deletions

View File

@@ -8,13 +8,17 @@ import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.deva.report.ReportEntity
import com.mogo.eagle.core.data.enums.DataSourceType
import com.mogo.eagle.core.data.msgbox.FMInfoMsg
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxCountDownBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.MsgCategory
import com.mogo.eagle.core.data.msgbox.MsgFmData
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener
import com.mogo.eagle.core.function.api.order.IOrderListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager
@@ -97,23 +101,53 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor(
}
} else if(category == MsgCategory.SYS_INFO){
CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true)
if(msgBoxBean.type == MsgBoxType.REPORT){
val reportMsg = msgBoxBean.bean as ReportEntity
//P8-P1均只收在消息盒子里P0消息盒子弹出其中P0弹出时需要判断驾驶状态非自动驾驶、非平行驾驶状态不弹出其余状态弹出
var isShowReport = false
for(action in reportMsg.actionsList){
if("ACTION_MANUAL_HANDLE_IMMEDIATELY" == action){
if(CallerAutoPilotStatusListenerManager.getState() == 2
|| CallerAutoPilotStatusListenerManager.getState() == 7){
isShowReport = true
}
}
}
if(isShowReport){
//展示消息
showData(msgBoxBean)
}
}
} else if(category == MsgCategory.FM_INFO){
CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true)
if(FunctionBuildConfig.isTakeoverRemind){
//属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音
val fmInfoMsg = msgBoxBean.bean as FMInfoMsg
if(fmInfoMsg.policyCode == "FM_DP_PNC_CHOOSE_STOP" //择机靠边停车
|| fmInfoMsg.policyCode == "FM_DP_COMFORTABLE_STOP" //立刻舒适停车
|| fmInfoMsg.policyCode == "FM_DP_EMERGENCY_STOP" //就地紧急停车
){
//语音提示
try {
SoundPoolUtils.getSoundPool().playSoundWithRedId(context,R.raw.weak_net_tips)
}catch (e: Exception){
e.printStackTrace()
var curFaultLevel = 5 //默认级别遍历数组找出级别最高的level数越小级别越高
fmInfoMsg.fmInfoList?.forEach { faultInfo ->
if(faultInfo.faultActionCount>0){
faultInfo.faultActionList.forEach {actionCode ->
//获取建议操作级别,得到建议操作级别最高的操作
if(MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel){
curFaultLevel = MsgFmData.FaultAction.getFaultLevel(actionCode)
}
}
}
}
//P0级消息弹出时需要判断驾驶状态非自动驾驶、非平行驾驶状态不弹出其余状态弹出
if(curFaultLevel == 0){
//自动驾驶状态 0是不可用 1是ready 2是自动驾驶中 7:平行驾驶中
if(CallerAutoPilotStatusListenerManager.getState() == 2
|| CallerAutoPilotStatusListenerManager.getState() == 7){
//语音提示
try {
SoundPoolUtils.getSoundPool().playSoundWithRedId(context,R.raw.weak_net_tips)
}catch (e: Exception){
e.printStackTrace()
}
//展示消息
showData(msgBoxBean)
}
//展示消息
showData(msgBoxBean)
}
}
} else{

View File

@@ -21,6 +21,7 @@ import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.function.hmi.R
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.TimeUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat
import com.mogo.eagle.core.widget.RoundCanClickConstraintLayout
@@ -242,7 +243,6 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A
is BubbleFmHolder ->{
data?.let {
val fmMsg = it[position].msgBoxBean.bean as FMInfoMsg
holder.tvBubbleFmFault.text = MsgFmData.getFmPolicyName(fmMsg.policyCode)
if(fmMsg.policyTime == null){
holder.tvBubbleFmTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat())
}else{
@@ -250,26 +250,43 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A
}
if(fmMsg.fmInfoList?.size == 0){
holder.tvBubbleFmFaultAction.text = "建议操作:暂无"
holder.tvBubbleFmFault.text = MsgFmData.getFmPolicyName(fmMsg.policyCode)
}else{
var curFaultLevel = 0 //默认级别遍历数组找出级别最高的level数越小,级别越高)
var curFaultLevel = 5 //默认级别遍历数组找出级别最高的level数越小级别越高
fmMsg.fmInfoList?.forEach { faultInfo ->
if(faultInfo.faultActionCount>0){
faultInfo.faultActionList.forEach {actionCode ->
//获取建议操作级别,得到建议操作级别最高的操作
if(MsgFmData.FaultAction.getFaultLevel(actionCode) > curFaultLevel){
if(MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel){
curFaultLevel = MsgFmData.FaultAction.getFaultLevel(actionCode)
}
}
}
}
val faultAction = MsgFmData.FaultAction.getFaultAction(curFaultLevel)
holder.tvBubbleFmFault.text = faultAction
//当出现多个建议操作时,按照整车下电重启、请求人工驾驶接管、请求平行驾驶接管、系统重启、联系硬件工程师、
// 联系运维工程师、联系软件工程师优先级递减的顺序,只展示最高优先级的内容
if(curFaultLevel == 0){
if(curFaultLevel == 5){
holder.tvBubbleFmFaultAction.text = "建议操作:暂无"
}else{
holder.tvBubbleFmFaultAction.text = "${faultAction}(${MsgFmData.FaultAction.getFaultActionCode(curFaultLevel)})"
}
//不同级别的Icon显示
when(curFaultLevel){
0->{
//重度预警样式
holder.ivBubbleFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_normal))
}
1,2,3->{
//中度预警样式
holder.ivBubbleFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_normal))
}
4,5->{
//轻度预警样式
holder.ivBubbleFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_normal))
}
}
}
}
}
@@ -409,6 +426,7 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A
var tvBubbleFmFault: TextView = itemView.findViewById(R.id.tvBubbleFmFault)
var tvBubbleFmFaultAction: TextView = itemView.findViewById(R.id.tvBubbleFmFaultAction)
var tvBubbleFmTime: TextView = itemView.findViewById(R.id.tvBubbleFmTime)
var ivBubbleFmImage: ImageView = itemView.findViewById(R.id.ivBubbleFmImage)
}
//SSM连接消息

View File

@@ -173,39 +173,21 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
"时间:${fmInfoMsg.policyTime?.let { it1 -> TimeUtils.millis2String(it1) }}"
holder.tvFmTime.text =
fmInfoMsg.policyTime?.let { it1 -> TimeUtils.millis2String(it1,getHourMinFormat()) }
//不同级别的Icon显示
if(fmInfoMsg.policyCode == "FM_DP_ONLY_WARNING"){
//警示
holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_normal))
holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_open))
}else if(fmInfoMsg.policyCode == "FM_DP_SPEED_LIMIT1"
|| fmInfoMsg.policyCode == "FM_DP_SPEED_LIMIT2"
|| fmInfoMsg.policyCode == "FM_DP_SPEED_LIMIT3"){
//降速行驶
holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_normal))
holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_open))
}else if(fmInfoMsg.policyCode == "FM_DP_PNC_CHOOSE_STOP"
|| fmInfoMsg.policyCode == "FM_DP_COMFORTABLE_STOP"
|| fmInfoMsg.policyCode == "FM_DP_EMERGENCY_STOP"){
//安全停车
holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_normal))
holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_open))
}
//Title
holder.tvFmTitleNormal.text = MsgFmData.getFmPolicyName(fmInfoMsg.policyCode)
holder.tvFmTitleOpen.text = MsgFmData.getFmPolicyName(fmInfoMsg.policyCode)
//建议操作
if(fmInfoMsg.fmInfoList.isNullOrEmpty()){
//建议操作暂无
holder.tvFmActionOpen.text = "建议操作:暂无"
holder.tvFmActionNormal.text = "建议操作:暂无"
//Title
holder.tvFmTitleNormal.text = MsgFmData.getFmPolicyName(fmInfoMsg.policyCode)
holder.tvFmTitleOpen.text = MsgFmData.getFmPolicyName(fmInfoMsg.policyCode)
}else{
val receiveFaultLevel = ArrayList<Int>()
fmInfoMsg.fmInfoList!!.forEach { info ->
if(info.faultActionCount != 0){
info.faultActionList.forEach { action ->
//如果不包含此故障Level则进行添加
if(!receiveFaultLevel.contains(MsgFmData.FaultAction.getFaultLevel(action)) && MsgFmData.FaultAction.getFaultLevel(action)!=0){
if(!receiveFaultLevel.contains(MsgFmData.FaultAction.getFaultLevel(action))){
receiveFaultLevel.add(MsgFmData.FaultAction.getFaultLevel(action))
}
}
@@ -216,7 +198,28 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
val faultActionStr: StringBuilder = StringBuilder()
faultActionStr.append("建议操作:")
receiveFaultLevel.sort()
receiveFaultLevel.reverse()
// receiveFaultLevel.reverse()
//Title
holder.tvFmTitleNormal.text = MsgFmData.FaultAction.getFaultAction(receiveFaultLevel[0])
holder.tvFmTitleOpen.text = MsgFmData.FaultAction.getFaultAction(receiveFaultLevel[0])
//不同级别的Icon显示
when(receiveFaultLevel[0]){
0->{
//重度预警样式
holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_normal))
holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_open))
}
1,2,3->{
//中度预警样式
holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_normal))
holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_open))
}
4,5->{
//轻度预警样式
holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_normal))
holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_open))
}
}
receiveFaultLevel.forEach {level->
if(MsgFmData.FaultAction.getFaultAction(level).isNotBlank()){
faultActionStr.append(MsgFmData.FaultAction.getFaultAction(level))
@@ -227,11 +230,11 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
faultActionStr.append(")")
}
if(MsgFmData.FaultAction.getFaultAction(level).isNotBlank() || MsgFmData.FaultAction.getFaultActionCode(level).isNotBlank()){
faultActionStr.append("/")
faultActionStr.append(";")
}
}
if(faultActionStr.length > 5){
if(faultActionStr.endsWith("/")){
if(faultActionStr.endsWith(";")){
faultActionStr.deleteCharAt(faultActionStr.lastIndex)
}
holder.tvFmActionOpen.text = faultActionStr.toString()
@@ -243,6 +246,9 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
}else{
holder.tvFmActionOpen.text = "建议操作:暂无"
holder.tvFmActionNormal.text = "建议操作:暂无"
//轻度预警样式
holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_normal))
holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_open))
}
}
//故障策略

View File

@@ -12,7 +12,6 @@ import android.os.Build
import android.os.Process
import android.text.Html
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@@ -89,6 +88,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.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
@@ -204,7 +204,8 @@ internal class DebugSettingView @JvmOverloads constructor(
// 高精地图是否已缓存
private var isHDCached = false
private var isClickCheckedCbSsl = false//是否已经点击且选中证书认证按钮
//是否已经点击且选中证书认证按钮
private var isCertCheck = false
private var isFirstDownLoadCertHint = false
init {
@@ -1293,14 +1294,13 @@ internal class DebugSettingView @JvmOverloads constructor(
}
}
//是否启用证书认证
cbSsl.isChecked =
SharedPrefsMgr.getInstance().getBoolean(
MoGoConfig.AUTOPILOT_CERTIFICATION,
MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE
)
val check = SharedPrefsMgr.getInstance().getBoolean(
"${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}",
MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE
)
isCertCheck = check
cbSsl.isChecked = check
cbSsl.setOnCheckedChangeListener { _, isChecked ->
isClickCheckedCbSsl = isChecked
// 下载证书
if (isChecked) {
if (CallerCloudCertManager.getRootCrtF().isNullOrEmpty()) {
if (!isFirstDownLoadCertHint) {
@@ -1308,25 +1308,31 @@ internal class DebugSettingView @JvmOverloads constructor(
ToastUtils.showShort("证书文件不存在,正在下载")
}
cbSsl.isChecked = false
//下载证书
CallerCloudCertManager.certFileDownLoad { errorMsg ->
ThreadUtils.runOnUiThread {
isCertCheck = false
ToastUtils.showShort(errorMsg)
}
}
}else{
isCertCheck = true
}
}else{
isCertCheck = false
}
SharedPrefsMgr.getInstance()
.putBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION, cbSsl.isChecked)
.putBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", cbSsl.isChecked)
}
}
override fun authCrtFile(device: String, root: String) {
super.authCrtFile(device, root)
ThreadUtils.runOnUiThread {
if (isClickCheckedCbSsl) {
if (isCertCheck) {
cbSsl.isChecked = true
SharedPrefsMgr.getInstance()
.putBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION, true)
.putBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", true)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
tvCertFile.text = Html.fromHtml(
@@ -1576,26 +1582,48 @@ internal class DebugSettingView @JvmOverloads constructor(
//上传全量日志
exportAllLogs?.onClick { v ->
v.visibility = View.INVISIBLE
logLoadingView?.visibility = View.VISIBLE
v.scope.launch(Dispatchers.IO) {
var isUploadSuccess = false
try {
CallerDevaToolsManager.logcat()?.upload()
isUploadSuccess = true
} catch (t: Throwable) {
t.printStackTrace()
}
withContext(Dispatchers.Main) {
if (isUploadSuccess) {
ToastUtils.showShort("上传成功")
} else {
ToastUtils.showShort("上传失败")
ListPopupWindow(v.context).also { p ->
val items = LogcatUploadDuration.values()
p.setAdapter(LogcatUploadAdapter(v.context, items))
p.anchorView = v
p.isModal = true
p.setBackgroundDrawable(ColorDrawable(Color.WHITE))
p.setOnItemClickListener { _, _, position, _ ->
val item = items[position]
v.visibility = View.INVISIBLE
logLoadingView?.visibility = View.VISIBLE
p.dismiss()
v.scope.launch(Dispatchers.IO) {
val endTime = System.currentTimeMillis()
val startTime = when(item) {
LogcatUploadDuration.IN_15M -> endTime - TimeUnit.MINUTES.toMillis(15)
LogcatUploadDuration.IN_45M -> endTime - TimeUnit.MINUTES.toMillis(45)
LogcatUploadDuration.IN_1H -> endTime - TimeUnit.HOURS.toMillis(1)
LogcatUploadDuration.IN_2H -> endTime - TimeUnit.HOURS.toMillis(2)
LogcatUploadDuration.IN_3H -> endTime - TimeUnit.HOURS.toMillis(3)
LogcatUploadDuration.IN_6H -> endTime - TimeUnit.HOURS.toMillis(6)
LogcatUploadDuration.IN_1D -> endTime - TimeUnit.DAYS.toMillis(1)
LogcatUploadDuration.ALL -> 0
}
var isUploadSuccess = false
try {
CallerDevaToolsManager.logcat()?.upload(startTime, endTime)
isUploadSuccess = true
} catch (t: Throwable) {
t.printStackTrace()
}
withContext(Dispatchers.Main) {
if (isUploadSuccess) {
ToastUtils.showShort("上传成功")
} else {
ToastUtils.showShort("上传失败")
}
logLoadingView?.visibility = View.INVISIBLE
exportAllLogs?.visibility = View.VISIBLE
}
}
logLoadingView?.visibility = View.INVISIBLE
exportAllLogs?.visibility = View.VISIBLE
}
}
}.show()
}
if (JunkConfig.isSupportJunkDetect) {
@@ -1731,6 +1759,54 @@ internal class DebugSettingView @JvmOverloads constructor(
}
}
private enum class LogcatUploadDuration(val text: String) {
IN_15M("15分钟内"),
IN_45M("45分钟内"),
IN_1H("1小时内"),
IN_2H("2小时内"),
IN_3H("3小时内"),
IN_6H("6小时内"),
IN_1D("一天内"),
ALL("上传所有")
}
private class LogcatUploadAdapter(private val ctx: Context, private val items: Array<LogcatUploadDuration>): BaseAdapter() {
override fun getCount(): Int {
return items.size
}
override fun getItem(position: Int): Any {
return items[position]
}
override fun getItemId(position: Int): Long {
return items[position].ordinal.toLong()
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
var result = convertView
val duration = items[position]
if (result == null) {
val temp = View.inflate(ctx, android.R.layout.simple_list_item_1, null)
temp.tag = Holder(temp.findViewById(android.R.id.text1))
result = temp
}
val holder = result?.tag as? Holder
if (holder != null) {
holder.text?.setTextColor(Color.BLACK)
holder.text?.text = duration.text
} else {
val text = result?.findViewById<TextView>(android.R.id.text1)
text?.setTextColor(Color.BLACK)
text?.text = duration.text
result?.tag = Holder(text)
}
return result!!
}
private inner class Holder(val text: TextView? = null)
}
private enum class ApmVLogUploadDuration(val text: String) {
IN_15M("15分钟内"),
IN_45M("45分钟内"),
@@ -2504,6 +2580,6 @@ internal class DebugSettingView @JvmOverloads constructor(
paramIndexes = [0]
)
private fun invokeCronetResult(json: String) {
Log.d("CronetNetwork", json)
CallerLogger.d(SceneConstant.M_HMI + "CronetNetwork", json)
}
}

View File

@@ -48,6 +48,9 @@ class StatusSummaryAdapter(private val ctx: Context, var data: ArrayList<StatusS
4 -> {
ivFuncView.setImageResource(R.drawable.controller)
}
5 -> {
ivFuncView.setImageResource(R.drawable.ssl_check)
}
}
if (entity.isException) {
tvStatusDesc.setTextColor(Color.parseColor("#FF4444"))

View File

@@ -2,19 +2,26 @@ package com.mogo.eagle.core.function.hmi.ui.setting
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
import android.widget.FrameLayout
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.mogo.commons.debug.DebugConfig
import com.mogo.commons.module.status.IMogoStatusChangedListener
import com.mogo.commons.module.status.MogoStatusManager
import com.mogo.commons.module.status.StatusDescriptor
import com.mogo.commons.storage.SharedPrefsMgr
import com.mogo.eagle.core.data.constants.MoGoConfig
import com.mogo.eagle.core.data.status.StatusSummaryEntity
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.cloud.IMoGoCloudListener
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener
import com.mogo.eagle.core.function.api.telematic.IConnectStatusListener
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.cloud.CallerCloudCertManager
import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager
import com.mogo.eagle.core.function.call.telematic.CallerTelematicStatusListenerManager
import com.mogo.eagle.core.function.hmi.R
@@ -26,7 +33,7 @@ import com.zhjt.mogo.adas.data.AdasConstants
/**
* 状态汇总View控件
*/
class StatusSummaryView@JvmOverloads constructor(
class StatusSummaryView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
@@ -35,8 +42,9 @@ class StatusSummaryView@JvmOverloads constructor(
attrs,
defStyleAttr
), IConnectStatusListener, IMogoStatusChangedListener,
IMoGoDevaToolsListener, IMoGoAutopilotStatusListener {
companion object{
IMoGoDevaToolsListener, IMoGoAutopilotStatusListener, IMoGoAutopilotCarConfigListener,
IMoGoCloudListener {
companion object {
private const val TAG = "SummaryStatusView"
}
@@ -50,6 +58,13 @@ 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()
)
)
}
}
@@ -67,6 +82,8 @@ class StatusSummaryView@JvmOverloads constructor(
MogoStatusManager.getInstance()
.registerStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this)
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
CallerAutopilotCarConfigListenerManager.addListener(TAG, this)
CallerCloudListenerManager.addListener(TAG, this)
}
private fun initView() {
@@ -81,9 +98,10 @@ class StatusSummaryView@JvmOverloads constructor(
it.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
it.addItemDecoration(
CommonDividerItemDecoration.Builder()
.spanCountTBCare(false)
.horizontalInnerSpace(10.PX)
.build())
.spanCountTBCare(false)
.horizontalInnerSpace(10.PX)
.build()
)
StatusSummaryAdapter(context, data).apply {
adapter = this
it.adapter = this
@@ -108,6 +126,8 @@ class StatusSummaryView@JvmOverloads constructor(
MogoStatusManager.getInstance()
.unregisterStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this)
CallerAutoPilotStatusListenerManager.removeListener(TAG)
CallerAutopilotCarConfigListenerManager.removeListener(TAG)
CallerCloudListenerManager.removeListener(TAG)
}
/**
@@ -168,30 +188,39 @@ class StatusSummaryView@JvmOverloads constructor(
AdasConstants.IpcConnectionStatus.DISCONNECTED -> {
pair = Pair("域控未连接", true)
}
AdasConstants.IpcConnectionStatus.CONNECTED -> {
pair = Pair("域控已连接", false)
}
AdasConstants.IpcConnectionStatus.CONNECTING -> {
pair = Pair("域控连接中", true)
}
AdasConstants.IpcConnectionStatus.RECONNECTING_TIMER, AdasConstants.IpcConnectionStatus.RECONNECTING_NETWORK -> {
pair = Pair("域控重连中", true)
}
AdasConstants.IpcConnectionStatus.CONNECT_EXCEPTION -> {
pair = Pair("域控连接异常", true)
}
AdasConstants.IpcConnectionStatus.ILLEGAL_ADDRESS -> {
pair = Pair("非法域控地址", true)
}
AdasConstants.IpcConnectionStatus.SEARCH_ADDRESS -> {
pair = Pair("正在搜索域控地址", true)
}
AdasConstants.IpcConnectionStatus.NOT_FOUND_ADDRESS -> {
pair = Pair("找不到可用的域控地址", true)
}
AdasConstants.IpcConnectionStatus.HEARTBEAT_TIMEOUT -> {
pair = Pair("域控心跳超时", true)
}
AdasConstants.IpcConnectionStatus.SERVER_DISCONNECTED -> {
pair = Pair("域控主动断开连接", true)
}
@@ -203,4 +232,41 @@ class StatusSummaryView@JvmOverloads constructor(
adapter?.notifyItemChanged(4)
}
}
override fun authCrtFile(device: String, root: String) {
super.authCrtFile(device, root)
UiThreadHandler.post {
if (data.size < 6) return@post
data[5].desc = "本机证书已下载"
data[5].isException = false
adapter?.notifyItemChanged(5)
}
}
override fun authCrtError(errorMsg: String) {
super.authCrtError(errorMsg)
UiThreadHandler.post {
if (data.size < 6) return@post
data[5].desc = "本机证书下载异常:$errorMsg"
data[5].isException = true
adapter?.notifyItemChanged(5)
}
}
override fun onCertificationResult(msg: String) {
super.onCertificationResult(msg)
if (!SharedPrefsMgr.getInstance().getBoolean(
"${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}",
MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE
)
) {
return
}
UiThreadHandler.post {
if (data.size < 6) return@post
data[5].desc = msg
data[5].isException = !msg.contains("成功校验")
adapter?.notifyItemChanged(5)
}
}
}

View File

@@ -119,7 +119,6 @@ class StatusBarView @JvmOverloads constructor(
private fun setTextColor(color: Int) {
viewTextClock.setTextColor(color)
viewStatusBarTag.setTextColor(color)
}
override fun onDetachedFromWindow() {

View File

@@ -8,19 +8,27 @@ import android.net.wifi.WifiManager
import android.os.Handler
import android.os.Message
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatImageView
import android.util.Log
import android.util.TypedValue
import android.view.LayoutInflater
import android.widget.ImageView
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener
import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import kotlinx.android.synthetic.main.view_wifi_state.view.viewStatusBarTag
import kotlinx.android.synthetic.main.view_wifi_state.view.viewWifiStateBg
import me.jessyan.autosize.utils.AutoSizeUtils
import java.lang.ref.WeakReference
import kotlin.properties.Delegates
class WifiStateView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : AppCompatImageView(context, attrs, defStyleAttr), IMoGoSkinModeChangeListener {
context: Context, attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs), IMoGoSkinModeChangeListener {
companion object {
const val TAG = "WifiStateView"
@@ -37,20 +45,46 @@ class WifiStateView @JvmOverloads constructor(
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
val view = stateViewWeakReference?.get()
view?.updateView(msg.what) {
view.setImageResource(it)
view?.updateLevel(msg.what)
}
}
}
private var wifiManager: WifiManager? = null
private var wifiHandler: WifiHandler? = null
private var level: Int by Delegates.observable(0) { _, o, n ->
if (o != n) {
UiThreadHandler.post {
updateView(n){
viewWifiStateBg.setImageResource(it)
}
}
}
}
private var wifiManager: WifiManager? = null
private var wifiHandler: WifiHandler? = null
private var wifiName: String by Delegates.observable("") { _, o, n ->
if (o != n) {
UiThreadHandler.post {
if(n.contains("unknow")){
viewStatusBarTag.text = ""
}else{
viewStatusBarTag.text = n
}
}
}
}
@Volatile
private var level: Int = 0
private val txtSize: Float
init {
LayoutInflater.from(context).inflate(R.layout.view_wifi_state, this, true)
val a = context.obtainStyledAttributes(attrs, R.styleable.WifiStateView, defStyleAttr, 0)
txtSize = a.getDimension(
R.styleable.WifiStateView_wifi_size,
resources.getDimension(R.dimen.dp_35)
)
a.recycle()
viewStatusBarTag.setTextSize(TypedValue.COMPLEX_UNIT_PX,AutoSizeUtils.dp2px(context,txtSize).toFloat())
wifiManager =
context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager?
wifiHandler = WifiHandler(this)
@@ -67,6 +101,8 @@ class WifiStateView @JvmOverloads constructor(
return
}
val wifiInfo = wifiManager!!.connectionInfo
wifiName = wifiInfo.ssid.replace("\"","")
Log.i("emArrow", "wifiName: $wifiName")
level = WifiManager.calculateSignalLevel(wifiInfo.rssi, 5)
wifiHandler?.sendEmptyMessage(level)
}
@@ -95,9 +131,25 @@ class WifiStateView @JvmOverloads constructor(
override fun onSkinModeChange(skinMode: Int) {
wifiHandler?.sendEmptyMessage(level)
UiThreadHandler.post {
when (skinMode) {
0 -> setStatusBarDarkOrLight(false)
1 -> setStatusBarDarkOrLight(true)
}
}
}
fun updateView(wifiState: Int, resId: ((Int) -> Unit)) {
private fun setStatusBarDarkOrLight(light: Boolean) = if (light) {
viewStatusBarTag.setTextColor(resources.getColor(R.color.color_2C2E30))
} else {
viewStatusBarTag.setTextColor(resources.getColor(R.color.color_FFFFFF))
}
fun updateLevel(wifiState: Int){
level = wifiState
}
private fun updateView(wifiState: Int, resId: ((Int) -> Unit)) {
when (FunctionBuildConfig.skinMode) {
0 -> {
when (wifiState) {
@@ -109,6 +161,7 @@ class WifiStateView @JvmOverloads constructor(
4 -> resId.invoke(R.drawable.wifi_light_state_five)
}
}
1 -> {
when (wifiState) {
-1 -> resId.invoke(R.drawable.wifi_dark_state_one)

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

View File

@@ -18,20 +18,9 @@
android:textSize="@dimen/dp_45"
android:textStyle="bold" />
<TextView
android:id="@+id/viewStatusBarTag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginStart="@dimen/dp_27"
android:gravity="center"
android:text="@string/status_bar_tag"
android:textColor="@color/color_2C2E30"
android:textSize="@dimen/dp_35" />
<!--Wifi状态-->
<com.mogo.eagle.core.function.hmi.ui.widget.WifiStateView
android:layout_width="@dimen/dp_54"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_54"
android:layout_gravity="center"
android:layout_marginStart="@dimen/dp_18" />

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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/viewStatusBarTag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_27"
android:gravity="center_vertical"
android:maxLength="15"
android:textColor="@color/color_2C2E30"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/viewWifiStateBg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@+id/viewStatusBarTag"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -89,6 +89,10 @@
<attr name="pnc_txt_style" format="reference"/>
</declare-styleable>
<declare-styleable name="WifiStateView">
<attr name="wifi_size" format="dimension"/>
</declare-styleable>
<style name="AudioFileInfoOverlayText">
<item name="android:shadowColor">#80000000</item>
<item name="android:shadowRadius">11</item>